Как получить установленные пакеты 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 параметр подозрительный.)

Другие вопросы по тегам