Собирайте версии пакетов с помощью 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