根据shell输出终止ansible playbook

时间:2015-03-04 22:56:25

标签: ansible ansible-playbook

我有一个运行shell命令的ansible playbook。如果输出中有特定的消息,我需要终止播放本。以下是我尝试过的内容:

- 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"'出现在程序的输出中,我想打印完整的输出(其中包含非常有用的信息,但是有一个很多的信息,所以我不知道想要打印所有的时间),然后中止剧本。

不幸的是,这并不是很有效。

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

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进行测试,而且我不确定为什么我会为所有这些排列获得此条件评估错误。我本来期望语法错误或其他东西......有没有更好的方法来做我在这里尝试做的事情(当命令' s stdout中有特定文本然后打印时失败那个stdout)?

(Ansible版本为1.6.10)

2 个答案:

答案 0 :(得分:1)

您只需要更改第三项任务:

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

使用ansible 1.8.4为我工作!

答案 1 :(得分:0)

看起来我在任务yml文件中遇到了某种语法错误,但它们没有被报告为“语法错误”。

问题似乎是我“和”条件。我以为我可以单独列出它们,但似乎并非如此。

这个任务:

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

不给我任何错误。 Ansible没有在此代码上返回错误,但条件总是评估为“true”。但是,我认为这是一个不同的问题,我将为此发布一个新问题。


我在这里发布了一个跟进问题:Ansible condition always evaluates to false