Ansible:如何使用寄存器选择特定字段
我使用的是一个包特定的命令,它没有现有的模块。命令的输出(stdout)为0或1。我正在尝试将stdout的值分配给一个变量,以便以后在剧本中使用。然而,我似乎无法孤立stdout,它显然正在被捕获Ansible:如何使用寄存器选择特定字段,ansible,Ansible,我使用的是一个包特定的命令,它没有现有的模块。命令的输出(stdout)为0或1。我正在尝试将stdout的值分配给一个变量,以便以后在剧本中使用。然而,我似乎无法孤立stdout,它显然正在被捕获 ok: [hostname1] => { "dmstate": { "changed": true, "msg": "All items completed", "results": [ { "_ansible_item_resu
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
一旦您将
与\u items
一起使用,item
包含内部值,因此item.dmstate.results.stdout
没有意义,您必须使用item.stdout
(就像您在设置\u fact
中所做的那样)
即使使用此修复程序,您的项目每次都将被跳过,因为您正在针对“stdout”
字符串测试stdout
值,但您说stdout
只是“0”或“1”
我认为您可以简单地删除when
子句
另一个问题:每个项目都将覆盖标准值的值,因此最后您只能得到最后一个值。谢谢!这解决了我的需要,帮助我更好地理解该使用什么。