MyTetra Share
Делитесь знаниями!
Как в Ansible получить список установленных пакетов
Время создания: 02.03.2022 12:25
Текстовые метки: ansible, пакет, ansible_facts, package, факты
Раздел: Компьютер - Linux - Оркестрация - Ansible
Запись: xintrea/mytetra_syncro/master/base/1646213108isap9gw0aw/text.html на raw.github.com

Иногда, чтобы исключить ошибки по управлению пакетами через Ansible, необходимо в команды добавлять условия, которые бы проверяли, установлен тот или иной пакет или нет. Проблема возникает из-за того, что по-умолчанию информация об установленных пакетах не собирается в переменную ansible_facts.


Даже если в плейбуке прописать gather_facts: yes, то в информацию о хосте не будет собираться информация об установленных пакетах. Поэтому следующий плейбук будет завершаться ошибкой:



- hosts: iksHosts:compilingHost

gather_facts: yes

tasks:

- name: Установленные пакеты

debug:

msg: "{{ ansible_facts.packages }}"



Ошибка:



The error was: error while evaluating conditional in ansible_facts.packages: 'dict object' has no attribute 'packages'



Чтобы в переменной-словаре ansible_facts появился раздел packages, в плейбук надо добавить следующую задачу:



 - name: Запрос пакетов, установленных в дистрибутиве

   ansible.builtin.package_facts:

manager: auto



После добавления такого кода, в переменной ansible_facts появится ключ packages, и в нем в виде подчиненных элементов будут перечислены имена установленных в систему пакетов. Содержимое будет примерно следующее:



       "acl": [

           {

               "arch": "amd64",

               "category": "utils",

               "name": "acl",

               "origin": "Debian",

               "source": "apt",

               "version": "2.2.52-3"

           }

       ],

       "acpi": [

           {

               "arch": "amd64",

               "category": "utils",

               "name": "acpi",

               "origin": "Debian",

               "source": "apt",

               "version": "1.7-1"

           }

       ],

       "acpi-support": [

           {

               "arch": "all",

               "category": "admin",

               "name": "acpi-support",

               "origin": "Debian",

               "source": "apt",

               "version": "0.142-8astra1"

           }

       ],

       ...



Как видно, помимо имени пакета, о пакете можно узнать много другой полезной информации, например версию и архитектуру.


Теперь можно писать команды управления сервисом в системе с учетом того, что пакет вообще присутствует в системе:



 - name: Остановка PostgreSQL, если он установлен в системе

   service:

     name: postgresql

     state: stopped

   when: "'postgresql-9.1' in ansible_facts.packages"



В некотором смысле такой подход лучше, чем простое подавление ошибки для подобной задачи.


Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования