Ansible: обзор

Ansible — инструмент автоматизации конфигурации серверов (IaC): декларативные playbook-файлы описывают желаемое состояние сервера, Ansible приводит его к этому состоянию по SSH без агентов.

Зачем нужно

При масштабировании на несколько серверов ручная настройка каждого превращается в кошмар. Ansible позволяет описать конфигурацию один раз и применить к сотне серверов одновременно. В отличие от Terraform, Ansible работает на уровне ОС — устанавливает пакеты, настраивает сервисы, управляет файлами. Без агентов: нужен только SSH.

Где используется

  • Настройка новых EC2/VPS-серверов (установка Node.js, Nginx, Docker)
  • Деплой приложений на группу серверов
  • Управление конфигурационными файлами (Nginx, systemd)
  • Периодические задачи обслуживания (обновление пакетов, ротация сертификатов)

Основной контент

Установка

pip install ansible
ansible --version

Inventory (список серверов)

# inventory.ini
[webservers]
server1.example.com ansible_user=ubuntu
server2.example.com ansible_user=ubuntu

[databases]
db1.example.com ansible_user=admin ansible_ssh_private_key_file=~/.ssh/db-key.pem

[all:vars]
ansible_python_interpreter=/usr/bin/python3

Простой Playbook: настройка веб-сервера

# setup-webserver.yml
---
- name: Configure web server
  hosts: webservers
  become: yes          # sudo

  vars:
    node_version: "20"
    app_dir: /var/www/myapp

  tasks:
    - name: Update apt cache
      apt:
        update_cache: yes
        cache_valid_time: 3600

    - name: Install required packages
      apt:
        name:
          - curl
          - git
          - nginx
        state: present

    - name: Install Node.js
      shell: |
        curl -fsSL https://deb.nodesource.com/setup_{{ node_version }}.x | bash -
        apt-get install -y nodejs
      args:
        creates: /usr/bin/node    # не запускать если уже есть

    - name: Create app directory
      file:
        path: "{{ app_dir }}"
        state: directory
        owner: ubuntu
        mode: '0755'

    - name: Copy Nginx config
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/sites-available/myapp
      notify: Restart nginx

    - name: Enable nginx site
      file:
        src: /etc/nginx/sites-available/myapp
        dest: /etc/nginx/sites-enabled/myapp
        state: link

  handlers:
    - name: Restart nginx
      service:
        name: nginx
        state: restarted

Запуск

# Проверить подключение к серверам
ansible webservers -i inventory.ini -m ping

# Запустить playbook (dry-run)
ansible-playbook -i inventory.ini setup-webserver.yml --check

# Применить
ansible-playbook -i inventory.ini setup-webserver.yml

# Только определённые теги
ansible-playbook -i inventory.ini deploy.yml --tags "deploy"

Шаблон Nginx (Jinja2)

# nginx.conf.j2
server {
    listen 80;
    server_name {{ ansible_host }};

    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
    }
}

Частые ошибки

  • Хранить пароли и ключи в playbook — использовать ansible-vault encrypt
  • Не использовать --check перед применением — можно сломать прод
  • Playbook не идемпотентен: повторный запуск даёт другой результат — каждый таск должен быть идемпотентным
  • Слишком большой монолитный playbook — разбивать на роли (roles)

Связанные темы

Ресурсы