ansible-playbook

1. playbook基础语法
- 由ymal语言编写,遵循ymal标准
- 同一行中,#号之后的内容表示注释
- 同一列表中的元素应该保持相同的缩进
- playbook由一个或者多个play组成
- play中hosts、variables、roles、tasks等对象的表示方法都是键值中间以":"分隔表示
- 所有的ymal文件开头都是由---,这是ymal格式的一部分,表明一个文件的开始
2. playbook的构成
- targets:定义将要执行playbook的的远程主机组
- variables:定义执行playbook时需要使用的变量
- tasks:定义将要在远程主机上执行的任务列表
- handler:定义task执行完成以后需要调用的任务
- -f 并发进程数量,默认是5
- hosts 行的内容是一个或者多个组或者主机,以逗号分隔
- remote_user 就是账号名
- tasks 
    //每一个play包含了一个task列表(任务列表)
    //一个task在其所对应的主机上(通过host pattern匹配所有主机)执行完毕之后,下一个task才会执行,
    //在一个play中,所有hosts会获取相同的任务指令,这是play的一个目的所在,也就是将一组选出的hosts映射到task,执行相同的操作
3. playbook执行结果
- 使用ansible-playbook运行playbook文件,得到输出内容为json格式,并且由不同颜色组成,便于识别
## 一般而言:绿色代表执行成功;***代表系统状态发生改变;红色代表执行失败

安装httpd,修改默认首页,开启自启

---
- hosts: all
  remote_user: root
  tasks:
    - yum: name=httpd state=installed
    - replace: path=/etc/httpd/conf/httpd.conf regexp="(^Listen ).*" replace="1 8080"
    - shell: echo "123456">/var/www/html/index.html
    - service: name=httpd enabled=yes state=started
    - shell: netstat -utnlp
4. playbook语法进阶
  • 变量
---
- hosts: all
  remote_user: root
  vars:
    - name: wang5  //定义变量(测试这里name加-或者不加都可以执行成功)
  tasks:
    - user: name={{name}} group=wheel uid=2000   //引用变量要在{{ }}中
    - shell: echo 123456|passwd --stdin {{name}}
## 用user模块的password参数也可以给用户设置密码,但是需要使用过滤器加密一下才能使用
---
- hosts: all
  remote_user: root
  vars:
    - name: wang6
  tasks:
    - user:
        name: "{{name}}"
        group: wheel
        password: "{{'123456' | password_hash('sha512')}}"  //sha512是系统默认的加密方式,可以在/etc/login.dfs最后一行查看
## 使用password: 123456可以到/ect/passwd下查看密码是明文的是不能使用的,上述加密之后可以再查看passwd文件中该用户的密码就是加密的了
5. ansible-playbook对错误的处理
- 默认情况判断$?,如果值不为0,则停止执行;但是某些情况我们需要忽略错误继续执行
- 忽略错误的两种方式:
// 第一种 
shell: 执行的命令|| true   
// 第二种
shell: 执行的命令
ignore_errors: True
6. handlers触发器和notify动作

意思可以理解为,先定义handlers,然后使用notify: 调用handlers的name名字来做标记,最后执行一次handlers里的动作

  • -name先起一个名字
  • 模块 然后写执行的具体动作
- 用于当关注的资源发生变化时采取一定操作
- notify这个动作可用于在每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作,取而代之仅在所有的变化发生完成之后一次性的执行指定操作
- 在notify中列出的操作称为handler,也即notify中调用handler中定义的操作
---
- hosts: all
  remote_user: root
  tasks:
    - yum: name=httpd state=installed
    - replace: path=/etc/httpd/conf/httpd.conf regexp="(^Listen ).*" replace="1 8080"
    - shell: echo "123456">/var/www/html/index.html
      notify: restart_httpd   //调用下方handlers的名字
  handlers:
    - name: restart_httpd   //起名字
      service: name=httpd enabled=yes state=started 
## handlers可以在继续定义名字,然后起不同的模块写法是相同的
7. registrer 记录的意思,可以理解为接收返回的对象
  • 有时候我们需要判断前一个命令执行的结果,根据结果处理后边的操作,这时就需要register模块来保存前一个命令的返回状态,在后边进行调用
---
- hosts: all
  remote_user: root
  vars:
    - name: wang6
  tasks:
    - shell: id {{wang6}}
      register: result  //result可以自定义,不仅仅接收的是$?返回值,可以用result.stdout调用标准输出的值
8. when判断
  • 某些时候我们需要在满足特定条件后再触发某一项操作,或在特定条件下终止某个行为,这个时候就需要条件判断,远程中系统变量facts变量作为when的条件,这些facts可以通过setup模块查看
---
- hosts: all
  remote_user: root
  vars:
    - name: wang7
  tasks:
    - shell: id {{name}}
      ignore_errors: true   //不存在会报错,就不会往下执行了,这里忽略错误
      register: result    //result接收对象
    - shell: useradd {{name}}
      when: result.stdout != 0   //当不等于0时,也就是用户不存在,就创建用户
9. with_items 标准循环
  • 是playbook的标准循环,用与迭代一个字典或者列表,通过{{item}}获得每次迭代的值
- 创建多用户
---
- hosts: all
  remote_user: root
  tasks:
    - shell: useradd {{item}}   
      with_items: ["lisi1","lisi2","lisi3","lisi4"]  //循环列表,列表元素用逗号隔开
- 创建多用户,并且用户有不同的属性
---
- hosts: all
  remote_user: root
  tasks:
    - user: name={{item.name}} group={{item.group}} password={{'123456'|password_hash("sha512")}}
      with_items:
         - {name: "li1",group: 'root'}
         - {name: "li2",group: 'root'}
         - {name: "li3",group: 'wheel'}
         - {name: "li4",group: 'wheel'}
10. with_nested 嵌套循环
---
- hosts: all
  remote_user: root
  vars:
    un: [1,2,3]
    id: [a,b,c]
  tasks:
    - shell: echo {{item}}
      with_nested :
        - "{{un}}"
        - "{{id}}"
11. tags给指定任务定义一个调用标识
12. include和roles
include 引用文件
roles 引用项目
13.debug 调试
- 检测语法: --syntax-check
- 测试运行: -C  //大写C
- 显示受到影响的主机: --list-hosts
- 显示工作的task: --list-tasks
- 显示将要运行的tags: --list-tags
When nothing seems to help, I go look at a stonecutter hammering away at his rock, perhaps a hundred times without as much as a crack showing in it. Yet at the hundred and first blow it will split in two, and I know it was not that blow that did it, but all that had gone before. -- Jacob Riis
原文地址:https://www.cnblogs.com/xhwy-1234/p/12163830.html