Ansible:如何使用寄存器选择特定字段

Ansible:如何使用寄存器选择特定字段,ansible,Ansible,我使用的是一个包特定的命令,它没有现有的模块。命令的输出(stdout)为0或1。我正在尝试将stdout的值分配给一个变量,以便以后在剧本中使用。然而,我似乎无法孤立stdout,它显然正在被捕获 ok: [hostname1] => { "dmstate": { "changed": true, "msg": "All items completed", "results": [ { "_ansible_item_resu

我使用的是一个包特定的命令,它没有现有的模块。命令的输出(stdout)为0或1。我正在尝试将stdout的值分配给一个变量,以便以后在剧本中使用。然而,我似乎无法孤立stdout,它显然正在被捕获

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
子句


另一个问题:每个项目都将覆盖标准值的值,因此最后您只能得到最后一个值。

谢谢!这解决了我的需要,帮助我更好地理解该使用什么。