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