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' }