Ansible忽略任务中的错误,如果任何任务有错误,则在剧本结束时失败

时间:2016-08-10 14:38:04

标签: ansible ansible-playbook

我正在学习Ansible。我有一个清理资源的剧本,我希望剧本忽略每一个错误并一直持续到最后,如果有错误则最后失败。

我可以用

忽略错误
  ignore_errors: yes

如果是一项任务,我可以做一些事情(来自ansible错误捕获)

- name: this command prints FAILED when it fails
  command: /usr/bin/example-command -x -y -z
  register: command_result
  ignore_errors: True

- name: fail the play if the previous command did not succeed
  fail: msg="the command failed"
  when: "'FAILED' in command_result.stderr"

我最终如何失败?我有几个任务,我的"当"条件是?

3 个答案:

答案 0 :(得分:21)

使用Fail模块。

  1. 对于发生错误时需要忽略的每个任务,使用ignore_errors。
  2. 在任何任务执行失败时设置标志(例如,result = false)
  3. 在剧本的最后,检查是否设置了标志,并且根据该标志,执行失败
  4. - fail: msg="The execution has failed because of errors."
      when: flag == "failed"
    

    更新:

    使用register存储您在示例中显示的任务结果。然后,使用这样的任务:

    - name: Set flag
      set_fact: flag = failed
      when: "'FAILED' in command_result.stderr"
    

答案 1 :(得分:13)

您可以在块中包装所有可能失败的任务,并对该块使用ignore_errors: yes

tasks:
  - name: ls
    command: ls -la
  - name: pwd
    command: pwd

  - block:
    - name: ls non-existing txt file
      command: ls -la no_file.txt
    - name: ls non-existing pic
      command: ls -la no_pic.jpg
    ignore_errors: yes 

详细了解块here中的错误处理。

答案 2 :(得分:1)

失败模块效果很好!感谢。

我必须在检查之前定义我的事实,否则我会得到一个未定义的变量错误。

在使用引号设置事实并且没有空格时我遇到了问题。

这有效:

set_fact: flag="failed"

这引发了错误:

set_fact: flag = failed