Ansible - jinja 模板中包的 ansible_facts 问题
Ansible - problem with ansible_facts for packages in jinja template
我尝试使用 Ansible 获取所有已安装的软件包,并以“漂亮”的方式将它们写入文件。
调用模块有效:
- name: Gather the rpm package facts
package_facts:
manager: auto
在 Jinja 模板中我使用了一个循环,什么也有效:
{% for item in ansible_facts.packages %}
{{ item }}
{% endfor %}
不幸的是,简单的输出造成了这种“混乱”:
"yum": [
{
"arch": "noarch",
"epoch": null,
"name": "yum",
"release": "4.el8",
"source": "rpm",
"version": "4.2.23"
}
],
"zlib": [
{
"arch": "x86_64",
"epoch": null,
"name": "zlib",
"release": "16.el8_2",
"source": "rpm",
"version": "1.2.11"
}
]
其中一些元素对于当前的工作来说是不必要的,所以第一个想到的是:
{% for item in ansible_facts.packages %}
{{ item.name }} {{ item.version }}
{% endfor %}
但这只是以错误结束:
fatal: [somehost.example.org]: FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'unicode object' has no attribute 'name'"}
通过互联网搜索,查看 Ansible 的文档,尝试了各种符号,但没有任何效果:
vars[item].name
item[0].name
item["name"]
作为最后一个选项,我用 iteritems 尝试了它:
{% for (key,value) in ansible_facts.packages.iteritems() %}
{{ value }}
{% endfor %}
但这结束了我的一个错误:
fatal: [somehost.example.org]: FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'list object' has no attribute 'name'"}
看来我还不够聪明,想不出解决办法,谁能帮帮我?
此致,
一个沮丧的 Ansible 用户
在您发布的数据示例中,包名称是 key
,value
是包含 1 个元素的字典列表。
要获取版本,您必须访问第一个元素。像这样:
{% for key, value in ansible_facts.packages.iteritems() %}
{{ key }} {{ value[0].version }}
{% endfor %}
应该使用如下包列表呈现文件:
...
zlib 1.2.11
...
我尝试使用 Ansible 获取所有已安装的软件包,并以“漂亮”的方式将它们写入文件。
调用模块有效:
- name: Gather the rpm package facts
package_facts:
manager: auto
在 Jinja 模板中我使用了一个循环,什么也有效:
{% for item in ansible_facts.packages %}
{{ item }}
{% endfor %}
不幸的是,简单的输出造成了这种“混乱”:
"yum": [
{
"arch": "noarch",
"epoch": null,
"name": "yum",
"release": "4.el8",
"source": "rpm",
"version": "4.2.23"
}
],
"zlib": [
{
"arch": "x86_64",
"epoch": null,
"name": "zlib",
"release": "16.el8_2",
"source": "rpm",
"version": "1.2.11"
}
]
其中一些元素对于当前的工作来说是不必要的,所以第一个想到的是:
{% for item in ansible_facts.packages %}
{{ item.name }} {{ item.version }}
{% endfor %}
但这只是以错误结束:
fatal: [somehost.example.org]: FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'unicode object' has no attribute 'name'"}
通过互联网搜索,查看 Ansible 的文档,尝试了各种符号,但没有任何效果:
vars[item].name
item[0].name
item["name"]
作为最后一个选项,我用 iteritems 尝试了它:
{% for (key,value) in ansible_facts.packages.iteritems() %}
{{ value }}
{% endfor %}
但这结束了我的一个错误:
fatal: [somehost.example.org]: FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'list object' has no attribute 'name'"}
看来我还不够聪明,想不出解决办法,谁能帮帮我?
此致,
一个沮丧的 Ansible 用户
在您发布的数据示例中,包名称是 key
,value
是包含 1 个元素的字典列表。
要获取版本,您必须访问第一个元素。像这样:
{% for key, value in ansible_facts.packages.iteritems() %}
{{ key }} {{ value[0].version }}
{% endfor %}
应该使用如下包列表呈现文件:
...
zlib 1.2.11
...