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 用户

在您发布的数据示例中,包名称是 keyvalue 是包含 1 个元素的字典列表。

要获取版本,您必须访问第一个元素。像这样:

{% for key, value in ansible_facts.packages.iteritems() %}
{{ key }} {{ value[0].version }}
{% endfor %}

应该使用如下包列表呈现文件:

...
zlib 1.2.11
...