linux学习

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 

留言

您的邮箱地址不会被公开。 必填项已用 * 标注