根据 shell 输出终止 ansible 剧本

Terminate ansible playbook based on shell output

我有一个运行 shell 命令的 ansible 剧本。如果输出中有特定消息,我需要终止剧本。这是我尝试过的:

- name : Do foo
  shell: /bin/my_application arg1 arg2 arg3
  args:
    creates: /tmp/foo_1
  with_items: data_items
  register: foo_result

- debug: var=foo_result

- debug: var=foo_result
  when:
    - foo_result.results is defined
    - '"[Foo Bar Baz] Err Code abc123" in foo_result.results.stdout'
  failed_when: true

这里的意图是if'[Foo Bar Baz] Err Code abc123"'出现在程序的输出中,我想打印full 输出(其中包含非常有用的信息,但是有 lot 的信息所以我不想打印它 all 的时间)然后中止剧本。

不幸的是,这不太奏效。

第一个调试语句打印出类似这样的内容:

TASK: [do_stuff | debug var=foo_result] **************************** 
ok: [some-node] => {
    "foo_result": {
        "changed": true, 
        "msg": "All items completed", 
        "results": [
            {
                "changed": true, 
[Snip..]
                "stderr": "", 
                "stdout": "Very large stack trace containing [Foo Bar Baz] Err Code abc123"
            }
        ]
    }
}

所以,我知道我感兴趣的错误消息 stdout 中的

但是第二个打印这个:

TASK: [do_stuff | debug var=foo_result] **************************** 
fatal: [some-node] => error while evaluating conditional: "[Foo Bar Baz] Err Code abc123" in foo_result.results.stdout

我也尝试过使用 foo_result.stdout,并且还在条件中将 [] 转义为 \[\],并且我已经尝试测试 foo.results.stdout is defined,但我不确定为什么我会收到所有这些排列的条件评估错误。我本以为会出现语法错误或其他问题......是否有更好的方法来完成我在这里尝试做的事情(当命令的标准输出中有特定文本然后打印该标准输出时失败)?

(Ansible版本是1.6.10)

您只需更改第三个任务:

- debug: var=foo_result
  failed_when: "'[Foo Bar Baz] Err Code abc123' in foo_result.stdout"

适用于 ansible 1.8.4!

看来我在任务 yml 文件中有某种语法错误,但没有报告为 "syntax error"。

问题好像是我是如何"and"-ing 条件的。我以为我可以单独列出它们,但似乎不是这样。

这个任务:

- debug: var=foo_result
  when:
    - foo_result.results is defined and "[Foo Bar Baz] Err Code abc123" in foo_result

没有给我任何错误。 Ansible 不会在此代码上返回错误,但条件始终计算为 "true"。但是,我认为这是一个不同的问题,我将 post 为此提出一个新问题。


我在这里 post 提出了一个后续问题: