我认为我对ansible中的rescue如何工作有一个很好的理解,看起来与其他语言中的try/catch/finaly非常相似,但是我没有从文档中得到一个具体的细节。
复制自:https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_blocks.html
如果块中发生错误并且救援任务成功,Ansible 将恢复原始任务运行的失败状态,并继续运行播放,就像原始任务已成功一样。被救援的任务被认为是成功的,并且不会触发 max_fail_percentage 或 any_errors_fatal 配置。然而,Ansible 仍然报告 playbook 统计失败。
我的问题是救援行动成功或失败时的行为。
假设我有一个带有救援部分的任务块,第一个任务失败并激活救援任务,救援任务成功。 根据上面的引用,我知道执行将在失败的任务之后继续执行,就像失败的任务成功一样。 这是正确的吗?
询问的原因是,这不是我测试它时发生的情况,而且我认为文档令人困惑。 了解救援成功/失败时发生的情况很重要,因为就我而言,我不希望救援导致其余任务执行。
令人困惑的部分是文档上下文中的任务是什么。查看 docs
中提供的示例 tasks:
- name: Handle the error
block:
- name: Print a message
ansible.builtin.debug:
msg: 'I execute normally'
- name: Force a failure
ansible.builtin.command: /bin/false
- name: Never print this
ansible.builtin.debug:
msg: 'I never execute, due to the above task failing, :-('
rescue:
- name: Print when errors
ansible.builtin.debug:
msg: 'I caught an error, can do stuff here to fix it, :-)'
在这里,在剧本级别,我们有一个单个任务,称为“处理错误”。如果救援块成功返回,则“处理错误”之后的任何潜在任务将继续执行,但错误后块内的所有内容都将被跳过。这就是 try/ except 块在编程语言中通常的工作方式,例如 python 文档 指定(重点是我的):
首先,执行 try 子句(try 和 except 关键字之间的语句)。
如果没有异常发生,则跳过 except 子句,结束 try 语句的执行。
如果在执行try子句期间发生异常,则该子句的其余部分将被跳过。然后,如果其类型与以 except 关键字命名的异常匹配,则执行 except 子句,然后在 try/ except 块之后继续执行。
这甚至暗示了 ansible 文档中块内的“从不打印此”子任务。