Ansible 更新列表

Ansible 更新列表

任务是获取最新更新的列表。 大致在命令发出 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 %}

相关内容