ignore_errors忽略错误

ansible的错误处理机制

  • 和python一样,程序自上而下运行,默认情况下,ansible在遇到错误时会立刻停止playbook,后续所有的任务都不会再执行

单任务忽略错误

  • 使用ignore_errors可以忽略错误,继续后续的任务
---
- name: 单任务error处理演示剧本
  hosts: all
  tasks:
    - name: 开启一个不存在的服务
      service: 
      	# 没有这个服务名
        name: noname
        state: started
      # 针对这个tasks忽略错误,不停止后续任务
      ignores_errors: true
    
    - name: 创建一个文件
      file:
        path: /tmp/service.txt
        state: touch
  • 执行结果显示忽略了这个tasks的错误
ansible-playbook error.yml

在这里插入图片描述


全局忽略错误

单任务忽略错误,只能忽略一个任务的错误,全局忽略错误,不论哪一步出现错误都会忽略错误并继续执行脚本。

---
- name: 全局error处理演示剧本
  hosts: all
  # 全局忽略错误,所有tasks都不会报错
  ignore_errors: yes
  tasks:
    - name: 开启一个不存在的服务
      service: 
        # 不存在的服务
        name: noname
        state: started
      
    - name: 创建一个文件
      file:
        path: /tmp/service.txt
        state: touch

错误控制和handlers的结合

  • fore_handlers: yes 参数在生产环境中是必加的
  • 使用该配置,即使后续任务失败,也强制执行已触发的 handlers
  • fore_handlers只有当paly中的所有tasks都运行正确,在程序结束时才会通知执行handlers,如果play运行中遇到了错误,handlers不会被通知执行
---
- name: 错误控制和 handlers 的结合
  hosts: all
  # 默认情况下,如果 playbook 中有任务失败,Ansible 会跳过所有 pending 的 handlers
  # !!!关键配置:即使后续任务失败,也强制执行已触发的 handlers
  # 启用此选项可确保关键操作(如服务重启)即使在出错后仍能执行
  force_handlers: yes

  tasks:
    - name: 一个绝对成功的任务
      command: /bin/true
      # 此任务总是成功,并触发 "restart the database" handler
      notify: restart the database

    - name: 一个绝对失败的任务
      yum:
        name: notpkg
        state: latest
      # 此任务会因软件包不存在而失败,导致整个 play 中断

  handlers:
    # 即使前面的任务失败,由于设置了 force_handlers: yes,
    # 此 handler 仍会在任务失败前被 Ansible 执行(在所有 tasks 尝试完成后)
    - name: restart the database
      service:
        name: database
        state: restarted
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐