任务是获取最新更新的列表。 大致在命令发出 dnf check-update Ansible 代码时:
tasks:
- name: List Available Patches (Non-Kernel)
dnf:
list: updates
update_cache: true
register: packages
- debug:
msg: >-
{%- set output=[] -%}
{%- for p in packages.results -%}
{{ output.append((p.name ~ '-' ~ p.version ~ '-' ~ p.release)) }}
{%- endfor -%}
{{ output }}
但在这种情况下,我可以获得相同的包但具有不同的版本,我怎样才能仅获取最新版本?
"vlc-3.0.18-1.el7.3",
"vlc-3.0.18-2.el7.3",
"vlc-core-3.0.18-1.el7.3",
"vlc-core-3.0.18-2.el7.3",
"xdg-desktop-portal-1.8.0-3.el7",
"xorg-x11-server-Xorg-1.20.14-4.el7.3",
"xorg-x11-server-Xorg-1.20.14-5.el7.3",
"xorg-x11-server-Xorg-1.20.14-6.el7.3",
答案1
通过...分组列表包.结果经过姓名并创建字典我的包
my_packages: "{{ dict(packages.results|groupby('name')) }}"
然后,下面的模板
- debug:
msg: |
{% for name,versions in my_packages.items() %}
{% set max_ver=versions|map(attribute='version')|max %}
{% set p=versions|selectattr('version', '==', max_ver) %}
{{ name }}-{{ p.0.version }}-{{ p.0.release }}
{% endfor %}
给出你想要的
msg: |-
adcli-0.8.2-12.el8
alsa-sof-firmware-1.8-1.el8
ansible-7.2.0-1.el8
authselect-1.2.2-3.el8
authselect-libs-1.2.2-3.el8
bash-4.4.20-2.el8
bind-export-libs-9.11.26-6.el8
binutils-2.30-108.el8
bpftool-4.18.0-348.2.1.el8_5
ca-certificates-2021.2.50-80.0.el8_4
centos-gpg-keys-8-3.el8
centos-linux-release-8.5-1.2111.el8
centos-linux-repos-8-3.el8
centos-logos-85.8-2.el8
...
完整测试剧本的示例
- hosts: foo
vars:
my_packages: "{{ dict(packages.results|groupby('name')) }}"
tasks:
- dnf:
list: updates
register: packages
- debug:
msg: |
{% for name,versions in my_packages.items() %}
{% set max_ver=versions|map(attribute='version')|max %}
{% set p=versions|selectattr('version', '==', max_ver) %}
{{ name }}-{{ p.0.version }}-{{ p.0.release }}
{% endfor %}
问:“错误是:生成器对象没有元素 0”
答:问题可能是 Ansible 版本较旧。尝试显式转换为列表
{% set p=versions|selectattr('version', '==', max_ver)|list %}