Home » Как устанавливать и управлять системными пакетами в плейбуках Ansible
Как устанавливать и управлять системными пакетами в плейбуках Ansible

Как устанавливать и управлять системными пакетами в плейбуках 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 превращает хаос управления пакетами в организованный и воспроизводимый процесс. Начните использовать его уже сегодня, и через месяц вы не сможете представить, как работали без него раньше.


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked