Как получить установленные пакеты yum с Ansible?
Я пытаюсь получить весь установленный пакет yum на машине RHEL. Я могу легко получить это с помощью команд оболочки, которые не являются идемпотентными и хотели бы использовать вместо них команду yum.
Команда Shell работает нормально:
- name: yum list packages
shell: yum list installed > build_server_info.config
Но когда я пытаюсь использовать команду yum, она просто выполняется, но не дает никаких результатов:
- name: yum_command
action: yum list=${pkg} list=available
3 ответа
Я могу легко получить это с помощью команд оболочки, которые не являются идемпотентными
Вы не можете говорить об идемпотентности, когда запрашиваете текущее состояние машины.
"Идемпонентность" означает, что задание будет гарантировать, что машина находится в желаемом состоянии, независимо от того, сколько раз вы выполняли определенное задание.
Когда вы запрашиваете текущее состояние, вы не описываете желаемое состояние. Независимо от того, что вы делаете, какой метод вы используете, термин "идемпотент" просто не применим.
Что касается вашего примера, который не дает результатов - вы дважды повторили один и тот же аргумент list
и задача должна провалиться (это не так, что похоже на причуду Ansible).
Чтобы получить список установленных пакетов, вы должны использовать:
- name: yum_command
yum:
list=installed
register: yum_packages
- debug:
var: yum_packages
Сохраняет список словарей, описывающих каждый пакет, в переменную yum_packages
,
Затем вы можете использовать JSON Query Filter для получения одного пакета (tar
):
- debug: var=item
with_items: "{{yum_packages|json_query(jsonquery)}}"
vars:
jsonquery: "results[?name=='tar']"
чтобы получить такой результат:
"item": {
"arch": "x86_64",
"epoch": "2",
"name": "tar",
"nevra": "2:tar-1.26-31.el7.x86_64",
"release": "31.el7",
"repo": "installed",
"version": "1.26",
"yumstate": "installed"
}
Или только его версия:
- debug: var=item
with_items: "{{yum_packages|json_query(jsonquery)}}"
vars:
jsonquery: "results[?name=='tar'].version"
"item": "1.26"
Начиная с версии 2.5, вы также можете использовать package_facts
Модуль: он соберет список установленных пакетов в виде фактов Ansible.
Пример из документов:
- name: get the rpm package facts
package_facts:
manager: rpm
- name: show them
debug: var=ansible_facts.packages
Если вам нужно проверить только один пакет и на основе этого вы хотите выполнить другую задачу, вы можете использовать package_facts
модуль как
- name: install docker community edition in rhel8
hosts: localhost
connection: local
tasks:
- name: Gather the rpm package facts
package_facts:
manager: auto
- name: check if docker-ce is already installed
debug:
var: ansible_facts.packages['docker-ce']
- name: using command module to install docker-ce
command: yum install docker-ce --nobest -y
when: "'docker-ce' not in ansible_facts.packages"
register: install_res
- name: whether docker is installed now
debug:
var: install_res
Ну, официальная документация Ansible для ням module
описывает список как:
"Различные (не идемпотентные) команды для использования с /usr/bin/ansible, а не с playbooks".
так что вам не повезет с поиском идемпотента list
призывание.
Если вы просто хотите подавить changed
выход, установите changed_when
параметр для False
,
(Также, имея дубликат list
параметр подозрительный.)