ansible2---playbook

七种武器

1.第一种武器

ansible 命令,用于执行临时性的工作,必须掌握

2.第二种武器

ansible-doc是ansible模块的文档说明,针对每个模块都有详细的说明及应用案例介绍,功能和linux系统

man命令类似类似,必须掌握

3.第三种武器

ansible-console 是ansible为用户提供的交互式工具,用户可以在ansible-console虚拟出来的终端上像shell一样使用ansible

内置的各种命令,这为习惯使用shell交互式的用户提供了良好的使用体验

4.第四种武器

ansible-galaxy 从github上下载管理roles的一款工具,与python的pip类似

5.第五种武器

ansible-playbook是日常使用频率最高的命令,工作机制:通过读取编写好的playbook文件实现批量管理

可以理解为按一定条件组成的ansible任务急,必须掌握

6.第六种武器

ansible-vault 主要用于配置文件加密,如编写的playbook文件中包含敏感信息,不想其他人随意查看,可用它加密,解密这个文件

7.第七种武器 

ansible-pull

ansible有两种工作模式pull/push ,默认使用push模式工作,pull和push工作模式机制刚好相反

适用场景:有大批量机器需要配置,即便使用高并发线程依旧要花费很多时间

通常在配置大批量机器的场景下使用,灵活性有欠缺,效率几乎可以无线提升,对运维人员的技术水平和前瞻性

规划有较高要求

二.JSON简介

JSON是javascript对象表示法,它是一种基于文本独立于语言的轻量级数据交换格式

JSON中的分隔符限于单引号" ' ",小括号 (), 中括号 [], 大括号{}, 冒号 : , 逗号,

JSON特性

json 是纯文本

json具有自我描述性(人类可读)

Jason 具有层级结构(值中存在值)

jason可通过javascript进行解析

jason语法规则

数据在名称/值对中

属于由逗号分割

大括号保存对象(键值对{key: value}

中括号保存数组[123,abc,发]

jason数据的书写格式是:名称/值对

{"诗人":

[{"李白":"诗仙","年代":"唐"},

{"杜甫":"诗圣","年代":"唐"},

]

}

YAML简介

yaml是一个高可读性,用来表达数据序列的格式

YAML(YAML Ain't Markup Language)

YAML参考了多种语言,如C语言,Python,Perl等并从XML,电子邮件的数据格式中获得灵感,Clark Evans在2001年首次发表了这种语言,

目前已有数种编程语言或脚本语言支持这种语言.

YAML基础语法

yaml的结构通过空格来展示

数组使用"- "来表示(注意-后面有空格)

键值对使用": " 来表示(: 后面有空格)

YAML使用一个固定的缩进风格表示数据层级结构关系

一般每个缩进级别由两个以上空格组成

#表示注释

注意:

不要使用tab,缩进是初学者容易出错的地方之一

 同一层级缩进必须对齐

YAML写法

YAML的键值表示方法

采用冒号分割

:后必须有一个空格

YAML键值对例子

"诗人":

    -  "李白"

    - "杜甫"

    - "白居易"

"讲师"

  -

    "姓名": "nb"

    "阶段": "1.0"

    "喜好": "大铁锤"

  -

    "姓名": "wk"

    "阶段": "1.5"

    "喜好": "吃香蕉"

Jinja2过滤器 模板简介

Jinjia2是基于Python的模板引擎,包含变量和表达式两部分,两者在模板求职时会被替换为值,模板中还有标签,控制模板的逻辑

为什么要学习Jinjia2模板

因为playbook的模板使用Python的jinja2模块来处理

基本语法

模板的表达式都是包含在分隔符"{{  }}"内的

控制语句都是包含在分隔符"{% %}"内的

模板支持注释,都是包含在分隔符"{# #}"内,支持块注释

调用变量

{{ varname}}

计算

{{  2+3 }}

判断

{{1 in [123] }}

控制语句

{% if name == '诗仙' %}

  李白

{% elif name == '诗圣' %}

杜甫

{% endif %}}   #结束

playbook

概念:playbook是ansible用于配置,部署和管理托管主机剧本,通过playbook的详细描述,执行其中的一系列tasks,

可以让远程主机达到预期状态.

-也可以说,playbook字面意思既剧本,现实中由演员按剧本表演,在ansible中由计算机进行安装,部署应用,提供对外服务,

以及组织计算机处理各种各样的事情.

为什么使用playbook

执行一些简单的任务,使用ad-hoc命令可以方便解决问题,但有时一个设施过于复杂时,执行ad-hoc命令是不合适的,

最好使用playbook

 playbook可以反复使用编写的代码.可以放到不同的机器上面,像函数一样,最大化的利用代码,在使用ansible的过程中,

处理的大部分操作都是在编写playbook

playbook语法格式

playbook由YAML语言编写,遵循YAML标准

在同一行中,#之后的内容表示注释

同一个列表中的元素应该保持相同的缩进

play中的hosts,variables,roles,tasks等对象表示方法都是键值中间以"   :  "分隔表示

YAML还有一个小怪癖,它的文件开始行都应该是---,这是YAML格式的一部分,表明一个文件的开始

 

playbook构成

hosts :定义将要执行playbook的远程主机组

vars:定义playbook运行时需要使用的变量

tasks:定义将要在远程主机上执行的任务列表

handlers: 定义task执行完成以后需要调用的任务

playbook执行结果

使用ansible-playbook运行playbook文件,输出内容为JSON格式,由不同颜色组成便于识别

绿色代表执行成功

***代表系统状态发生改变

红色代表执行失败

 

例子:用playbook安装Apache,修改端口,配置ServerName,修改主页,设置开机自启

 ---
- hosts: web     #主机集合
  remote_user:  root
  tasks:     #命令集合
    - name:  install the latest version of Apache
      yum:
        name:  httpd
        state:  installed
    - service:
        name:  httpd
        enabled:  yes
        state:  restarted
    - copy:
        src:  /root/index.html
        dest:  /var/www/html/index.html
    - lineinfile:
        path:  /etc/httpd/conf/httpd.conf
        regexp:  '^Listen'
        line: 'Listen 8080'
playbook进阶

定义变量

---
- hosts: db
  vars:
    username: mountain
  remote_user: root
  name: "{{username}}"
  tasks:
    - name: create user "{{username}}"
      user:
        name: "{{username}}"
        group: users
    - name: set password
      shell: echo 123 | passwd --stdin "{{username}}"
                                               

方法1:

---
- hosts: db
  vars:
    username: plj
  remote_user: root
  tasks:
    - name: create user "{{username}}"
      user:
        password={{'123qqq...A'|password_hash('sha512')}}
        name={{username}}
ansible-playbook user.yaml

方法2: vim args.yaml

---
username: dd
pwd : "456"
执行添加用命令:  ]#ansible-playbook user.yaml -e @args.yaml

方法3:

ansible-playbook user.yaml -e '{"username":"wk"}'  #添加wk用户

error

ansible-playbook对错误的处理

默认判断情况$?,如果值不为0就停止执行

但某些情况我们需要忽略错误继续执行

例如 创建缓存目录,然后重启apache

vim erro.yml

  • ---
  • - hosts: web
  • remote_user: root
  • tasks:
  • - shell: mkdir /tmp/cache
  • - name: ReStart service httpd
  • service:
  • name: httpd
  • state: restarted
  • - name: run some command
  • shell: /usr/bin/somecommand
  • ignore_errors: True
ansible-playbook error.yml
tags给指定的任务定义一个调用标识
vim adhttp.yml

使用handlers来配置文件,重新载入配置文件让服务生效
---

- hosts: web
  remote_user: root
  tasks:
    - name: install the latest version of Apache
      yum:
        name: httpd
        state: installed
    - service:
        name: httpd
        enabled: yes
        state: restarted
    - copy:
        src: /root/index.html
        dest: /var/www/html/index.html
    - lineinfile:
        path: /etc/httpd/conf/httpd.conf
        regexp: '^Listen'
        line: 'Listen 8080'


when
有些时候需要在满足特定的条件后再触发某一项操作,或在特定的条件下终止某个行为,这个时候需要进行条件判断,
when正是解决这个问题的最佳选择,远程中的系统变量facts作为when的条件,可以通过setup模块查看
---
- hosts: web
  tasks:
    - name: show uptime info
      shell: uptime |awk '{printf("%.2f",$(NF-2))}'
      register: result
    - name: shutdown web server
      service:
        name: httpd
        state: stopped
      when: result.stdout|float > 0.7
    - name: show debug info
      debug: var=result
register
有时候我们还需要更复杂的例子,如判断前一个命令的执行结果去处理后面的操作,这时候就需要register模块
来保存前一个命令的返回状态,在后面进行调用
---
- hosts: web
  tasks:
    - name: show uptime info
      shell: uptime |awk '{printf("%.2f",$(NF-2))}'
      register: result
    - name: shutdown web server
      service:
        name: httpd
        state: stopped
      when: result.stdout|float > 0.7
    - name: show debug info
      debug: var=result

with_items
with_items是playbook标准循环,可以用于迭代一个列表或字典,通过{{item}}获取每次迭代的值

---
- hosts: db
  tasks:
    - name: adduser user "{{item.uname}}"
      user:
        name: "{{item.uname}}"
        group: "{{item.grp}}"
        password: "{{item.pwd|password_hash('sha512')}}"
      with_items:
        -
          uname: nb
          grp: users
          pwd: "124"
        -
          uname: wk
          grp: adm
          pwd: banana
        -
          uname: dd
          grp: daemon
          pwd: book
        -
          uname: jj
          grp: mysql
          pwd: 123qqq...A
        -
          uname: xx
          grp: root
          pwd: a
include and roles
在编写playbook的时候随着项目越来越大,playbook越来越复杂,修改也很麻烦.这时可以把一些play,task
或handler放到其他文件中,通过include指令包含进来是一个不错的选择                                                             
 debug
对于Python语法不熟悉的同学,playbook书写起来容易出错,且排错困难,这里介绍几个简单的排错调试方法
检测语法:
ansible-playbook --syntax-check playbook.yaml
测试运行
ansible-playbook -C playbook.yaml

 

 





















posted @ 2019-10-14 11:42  Jeff.zhao0302  阅读(189)  评论(0)    收藏  举报