Ansible 剧本的流程控制通过任务的顺序执行、条件语句(when)、循环(with_items 等)、错误处理(ignore_errors 和 block)、以及任务标签和角色来实现。可以根据条件动态控制任务执行,使用循环处理重复操作,通过块和故障恢复机制确保任务的容错性,并通过标签灵活选择任务的执行范围
handler触发器
触发条件 :Handler 只有在某个任务被标记为 changed
(即执行过程中发生了变化)时才会执行。这意味着,只有当某个任务发生了更改(如文件变更、配置修改等),才会触发相关的 Handler 任务。
执行顺序:Handler 通常在 playbook 的最后执行,它们会被挂起,直到 playbook 中的其他任务发生变化并触发它们。
- 应用场景:一般用于分发配置文件,重启服务
- 例如:配置文件一旦有了变化,就立刻重启服务
- 语法:notyfy 和 handerls
1.编写一个yaml,分发文件和重启服务。只有当文件发生改变时,服务才会重启
yaml
- hosts: nfs
tasks:
- name: 分发配置文件
copy:
src: exports
dest: /etc
- name: 重启服务
systemd:
name: nfs
state: reloaded
2.在执行了2次后,文件不再发送改变,但是服务依然重启了
3.增加触发器,让文件传输成功后才会触发服务重启
yaml
[root@gitlabansible]# cat 08-触发器.yaml
- hosts: web
gather_facts: false
tasks:
- name: 分发配置文件
copy:
src: /test/ansible/file/exports
dest: /etc
backup: false
notify: restart_NFS
# 注意notify用的名字要和handlers一致
handlers:
- name: restart_NFS
systemd:
name: nfs
state: restarted
4.增加触发器后的运行结果,没有任何变化。文件没有传输,自然服务也就不会重启。避免了没必要的重启。
如果设置了备份,备份后的文件名是:/etc/exports.3391.202-0X-12@22:09:29~
wen判断
- 通常用于满足了条件再运行
判断facts变量案例
1.要求CentOS系统安装sl,Ubuntu安装cmatrix。判断faxts变量中的id即可实现。
yaml
- hosts: all
tasks:
- name: CentOS安装sl
yum:
name: sl
state: present
when: ansible_distribution == "CentOS"
- name: Ubuntu安装cmatrix
yum:
name: cmatrix
state: present
when: ansible_distribution == "Ubuntu"
可以看到图中出现了一种蓝色状态skipping,表示跳过。nfs服务器属于Centos,不在安装cmatrix的范围。
案例:配置文件错误则不重启
1.需求:管理端传输nginx配置文件。若nginx配置文件正确,则重启nginx;若错误,则不重启nginx。
- handlers触发器:什么时候重启?
- when判断:正确还是错误?
- 判断的是ngin -t的结果
1.实现:判断 nginx 返回的状态码是否为0。如果为0就重启nginx
yaml
- hosts: web
gather_facts: false
tasks:
- name: 分发nginx.conf
copy:
src: /test/ansible/file/test.conf
dest: /etc/nginx/conf.d/test.conf
backup: false
- name: 检测nginx -t
shell: nginx -t
register: result
ignore_errors: true
- name: 打印出nginx result
debug:
msg: "nginx: {{ result.stdout }}"
- name: 是否重启nginx
systemd:
name: nginx
state: restarted
when: result.rc == 0
2.当nginx配置错误的情况下:
3.当nginx配置文件正确的情况下:
when的字符正则
match语法 | |
---|---|
is match | 匹配 |
is not match | 排除 |
bl.rc | return code |
其他判断符号 | |
!= | 不等于 |
在判断Ubuntu中,改为:when: ansible_distribution is match (".*buntu")
,也能安装cmatrix
判断总结
when判断 | 示例 |
---|---|
== | |
is match | |
is search | 搜索查找 |
or | |
!= | |
&& | when: ansible_distribution is match (".*buntu") and ansible_hostname is match (".*sk") |
ansible中的循环
- 批量创建文件,批量添加用户,批量启动或重启服务
- item:作为内置变量,不能随意更改
1.案例,使用循环重启nfs和rpcbind
yaml
- hosts: web
gather_facts: false
tasks:
- name: 批量重启服务
systemd:
name: '{{ item }}'
state: restarted
enabled: yes
with_items:
- rpcbind
- nfs
启动顺序:在上面的先启动
执行结果如下:
bash
[root@gitlabansible]# ansible-playbook -i hosts 07-item循环重启服务.yaml
PLAY [web] *******************************************************************************************************
TASK [批量重启服务] ****************************************************************************************************
changed: [10.0.0.62] => (item=rpcbind)
changed: [10.0.0.62] => (item=nfs)
PLAY RECAP *******************************************************************************************************
10.0.0.62 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
2.案例,使用 loop 循环批量创建用户
yaml
- hosts: web
gather_facts: false
tasks:
- name: create user
user:
name: '{{ item.name }}'
uid: '{{ item.uid }}'
state: present
loop:
- { name: 'user1', uid: '2001' }
- { name: 'user2', uid: '2002' }
- { name: 'user3', uid: '2003' }
❗️创建出来的用户在CentOS上解释器是/bin/bash,Ubuntu却是/bin/dash;最好指定解释器。
yaml
cat 04-items-批量创建用户.yaml <<EOF
- hosts: web
gather_facts: false
tasks:
- name: 01 create directory
file:
path: "{{ item }}"
state: directory
loop:
- /tmp/test01
- /tmp/test02
- /tmp/test03
- /tmp/tmp01
- /tmp/tmp02
- /tmp/tmp03
EOF
3.案例,变量创建文件,并设施不同的权限
yaml
tags标签
作用
- 用处:在调试剧本时,可以运行自定义的步骤
- 语法:卸载tasks下面
tags选项 | |
---|---|
step1,step2 | 执行多个标签 |
--skip-tags | 排除标签 |
1.给分发配置文件的步骤打上标签
yaml
- hosts: web
gather_facts: false
tasks:
- name: 分发nginx.conf
copy:
src: /test/ansible/file/test.conf
dest: /etc/nginx/conf.d/test.conf
backup: false
tags:
- 01-file
- name: 检测nginx -t
shell: nginx -t
register: result
ignore_errors: true
- name: 打印出nginx result
debug:
msg: "nginx: {{ result.stdout }}"
ignore_errors: true
- name: 是否重启nginx
systemd:
name: nginx
state: restarted
when: result.rc == 0
- name: restart nfs
systemd:
name: nfs
state: restarted
2.执行带有标签的步骤,这样就不会执行 nfs、nginx 重启了
指定调式位置
ansible的playbook,有一些任务,在运行中出错了,有什么办法从失败的位置开始吗?
这个可以使用tag的方式,将之后的都打上tag,执行的时候加上 -t 标签。只执行打标签的任务,也可以-skip-tags,执行这个标签之外的任务
ansible的剧本调试
命令 | |
---|---|
ansible-playbook -C |
模拟运行 |
ansible-playbook --syntax-check |
语法检测,不模拟运行 |
ignore_erros忽略错误
- 用途:忽略剧本运行时的非语法错误,例如要安装的软件找不到...
- 语法:ignore_erros: true/false
yaml
- hosts: nfs
tasks:
- name: 01下载nfs
yum:
name: abcde,aabbcc
state: installed
tags:
- 01.install
ignore_errors: yes
| `ansible-playbook --syntax-check` | 语法检测,不模拟运行 |
## ignore_erros忽略错误
- 用途:忽略剧本运行时的非语法错误,例如要安装的软件找不到...
- 语法:**ignore_erros: true/false**
```yaml
- hosts: nfs
tasks:
- name: 01下载nfs
yum:
name: abcde,aabbcc
state: installed
tags:
- 01.install
ignore_errors: yes