如何使用Ansible从变量访问stdout

时间:2019-03-26 15:02:57

标签: for-loop variables filter ansible jinja2

使用Ansible从注册变量访问stdout时出错

我已将任务输出注册到变量temp_var中,因此变量内容将如下所示。

"msg": {
        "changed": true,
        "msg": "All items completed",
        "results": [
            {
                "_ansible_ignore_errors": null,
                "_ansible_item_label": "imntg",
                "_ansible_item_result": true,
                "_ansible_no_log": false,
                "changed": true,
                "failed": false,
                "item": "imntg",
                "rc": 0,
                "stderr": "",
                "stderr_lines": [],
                "stdout": "03-26-2019-06h40m21s\n03-26-2019-06h30m21s\n",
                "stdout_lines": [
                    "03-26-2019-06h40m21s",
                    "03-26-2019-06h30m21s"
                ]
            },
            {
                "_ansible_ignore_errors": null,
                "_ansible_item_label": "imntg4",
                "_ansible_item_result": true,
                "_ansible_no_log": false,
                "changed": true,
                "failed": false,
                "item": "imntg4",
                "rc": 0,
                "stderr": "",
                "stderr_lines": [],
                "stdout": "03-26-2019-06h40m21s\n03-26-2019-06h30m21s\n",
                "stdout_lines": [
                    "03-26-2019-06h40m21s",
                    "03-26-2019-06h30m21s"
                ]
            },
            {
                "_ansible_ignore_errors": null,
                "_ansible_item_label": "",
                "_ansible_item_result": true,
                "_ansible_no_log": false,
                "changed": false,
                "item": "",
                "skip_reason": "Conditional result was False",
                "skipped": true
            }
        ]
    }
}

我正在尝试从上述输出中访问_ansible_item_labelstdout

所需的输出应如下所示。

TASK [debug] ***********************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": [
        "03-26-2019-06h40m21s\n03-26-2019-06h30m21s\n - imntg",
        "03-26-2019-06h40m21s\n03-26-2019-06h30m21s\n - imntg4"
    ]
}

下面是我尝试过的代码。

  - debug:
      msg: "{% set temp_var_tag_list = [] %}{% for result in temp_var.results %}{{ temp_var_tag_list.append(result.stdout ~ ' - ' ~ result._ansible_item_label) }}{% endfor %}{{ temp_var_tag_list }}"

我可以访问_ansible_item_label,但是访问stdout而不是item时,访问stdout时出错,并且同样的事情起作用。

这里有什么帮助吗?

1 个答案:

答案 0 :(得分:2)

这是因为您的results列表包含3个元素,最后一个没有stdout键。

您可以在Jinja代码中添加“如果存在,则”逻辑,如下所示:

  - debug:
      msg: "{% set temp_var_tag_list = [] %}{% for result in temp_var.results %}{% if result.stdout is defined -%}{{ temp_var_tag_list.append(result.stdout ~ ' - ' ~ result._ansible_item_label) }}{%- endif %}{%- endfor %}{{ temp_var_tag_list }}"

产生的输出:

TASK [debug] ***********************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": [
        "03-26-2019-06h40m21s\n03-26-2019-06h30m21s\n - imntg",
        "03-26-2019-06h40m21s\n03-26-2019-06h30m21s\n - imntg4"
    ]
}

希望有帮助

PS:我假设您所需的输出不是您在问题中描述的输出,而是您尝试从Jinja代码获得的输出,因为这两个不一致。 (“ imntg4-imntg4”不在您的stdout中)