Ansible 条件总是评估为 false
Ansible condition always evaluates to false
我正在尝试检查 shell 命令的输出以查找指示错误的特定字符串,并且应该终止剧本。
我正在尝试像这样调试它:
- debug: var=foo_result
- debug: msg={{ 'Some error text' in foo_result }}
在此示例中,install_result
被注册为包含命令的输出,并且它确实:
TASK: [do_stuff | debug var=foo_result] ****************************
ok: [some-node] => {
"foo_result": {
"changed": true,
"msg": "All items completed",
"results": [
{
"changed": true,
[Snip..]
"stderr": "",
"stdout": "...Some error text..."
}
]
}
}
第二个调试语句,它检查 foo_result
中的 "some error text",结果总是 "false"。
我仍然觉得 Ansible 语法有点混乱,我不确定我在这里做错了什么。
Ansible 版本:1.6.10
你快搞定了。您想要测试 foo_result.results.stdout 中的输出,而不仅仅是 foo_result 中的输出。来自这个例子:
- debug: var=foo_result
- debug: msg={{ 'Some error text' in foo_result }}
- debug: msg={{ 'Some error text' in foo_result.results.stdout }}
我们得到以下输出(我是 运行 版本 1.7.2):
TASK: [debug var=foo_result] **************************************************
ok: [localhost] => {
"foo_result": {
"changed": "true",
"msg": "all items completed",
"results": {
"changed": "true",
"stderr": "",
"stdout": ".... Some error text ..."
}
}
}
TASK: [debug msg=False] *******************************************************
ok: [localhost] => {
"msg": "False"
}
TASK: [debug msg=True] ********************************************************
ok: [localhost] => {
"msg": "True"
}
Ansible 很奇怪。也许我只是不 "getting" 它...
注意在原始输出中,foo_install.results
包含一个只有一个元素的数组。如果你想调试或测试 stdout
文本,你可以这样做:
- debug: msg={{ 'My Error' in foo_result.results[0].stdout }}
when: foo_result.changed
注意我必须添加数组索引符号才能正确打印 "true"。
但是如果我这样做:
- name: Do Foo Stuff
shell: /some/path/to/some/command
register: foo_result
failed_when: "'My Error' in foo_result.stdout"
我不需要参考 results[0]
。我不知道这种差异是怎么回事。我不知道为什么访问 foo_result
如果我从注册它的同一个任务访问它与另一个不同的任务访问它似乎工作不同。
也许这在较新的版本中已修复,但这是我需要做的才能在 1.6.10 中正常工作
我正在尝试检查 shell 命令的输出以查找指示错误的特定字符串,并且应该终止剧本。
我正在尝试像这样调试它:
- debug: var=foo_result
- debug: msg={{ 'Some error text' in foo_result }}
在此示例中,install_result
被注册为包含命令的输出,并且它确实:
TASK: [do_stuff | debug var=foo_result] ****************************
ok: [some-node] => {
"foo_result": {
"changed": true,
"msg": "All items completed",
"results": [
{
"changed": true,
[Snip..]
"stderr": "",
"stdout": "...Some error text..."
}
]
}
}
第二个调试语句,它检查 foo_result
中的 "some error text",结果总是 "false"。
我仍然觉得 Ansible 语法有点混乱,我不确定我在这里做错了什么。
Ansible 版本:1.6.10
你快搞定了。您想要测试 foo_result.results.stdout 中的输出,而不仅仅是 foo_result 中的输出。来自这个例子:
- debug: var=foo_result
- debug: msg={{ 'Some error text' in foo_result }}
- debug: msg={{ 'Some error text' in foo_result.results.stdout }}
我们得到以下输出(我是 运行 版本 1.7.2):
TASK: [debug var=foo_result] **************************************************
ok: [localhost] => {
"foo_result": {
"changed": "true",
"msg": "all items completed",
"results": {
"changed": "true",
"stderr": "",
"stdout": ".... Some error text ..."
}
}
}
TASK: [debug msg=False] *******************************************************
ok: [localhost] => {
"msg": "False"
}
TASK: [debug msg=True] ********************************************************
ok: [localhost] => {
"msg": "True"
}
Ansible 很奇怪。也许我只是不 "getting" 它...
注意在原始输出中,foo_install.results
包含一个只有一个元素的数组。如果你想调试或测试 stdout
文本,你可以这样做:
- debug: msg={{ 'My Error' in foo_result.results[0].stdout }}
when: foo_result.changed
注意我必须添加数组索引符号才能正确打印 "true"。
但是如果我这样做:
- name: Do Foo Stuff
shell: /some/path/to/some/command
register: foo_result
failed_when: "'My Error' in foo_result.stdout"
我不需要参考 results[0]
。我不知道这种差异是怎么回事。我不知道为什么访问 foo_result
如果我从注册它的同一个任务访问它与另一个不同的任务访问它似乎工作不同。
也许这在较新的版本中已修复,但这是我需要做的才能在 1.6.10 中正常工作