For loop 如何使用Ansible从变量访问标准输出
使用Ansible从注册变量访问标准输出时出错 我已将任务输出注册到变量temp_var,因此变量内容如下所示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":
"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 oftemp\u var
变量内容中也可以看到标准输出。它正在按预期工作。我的坏消息是我错误地更新了所需的输出。让我更正所需的输出。@ilias sp-我有一个疑问,您是如何发现“结果列表有3个元素,最后一个元素没有标准输出键的”,因为我可以在results
list oftemp\u var
变量内容中看到标准输出的。