Назад | Перейти на главную страницу

Ansible: обновление выбранных пакетов, если они установлены, без установки, если нет

У меня есть несколько десятков хостов, которые представляют собой смесь CentOS 6 и 7. Недавно я начал использовать Ansible, чтобы управлять ими, но я все еще новичок.

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

Мне нужен способ предоставить Ansible список пакетов, а затем для каждого хоста он будет действовать: - если пакет присутствует, обновите его до последней версии; - если пакета нет, ничего не делать.

Есть ли практический способ сделать это?

Если вы хотите обновить только часть пакетов доступными обновлениями, вы можете попробовать @wurtel. Вам нужно будет зарегистрировать установленные пакеты следующим образом:

- name: Get installed packages.
  command: rpm -qa --qf "%{NAME}\n"
  register: installed_packages

Затем вы можете определить набор Теоретический фильтр и обновите все пакеты, определенные в списке пакетов, которым разрешено обновлять packages_to_update.

- name: Update subset of packages.
  yum:
    name: "{{ item }}"
    state: latest
  with_items:
  - {{ installed_packages | intersect(packages_to_update) }}

Все это кажется немного сложным для обновления yum?

почему бы просто не использовать для этого локальную команду, пока Ansible не разрешит эту опцию?

Такой простой сценарий подойдет.

---
- hosts: dev-systems
  remote_user: admin
  become: yes
  tasks:
    - name: Update installed packages.
      command: /usr/bin/yum update -y {{item}}
      with_items:
          - package1
          - package2
          - package3
          - package-etc

Я только что протестировал это и использовал два пакета. тот, который нуждался в обновлении, и тот, который не был установлен. Конечным результатом был обновленный пакет без установленного другого.