Ansible 中 error 处理机制
error处理机制介绍
当Playbook中包含很多任务时,某一个任务遇到错误,它将崩溃,终止执行。默认Ansible在遇到error会立刻停止playbook。
在webservers组中的主机上启动mysqld服务,然后创建/tmp/service.txt,代码示意如下:
# 编写playbook
[root@pubserver ansible]# vim myer.yml
---
- name: my errors
hosts: webservers
tasks:
- name: start mysqld service
service: # 调用插件开始mysqld服务
name: mysqld
state: started
enabled: yes
- name: touch a file
file:
path: /tmp/services.txt
state: touch
[root@pubserver ansible]# ansible-playbook myer.yml
.......
fatal: [web2]: FAILED! => {"changed": false, "msg": "Could not find the requested service mysqld: host"}
fatal: [web1]: FAILED! => {"changed": false, "msg": "Could not find the requested service mysqld: host"}
.......
因为目标主机上没有mysqld服务,所以执行playbook的第1个任务就会失败。到node1上查看,因为第2个任务没有执行,所以文件/tmp/service.txt不会创建,代码示意如下:
[root@web1 ~]# ls /tmp/service.txt
ls: cannot access '/tmp/service.txt': No such file or directory
重点:可以使用ignore_errors可以忽略错误,继续后续的任务。
局部设置
局部设置:指定某一个任务如果出现错误,则忽略它(定义在tests级别处)。
如果myslqd服务无法启动,则忽略它,代码示意如下:
[root@pubserver ansible]# vim myer.yml
---
- name: my errors
hosts: webservers
tasks:
- name: start mysqld service
service:
name: mysqld
state: started
enabled: yes
ignore_errors: yes # 任务失败也会继续执行下去
- name: touch a file
file:
path: /tmp/services.txt
state: touch
[root@pubserver ansible]# ansible-playbook myer.yml
PLAY [my errors] **********************************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************************************
ok: [web2]
ok: [web1]
TASK [start mysqld service] ***********************************************************************************************************************
fatal: [web1]: FAILED! => {"changed": false, "msg": "Could not find the requested service mysqld: host"}
...ignoring
fatal: [web2]: FAILED! => {"changed": false, "msg": "Could not find the requested service mysqld: host"}
...ignoring
TASK [touch a file] *******************************************************************************************************************************
changed: [web2]
changed: [web1]
PLAY RECAP ****************************************************************************************************************************************
web1 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1
web2 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1
# 使用ignore_errors后,第二个任务执行
[root@web1 ~]# ls /tmp/services.txt
/tmp/services.txt
全局设置
全局设置:无论哪个任务出现问题,都要忽略(定义在play级别处)。
代码示意如下:
[root@pubserver ansible]# vim myer.yml
---
- name: my errors
hosts: webservers
ignore_errors: yes # 在play级别定义,全局设置,对所有任务都生效
tasks:
- name: start mysqld service
service:
name: mysqld
state: started
enabled: yes
# ignore_errors: yes # 任务失败也会继续执行下去
- name: touch a file
file:
path: /tmp/services.txt
state: touch
[root@pubserver ansible]# ansible-playbook myer.yml
PLAY [my errors] **********************************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************************************
ok: [web1]
ok: [web2]
TASK [start mysqld service] ***********************************************************************************************************************
fatal: [web2]: FAILED! => {"changed": false, "msg": "Could not find the requested service mysqld: host"}
...ignoring
fatal: [web1]: FAILED! => {"changed": false, "msg": "Could not find the requested service mysqld: host"}
...ignoring
TASK [touch a file] *******************************************************************************************************************************
changed: [web2]
changed: [web1]
PLAY RECAP ****************************************************************************************************************************************
web1 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1
web2 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1