在Ansible中区分Ansible错误和任务错误?

在Ansible中区分Ansible错误和任务错误?,ansible,ansible-2.x,Ansible,Ansible 2.x,我试图在ansible剧本中运行命令任务,如果失败,我想运行营救部分。如果命令失败(exit status!=0),并且stderr输出不包含特定字符串,我希望失败状态是这样的 - block: - name: some command command: "command {{ my_var }}" register: command_status failed_when: command_status.rc != 0 and "Some text"

我试图在ansible剧本中运行命令任务,如果失败,我想运行营救部分。如果命令失败(exit status!=0),并且stderr输出不包含特定字符串,我希望失败状态是这样的

- block:
    - name: some command
      command: "command {{ my_var }}"
      register: command_status
      failed_when: command_status.rc != 0 and "Some text" not in command_status.stderr 
      changed_when: false
  rescue:
    - name: error occurred. Rolling back
      command: rescue-command
上面的问题是,如果上面没有定义变量
my_var
,则命令将失败(对于类似
的消息,字段“args”有一个无效值,该值似乎包含一个未定义的变量
,救援部分将运行,这是不需要的。考虑到Ansible的特定错误与来自游戏中实际命令的错误,有没有办法避免Ansible

我有点希望
rc
返回值仅特定于命令,但事实似乎并非如此


我运行的Ansible 2.3并没有直接区分错误的来源,而是针对您的用例进行了更多的修改:

您可以在rescue部分添加对
command\u status.cmd
的检查。如果模块失败,将不会定义变量
command\u status.cmd
,因此rescue任务将不会运行:

- block:
    - name: some command
      command: "command {{ my_var }}"
      register: command_status
      failed_when: command_status.rc != 0 and "Some text" not in command_status.stderr 
      changed_when: false
  rescue:
    - name: error occurred. Rolling back
      command: rescue-command
      when: command_status.cmd is not defined

如果出现意外错误,我会用显式的
fail
扩展@techraf的答案,否则Ansible将继续执行任务,就好像没有发生什么不好的事情一样

- block:
    - name: some command
      command: "command {{ my_var }}"
      register: command_status
      failed_when: command_status.rc != 0 and "Some text" not in command_status.stderr 
      changed_when: false
  rescue:
    - fail:
        msg: Unexpected error occurred "{{ command_status.msg }}"
      when: command_status.failed_when_result is undefined

    - name: Expected error occurred. Rolling back
      command: rescue-command

如果错误是意外的(因为定义了结果时
失败了,如果任务完成时
失败了),以及如果错误是预期的,则主机将失败(命令失败,因为
失败\u当
语句时,将应用rescue命令。

谢谢。我会尝试一下,但我已经四处查看了,找不到任何关于此的文档。您可以详细了解此返回值是如何设置的吗?关于什么的文档?抱歉,按注释按钮太快。文档在.cmd返回值上。找不到包含正在执行的命令的任何位置-如果任务因变量未定义而失败,则为空。只需使用
debug
module显示值并亲自查看即可。效果非常好。谢谢,尽管条件应已反转,这意味着要运行rescue部分当.cmd被定义为我希望它在命令失败时运行,而不是在ansible失败时运行。根据我的经验,如果发生错误,rescue部分只允许您在命令完全失败之前运行命令,因此我不确定您的意思。我的经验完全不同。如果块的rescue部分中的最后一个任务是
ok
,将执行相关块之后的任务。