Install/Update Linux pakage

- 3 mins read
ℹ️ Установка одного пакета (Самый частый кейс) Параметр state: present проверяет, есть ли пакет. Если есть — ничего не делает, если нет — устанавливает
- name: Установка веб-сервера Nginx
  apt:
    name: nginx
    state: present

ℹ️ Установка конкретной версии пакета Важно, когда приложению нужна строго определенная версия, чтобы ничего не сломалось при обновлении.
- name: Установка конкретной версии пакета
  apt:
    name: nginx=1.18.0-0ubuntu1
    state: present

ℹ️ Установка нескольких пакетов списком (Оптимальный способ) В современных версиях Ansible не нужно использовать loop для пакетов. Модуль apt умеет принимать список напрямую в параметр name. Это работает намного быстрее, так как менеджер пакетов вызывается всего один раз.
- name: Установка пачки системных утилит
  apt:
    name:
      - curl
      - git
      - htop
      - unzip
    state: present

ℹ️ Обновление пакета до самой последней версии Если пакет уже установлен, но ты хочешь накатить самую свежую версию из репозиториев, используй state: latest.
- name: Обновление Git до последней версии
  apt:
    name: git
    state: latest

ℹ️ Удаление пакета (Два варианта) state: absent — просто удаляет сам пакет, но оставляет его файлы конфигурации в системе. purge: yes (только для apt) — удаляет пакет полностью вместе со всеми его конфигами и зависимостями.
- name: Полное удаление пакета со всеми конфигами
  apt:
    name: apache2
    state: absent
    purge: yes

ℹ️ Обновление кэша репозиториев (Аналог apt update) Перед установкой пакетов часто нужно обновить списки репозиториев, чтобы скачать актуальные версии. За это отвечает параметр update_cache: yes.
- name: Обновляем кэш и только потом ставим пакет
  apt:
    name: tmux
    state: present
    update_cache: yes

Можно запустить обновление кэша вообще без установки пакетов:

- name: Просто обновление кэша репозиториев
  apt:
    update_cache: yes

ℹ️ Полное обновление всех пакетов системы (Аналог apt upgrade) Обновляет вообще все установленные в операционной системе пакеты до последних версий.
- name: Полное обновление ОС (Upgrade)
  apt:
    upgrade: dist  # или safe / yes в зависимости от нужной строгости
    update_cache: yes

ℹ️ Очистка системы от ненужных пакетов (Аналог apt autoremove) Удаляет старые зависимости, которые ставились автоматически с другими программами, но больше никем не используются.
- name: Удаляем неиспользуемые зависимости
  apt:
    autoremove: yes
    purge: yes

ℹ️ Кроссплатформенный вариант (Модуль package) Если у тебя в инвентаре есть сервера и на Ubuntu, и на CentOS, можно использовать модуль package. Он сам поймет, какую команду вызвать под капотом (apt или dnf). Но учти, у него нет специфических параметров вроде purge или autoremove.
- name: Установка общего пакета на любые ОС
  package:
    name: htop
    state: present

ℹ️ Пакеты можно ставить и через loop. Раньше (в старых версиях Ansible) это вообще был единственный способ установить несколько программ сразу. Синтаксис выглядит стандартно:
- name: Установка пакетов через loop (старый стиль)
  apt:
    name: "{{ item }}"
    state: present
  loop:
    - curl
    - git
    - htop
⚠️ Почему так делать НЕ РЕКОМЕНДУЕТСЯ? Если на собеседовании на Junior DevOps тебя спросят про установку пакетов через loop, ты должен четко ответить: «Так можно, но это работает медленно и неэффективно». Вот как это работает под капотом: Через loop: Ansible берет первый элемент (curl), запускает менеджер пакетов apt, ждет установку. Потом берет второй (git), опять запускает apt, ждет. Если в списке 10 пакетов, apt будет запускаться 10 раз. Это сильно тормозит плейбук. Через список в name (правильный способ): Ansible берет весь список сразу и передает его одной командой: apt install curl git htop. Менеджер пакетов запускается всего один раз, сам считает все зависимости и ставит всё за секунды. Поэтому loop для пакетов используют только в одном редком кейсе: если тебе нужно установить пакеты с разными параметрами (например, один пакет нужно поставить версии latest, а второй — просто present).
- name: Исключение  когда пакеты требуют разного состояния
  apt:
    name: "{{ item.name }}"
    state: "{{ item.state }}"
  loop:
    - { name: 'nginx', state: 'latest' }
    - { name: 'tmux', state: 'present' }