For loop 如何使用Ansible从变量访问标准输出

For loop 如何使用Ansible从变量访问标准输出,for-loop,variables,filter,ansible,jinja2,For Loop,Variables,Filter,Ansible,Jinja2,使用Ansible从注册变量访问标准输出时出错 我已将任务输出注册到变量temp_var,因此变量内容如下所示 "msg": { "changed": true, "msg": "All items completed", "results": [ { "_ansible_ignore_errors": null, "_ansible_item_label":

使用Ansible从注册变量访问标准输出时出错

我已将任务输出注册到变量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
            }
        ]
    }
}

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"
    ]
}
我正试图从上述输出访问
\ansible\u item\u label
stdout

所需的输出应如下所示

"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
            }
        ]
    }
}

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\u item\u label
,但在访问
stdout
时出错,如果我访问
item
而不是
stdout
,同样的事情也会发生


这里有什么帮助吗?

这是因为您的
结果列表有3个元素,最后一个元素没有
stdout

您可以在jinja代码中添加“if exists,then”逻辑,如下所示:

  - 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”不在
标准输出中

这是因为
结果列表有3个元素,最后一个元素没有
标准输出键

您可以在jinja代码中添加“if exists,then”逻辑,如下所示:

  - 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”不在您的
标准输出中

它按预期工作。我的坏消息是我错误地更新了所需的输出。让我更正所需的输出。@ilias sp-我有一个疑问,您是如何发现“结果列表有3个元素,最后一个元素没有标准输出键的”,因为我在
results
list of
temp\u var
变量内容中也可以看到标准输出。它正在按预期工作。我的坏消息是我错误地更新了所需的输出。让我更正所需的输出。@ilias sp-我有一个疑问,您是如何发现“结果列表有3个元素,最后一个元素没有标准输出键的”,因为我可以在
results
list of
temp\u var
变量内容中看到标准输出的。