Ansible:如何使用注册

时间:2017-09-06 13:53:21

标签: ansible

我正在使用特定于软件包的命令,其中没有现有模块。命令的输出(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

1 个答案:

答案 0 :(得分:1)

使用with_items后,item包含内部值,因此item.dmstate.results.stdout无意义,您必须使用item.stdout(就像您在{set_fact中所做的那样1}})。

即使使用此修复程序,每次都会跳过您的项目,因为您正在针对stdout字符串测试"stdout"值,但您说stdout仅为"0" }或"1"
我想你可以简单地删除when条款。

另一个问题:每个项目都会覆盖stdout_value的值,所以最后你只会得到最后一个值。