我有一个运行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)
答案 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