- Home »

Как устанавливать и управлять системными пакетами в плейбуках Ansible
В эпоху массовой автоматизации каждый сисадмин рано или поздно сталкивается с необходимостью управлять множеством серверов одновременно. Ansible пришёл к нам как спасение от рутинных задач по установке и обновлению пакетов на десятках машин. Если вы устали от SSH-хоппинга между серверами и хотите наконец-то автоматизировать управление пакетами, то этот материал для вас.
Разберём не только базовые принципы работы с системными пакетами в Ansible, но и покажем реальные примеры, которые можно использовать в продакшене. Поговорим о подводных камнях, лучших практиках и неочевидных возможностях, которые помогут вам выжать максимум из этого инструмента.
Как работает управление пакетами в Ansible
Ansible использует специальные модули для работы с пакетными менеджерами разных дистрибутивов. Основная магия происходит благодаря модулю package
, который автоматически определяет тип системы и использует соответствующий пакетный менеджер:
- apt для Debian/Ubuntu
- yum для RHEL/CentOS 7 и ниже
- dnf для Fedora/RHEL 8+
- pacman для Arch Linux
- zypper для SUSE
Принцип работы прост: Ansible подключается к целевым хостам по SSH, проверяет текущее состояние пакетов и выполняет необходимые операции для достижения желаемого состояния. Это идемпотентный процесс — повторное выполнение плейбука не изменит систему, если она уже находится в нужном состоянии.
Базовая настройка и первые шаги
Начнём с простого примера установки пакетов. Создадим базовый плейбук:
---
- name: Установка базовых пакетов
hosts: servers
become: yes
tasks:
- name: Установка необходимых пакетов
package:
name:
- curl
- wget
- git
- htop
- vim
state: present
Для более детального контроля можно использовать специфичные модули:
---
- name: Управление пакетами Ubuntu
hosts: ubuntu_servers
become: yes
tasks:
- name: Обновление кэша APT
apt:
update_cache: yes
cache_valid_time: 3600
- name: Установка пакетов с определённой версией
apt:
name: nginx=1.18.0-0ubuntu1
state: present
- name: Установка пакетов из определённого репозитория
apt:
name: docker-ce
state: present
default_release: focal
Аналогично для CentOS/RHEL:
---
- name: Управление пакетами CentOS
hosts: centos_servers
become: yes
tasks:
- name: Установка пакетов через YUM
yum:
name:
- epel-release
- nginx
- certbot
state: present
- name: Обновление всех пакетов
yum:
name: "*"
state: latest
Продвинутые техники и практические примеры
Реальная жизнь требует более сложных сценариев. Рассмотрим несколько полезных паттернов:
Условная установка пакетов
---
- name: Условная установка пакетов
hosts: all
become: yes
tasks:
- name: Установка пакетов для разных ОС
package:
name: "{{ item }}"
state: present
loop: "{{ packages[ansible_os_family] }}"
vars:
packages:
Debian:
- apache2
- libapache2-mod-php
RedHat:
- httpd
- php
Archlinux:
- apache
- php-apache
Работа с репозиториями
---
- name: Добавление репозиториев и установка пакетов
hosts: ubuntu_servers
become: yes
tasks:
- name: Добавление ключа Docker GPG
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: present
- name: Добавление Docker репозитория
apt_repository:
repo: "deb [arch=amd64] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable"
state: present
- name: Установка Docker
apt:
name: docker-ce
state: present
update_cache: yes
Обработка ошибок и откат
---
- name: Безопасная установка пакетов
hosts: all
become: yes
tasks:
- name: Создание снапшота (для LVM)
command: lvcreate -L1G -s -n backup_snapshot /dev/vg0/root
ignore_errors: yes
- name: Установка пакетов
package:
name: "{{ packages_to_install }}"
state: present
register: package_result
failed_when: false
- name: Откат при ошибке
command: lvconvert --merge /dev/vg0/backup_snapshot
when: package_result.failed
- name: Удаление снапшота при успехе
command: lvremove -f /dev/vg0/backup_snapshot
when: not package_result.failed
Сравнение подходов к управлению пакетами
Подход | Преимущества | Недостатки | Лучше использовать когда |
---|---|---|---|
Модуль package | Кроссплатформенность, простота | Ограниченная функциональность | Базовые задачи, смешанная инфраструктура |
Специфичные модули (apt, yum) | Полный контроль, все возможности менеджера | Привязка к дистрибутиву | Сложные настройки, продакшн |
Модуль shell/command | Максимальная гибкость | Нет идемпотентности, сложность отладки | Нестандартные случаи |
Интересные факты и нестандартные применения
Мало кто знает, что Ansible может работать не только с системными пакетами. Вот несколько интересных возможностей:
- pip — для Python пакетов
- npm — для Node.js пакетов
- gem — для Ruby пакетов
- composer — для PHP пакетов
Пример комплексного плейбука для настройки веб-сервера:
---
- name: Полная настройка веб-сервера
hosts: webservers
become: yes
tasks:
- name: Установка системных пакетов
package:
name:
- nginx
- python3-pip
- nodejs
- npm
state: present
- name: Установка Python пакетов
pip:
name:
- flask
- gunicorn
- redis
state: present
- name: Установка Node.js пакетов глобально
npm:
name: pm2
global: yes
state: present
- name: Установка Composer
get_url:
url: https://getcomposer.org/installer
dest: /tmp/composer-setup.php
- name: Запуск Composer installer
command: php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer
Автоматизация и интеграция со скриптами
Ansible отлично интегрируется с CI/CD пайплайнами. Вот пример использования с GitLab CI:
deploy:
stage: deploy
script:
- ansible-playbook -i inventory/production site.yml --tags "packages"
only:
- master
Для мониторинга состояния пакетов можно использовать модуль package_facts
:
---
- name: Аудит установленных пакетов
hosts: all
tasks:
- name: Получение информации о пакетах
package_facts:
manager: auto
- name: Проверка версии nginx
debug:
msg: "Nginx version: {{ ansible_facts.packages.nginx[0].version }}"
when: "'nginx' in ansible_facts.packages"
- name: Создание отчёта
template:
src: package_report.j2
dest: /tmp/package_report.html
Для управления большим количеством серверов рекомендую использовать VPS с достаточным количеством ресурсов для Ansible control node, а для критически важных задач — выделенные серверы.
Альтернативные решения
Стоит упомянуть и другие инструменты для управления пакетами:
- Puppet — более мощный, но сложный в настройке
- Chef — хорош для больших инфраструктур
- SaltStack — быстрый, но требует агентов
- Terraform — больше для инфраструктуры, чем для пакетов
Ansible выигрывает простотой настройки и отсутствием необходимости в агентах на целевых машинах.
Полезные ссылки
Заключение и рекомендации
Управление пакетами через Ansible — это не просто автоматизация рутинных задач, это способ стандартизировать и документировать вашу инфраструктуру. Начните с простых плейбуков для установки базовых пакетов, постепенно добавляя более сложную логику.
Ключевые рекомендации:
- Всегда используйте
become: yes
для операций с пакетами - Группируйте связанные пакеты в отдельные задачи
- Используйте теги для выборочного выполнения задач
- Не забывайте про обновление кэша пакетов
- Тестируйте плейбуки в тестовой среде перед продакшном
Ansible превращает хаос управления пакетами в организованный и воспроизводимый процесс. Начните использовать его уже сегодня, и через месяц вы не сможете представить, как работали без него раньше.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.