Собирайте версии пакетов с помощью ansible

Привет, друзья, надеюсь, у вас все хорошо.

У меня есть очень простая задача, которую мне нужно выполнить с помощью ansible, но я застрял в переменной resiter:

мне нужно собрать некоторые версии пакетов с помощью ansible и отобразить результат как:

на хосте установлено «это программное обеспечение: версия»

вот пьеса:

      ---
    - name: Collect All Package Versions
      hosts: all
      become: yes
      tasks:
        - name: Update APT package cache
          apt:
            update_cache: yes
          become: yes
    
        - name: Collect Package Versions
          shell: dpkg-query -f '${binary:Package}\t${Version}\n' -W "{{ item }}"
          with_items:
            - firefox
            - libwebp6
            - thunderbird
          register: package_versions
    
        - name: Display Package Versions
          debug:
            var: package_versions.stdout_lines

Когда я его выполнил, я получил это сообщение:

      "package_versions.stdout_lines": "VARIABLE IS NOT DEFINED!"

Я знаю, что есть проблема с регистрацией переменных, но мне нужна небольшая подсказка.

Спасибо ;)

1 ответ

Используйте модуль package_facts. Вы получите словарь установленных пакетов в переменной ansible_facts.packages. Например,

          - package_facts:
    - debug:
        msg: "{{ ansible_facts.packages[item]|
                 map(attribute='version') }}"
      loop:
        - firefox
        - libwebp6
        - thunderbird
      when: ansible_facts.packages[item] is defined

дает в Ubuntu

      ok: [localhost] => (item=firefox) => 
  msg:
  - 88.0.1+build1-0ubuntu0.20.04.2
ok: [localhost] => (item=libwebp6) => 
  msg:
  - 0.6.1-2
ok: [localhost] => (item=thunderbird) => 
  msg:
  - 1:78.8.1+build1-0ubuntu0.20.04.1

Результаты представляют собой списки, поскольку могут быть установлены дополнительные версии пакета. Если вы хотите взять первые предметы, сначала добавьте фильтр в трубу.

          - debug:
        msg: "{{ ansible_facts.packages[item]|
                 map(attribute='version')|first }}"
      ...

Если вы поместите список пакетов в переменную. Например,

        packages: [firefox, libwebp6, thunderbird]

вы можете объявить словарь package_versions

        package_versions: "{{ dict(packages|
                             zip(packages|
                                 map('extract', ansible_facts.packages)|
                                 map('map', attribute='version'))) }}"

дает

        package_versions:
    firefox:
    - 88.0.1+build1-0ubuntu0.20.04.2
    libwebp6:
    - 0.6.1-2
    thunderbird:
    - 1:78.8.1+build1-0ubuntu0.20.04.1

Пример полного сценария для тестирования

       - hosts: localhost

  vars:

    packages: [firefox, libwebp6, thunderbird]

    package_versions: "{{ dict(packages|
                               zip(packages|
                                   map('extract', ansible_facts.packages)|
                                   map('map', attribute='version'))) }}"

  tasks:

    - package_facts:

    - debug:
        msg: "{{ ansible_facts.packages[item]|
                 map(attribute='version')|first }}"
      loop:
        - firefox
        - libwebp6
        - thunderbird
      when: ansible_facts.packages[item] is defined

    - debug:
        var: package_versions
Другие вопросы по тегам