澄清ansible救援及其如何继续执行任务

问题描述 投票:0回答:1

我认为我对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 统计失败。

我的问题是救援行动成功或失败时的行为。

假设我有一个带有救援部分的任务块,第一个任务失败并激活救援任务,救援任务成功。 根据上面的引用,我知道执行将在失败的任务之后继续执行,就像失败的任务成功一样。 这是正确的吗?

询问的原因是,这不是我测试它时发生的情况,而且我认为文档令人困惑。 了解救援成功/失败时发生的情况很重要,因为就我而言,我不希望救援导致其余任务执行。

ansible
1个回答
0
投票

令人困惑的部分是文档上下文中的任务是什么。查看 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 文档中块内的“从不打印此”子任务。

© www.soinside.com 2019 - 2024. All rights reserved.