根据 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 提出了一个后续问题:
我有一个运行 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 提出了一个后续问题: