我知道这个ignore_errors: yes
标志,可以忽略剧本运行期间的失败,但我想知道 Ansible 中是否有我可以设置的东西,这不是“忽略行为”,但仍然运行剧本直到结束。那是因为我想要更好的报告控制。
为了说明这一点,目前这是我的“运行回顾”:
PLAY RECAP *******************************************************************************************************************************************************************************************
<server> : ok=195 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 **ignored=10**
“ignored=10”实际上是“失败的检查”我需要的是这样的重述:
PLAY RECAP *******************************************************************************************************************************************************************************************
<server> : ok=195 changed=0 unreachable=0 **failed=10** skipped=0 rescued=0 ignored=0
答案1
关于你的问题
如果 Ansible 中有任何我可以设置的内容,那不是“忽略行为”,而是仍然运行剧本直到结束。
你可以看看playbook 中的错误处理和失败的定义作为
Ansible 允许您使用条件定义每个任务中“失败”的含义
failed_when
。
还有block
使用s处理错误。
答案2
您可以使用的一种策略是忽略错误,但将失败条件存储在变量中,并将该变量的状态断言为剧本中的最后一个任务。那样:
- 无论是否失败,您的所有任务都将被尝试
- 如果您的任何任务失败,整个剧本都会失败,因此您将在最后的报告中看到成功或失败,并且如果需要,可以使用命令的返回代码
- 默认情况下,任务失败会以红色突出显示,即使它们被忽略,因此它们的消息很容易在 playbook 输出中找到。
- 这也适用于循环,因为注册的输出有自己的
failed
属性来标记是否有任何循环项失败。
例如:
- set_fact:
global_fail: false
- name: Assert the state of something
ansible.builtin.assert:
that:
- <condition you want to assert>
success_msg: ...
fail_msg: ...
register: assert_task
ignore_errors: true
- set_fact:
global_fail: "{{ global_fail or (assert_task.failed is defined and assert_task.failed) }}"
<Further tasks here>
- name: Assert that no tasks failed
ansible.builtin.assert:
that:
- not global_fail
success_msg: "All tasks succeeded"
fail_msg: "One or more tasks failed"