我正在使用特定于软件包的命令,其中没有现有模块。命令的输出(stdout)是0或1.我正在尝试将stdout的值赋给变量以供稍后在playbook中使用。但是,我似乎无法隔离明显被捕获的标准输出。
ok: [hostname1] => {
"dmstate": {
"changed": true,
"msg": "All items completed",
"results": [
{
"_ansible_item_result": true,
"_ansible_no_log": false,
"_ansible_parsed": true,
"changed": true,
"cmd": "/usr/bin/ssh -q hostname1 \"/opt/REDACTED/bin/dmctl -s localhost:8426/dmbroker get DomainManager::hostname1-ampm1::state\"",
"delta": "0:00:01.808716",
"end": "2017-09-06 13:28:04.853221",
"invocation": {
"module_args": {
"_raw_params": "/usr/bin/ssh -q hostname1 \"/opt/REDACTED/bin/dmctl -s localhost:8426/dmbroker get DomainManager::hostname1-ampm1::state\"",
"_uses_shell": true,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"warn": true
}
},
"item": "hostname1-ampm1",
"rc": 0,
"start": "2017-09-06 13:28:03.044505",
"stderr": "",
"stderr_lines": [],
"stdout": "0",
"stdout_lines": [
"0"
]
}
]
}
}
我尝试使用set_fact:来隔离和搜索dmstate.results,但我无法弄清楚正确的语法。
tasks:
- name: check status
shell: '/usr/bin/ssh -q {{ inventory_hostname }} "/opt/REDACTED/bin/dmctl -s localhost:8426/dmbroker get DomainManager::{{ item }}::state" '
register: dmstate
with_items: "{{ myprocess }}"
- name: find stdout value
set_fact: stdout_value="{{ item.stdout }}"
when: item.dmstate.results.stdout == "stdout"
with_items: dmstate.results
- name: show value of stdout
debug: var=stdout_value
结果如下:
fatal: [hostname1]: FAILED! => {"failed": true, "msg": "The conditional check 'item.dmstate.results.stdout == \"stdout\"' failed. The error was: error while evaluating conditional (item.dmstate.results.stdout == \"stdout\"): 'AnsibleUnsafeText' object has no attribute 'dmstate'\n\n
答案 0 :(得分:1)
使用with_items
后,item
包含内部值,因此item.dmstate.results.stdout
无意义,您必须使用item.stdout
(就像您在{set_fact
中所做的那样1}})。
即使使用此修复程序,每次都会跳过您的项目,因为您正在针对stdout
字符串测试"stdout"
值,但您说stdout
仅为"0"
}或"1"
。
我想你可以简单地删除when
条款。
另一个问题:每个项目都会覆盖stdout_value
的值,所以最后你只会得到最后一个值。