Home » Создание и запуск вашего первого плейбука Ansible
Создание и запуск вашего первого плейбука Ansible

Создание и запуск вашего первого плейбука Ansible

Если вы когда-нибудь сидели ночью, повторяя одни и те же команды на десятках серверов, и думали “должен же быть способ лучше” — добро пожаловать в мир Ansible! Эта статья поможет вам создать и запустить ваш первый плейбук, который превратит монотонную работу в элегантный автоматизированный процесс. Мы разберём всё с нуля: от установки до реальных примеров, которые можно использовать уже сегодня.

Как работает Ansible — магия без агентов

Ansible — это система управления конфигурациями, которая работает по принципу “push” через SSH. Главная фишка: никаких агентов на целевых серверах! Всё управление происходит с одной машины (control node), которая подключается к удалённым хостам и выполняет задачи.

Архитектура выглядит так:

  • Control node — ваша рабочая станция или сервер с Ansible
  • Managed nodes — серверы, которыми управляете
  • Inventory — список хостов и их параметров
  • Playbooks — YAML-файлы с задачами
  • Modules — готовые функции для выполнения операций

Ansible использует идемпотентность — можно запускать плейбук сколько угодно раз, результат будет одинаковым. Если файл уже существует с нужным содержимым, он не будет перезаписан.

Установка и первоначальная настройка

Начнём с установки Ansible на управляющую машину. Для этого примера возьмём Ubuntu/Debian:

# Обновляем пакеты
sudo apt update

# Устанавливаем Ansible
sudo apt install ansible

# Проверяем версию
ansible --version

# Альтернативно через pip (для последней версии)
pip3 install ansible

Теперь создадим рабочую директорию и базовую структуру:

mkdir ~/ansible-project
cd ~/ansible-project

# Создаём структуру проекта
mkdir {inventories,playbooks,roles,group_vars,host_vars}
touch ansible.cfg

Настроим базовый конфиг ansible.cfg:

[defaults]
inventory = inventories/production
private_key_file = ~/.ssh/id_rsa
remote_user = root
host_key_checking = False
retry_files_enabled = False
stdout_callback = yaml

Создание инвентаря — карта ваших серверов

Инвентарь — это список серверов, которыми будет управлять Ansible. Создадим файл inventories/production:

[webservers]
web1.example.com ansible_host=192.168.1.10
web2.example.com ansible_host=192.168.1.11

[databases]
db1.example.com ansible_host=192.168.1.20
db2.example.com ansible_host=192.168.1.21

[loadbalancers]
lb1.example.com ansible_host=192.168.1.30

[production:children]
webservers
databases
loadbalancers

Для работы с VPS или выделенными серверами просто укажите их IP-адреса.

Проверим доступность хостов:

# Пингуем все хосты
ansible all -m ping

# Пингуем только веб-серверы
ansible webservers -m ping

# Выполняем произвольную команду
ansible all -a "uptime"

Ваш первый плейбук — устанавливаем Nginx

Создадим простой плейбук для установки и настройки Nginx. Файл playbooks/webserver.yml:

---
- name: Установка и настройка веб-сервера
  hosts: webservers
  become: yes
  
  vars:
    nginx_port: 80
    site_name: "My Awesome Site"
  
  tasks:
    - name: Обновляем кеш пакетов
      apt:
        update_cache: yes
      
    - name: Устанавливаем Nginx
      apt:
        name: nginx
        state: present
        
    - name: Создаём индексную страницу
      copy:
        content: |
          
          
          
              {{ site_name }}
          
          
              

{{ site_name }}

Сервер: {{ inventory_hostname }}

Дата развёртывания: {{ ansible_date_time.date }}

dest: /var/www/html/index.html - name: Запускаем и включаем Nginx systemd: name: nginx state: started enabled: yes - name: Проверяем статус Nginx uri: url: "http://{{ inventory_hostname }}:{{ nginx_port }}" method: GET status_code: 200 delegate_to: localhost

Запускаем плейбук:

# Проверяем синтаксис
ansible-playbook playbooks/webserver.yml --syntax-check

# Выполняем dry run
ansible-playbook playbooks/webserver.yml --check

# Запускаем реальное выполнение
ansible-playbook playbooks/webserver.yml

# Запускаем с повышенной детализацией
ansible-playbook playbooks/webserver.yml -vvv

Продвинутый пример — настройка базы данных

Создадим более сложный плейбук для установки PostgreSQL. Файл playbooks/database.yml:

---
- name: Установка и настройка PostgreSQL
  hosts: databases
  become: yes
  
  vars:
    postgres_version: "13"
    db_name: "myapp"
    db_user: "appuser"
    db_password: "{{ vault_db_password }}"
    
  tasks:
    - name: Устанавливаем PostgreSQL
      apt:
        name:
          - postgresql-{{ postgres_version }}
          - postgresql-contrib
          - python3-psycopg2
        state: present
        
    - name: Запускаем PostgreSQL
      systemd:
        name: postgresql
        state: started
        enabled: yes
        
    - name: Создаём базу данных
      postgresql_db:
        name: "{{ db_name }}"
        state: present
      become_user: postgres
      
    - name: Создаём пользователя базы данных
      postgresql_user:
        name: "{{ db_user }}"
        password: "{{ db_password }}"
        db: "{{ db_name }}"
        priv: ALL
        state: present
      become_user: postgres
      
    - name: Настраиваем pg_hba.conf
      lineinfile:
        path: /etc/postgresql/{{ postgres_version }}/main/pg_hba.conf
        line: "host    {{ db_name }}    {{ db_user }}    0.0.0.0/0    md5"
        insertafter: "# IPv4 local connections:"
      notify: restart postgresql
      
  handlers:
    - name: restart postgresql
      systemd:
        name: postgresql
        state: restarted

Работа с секретами — Ansible Vault

Для безопасного хранения паролей используем Ansible Vault:

# Создаём зашифрованный файл
ansible-vault create group_vars/databases/vault.yml

# Редактируем существующий
ansible-vault edit group_vars/databases/vault.yml

# Шифруем обычный файл
ansible-vault encrypt secrets.yml

# Расшифровываем
ansible-vault decrypt secrets.yml

Содержимое group_vars/databases/vault.yml:

vault_db_password: "super_secret_password_123"
vault_api_key: "your_api_key_here"

Запуск плейбука с vault:

ansible-playbook playbooks/database.yml --ask-vault-pass

# Или с файлом с паролем
ansible-playbook playbooks/database.yml --vault-password-file ~/.vault_pass

Примеры реальных кейсов

Задача Модуль Ansible Пример использования
Установка пакетов apt, yum, package Массовая установка на множестве серверов
Управление файлами copy, template, file Развёртывание конфигов
Управление службами systemd, service Перезапуск сервисов после обновления
Выполнение команд command, shell Кастомные скрипты и утилиты
Работа с Git git Автоматическое развёртывание кода

Сравнение с другими решениями

Параметр Ansible Puppet Chef SaltStack
Агенты Не требуются Требуются Требуются Требуются
Язык конфигурации YAML Ruby DSL Ruby YAML/Jinja2
Кривая обучения Низкая Средняя Высокая Средняя
Производительность Средняя Высокая Высокая Очень высокая

Продвинутые техники и хитрости

Условное выполнение задач:

- name: Устанавливаем пакет только на Ubuntu
  apt:
    name: ubuntu-specific-package
    state: present
  when: ansible_distribution == "Ubuntu"

- name: Выполняем только для веб-серверов
  command: /usr/local/bin/web-specific-script.sh
  when: inventory_hostname in groups['webservers']

Циклы и итерации:

- name: Создаём несколько пользователей
  user:
    name: "{{ item.name }}"
    groups: "{{ item.groups }}"
    shell: /bin/bash
  loop:
    - { name: "alice", groups: "sudo,developers" }
    - { name: "bob", groups: "developers" }
    - { name: "charlie", groups: "sudo,ops" }

Использование фактов:

- name: Выводим информацию о системе
  debug:
    msg: |
      Хост: {{ inventory_hostname }}
      ОС: {{ ansible_distribution }} {{ ansible_distribution_version }}
      Архитектура: {{ ansible_architecture }}
      Память: {{ ansible_memtotal_mb }}MB
      Процессор: {{ ansible_processor_vcpus }} cores

Создание собственных ролей

Роли позволяют структурировать код и переиспользовать его. Создадим роль для настройки firewall:

# Создаём структуру роли
ansible-galaxy init roles/firewall

# Структура роли
roles/firewall/
├── defaults/
│   └── main.yml
├── handlers/
│   └── main.yml
├── tasks/
│   └── main.yml
├── templates/
├── vars/
│   └── main.yml
└── meta/
    └── main.yml

Файл roles/firewall/tasks/main.yml:

---
- name: Устанавливаем ufw
  apt:
    name: ufw
    state: present

- name: Настраиваем базовые правила
  ufw:
    rule: "{{ item.rule }}"
    port: "{{ item.port }}"
    proto: "{{ item.proto | default('tcp') }}"
  loop:
    - { rule: "allow", port: "22" }
    - { rule: "allow", port: "80" }
    - { rule: "allow", port: "443" }
  notify: enable ufw

- name: Включаем firewall
  ufw:
    state: enabled
    policy: deny

Использование роли в плейбуке:

---
- name: Настройка безопасности
  hosts: all
  become: yes
  roles:
    - firewall

Мониторинг и отладка

Полезные команды для диагностики:

# Проверяем доступность всех хостов
ansible all -m setup | grep ansible_distribution

# Собираем факты о системе
ansible hostname -m setup

# Выполняем команду на всех хостах
ansible all -a "df -h"

# Проверяем конфигурацию
ansible-config dump --only-changed

# Список всех модулей
ansible-doc -l

# Справка по конкретному модулю
ansible-doc copy

Интеграция с другими инструментами

С Docker:

- name: Запускаем контейнер
  docker_container:
    name: web-app
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - /var/www:/usr/share/nginx/html
    state: started

С Kubernetes:

- name: Развёртываем в Kubernetes
  k8s:
    state: present
    definition:
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: web-app
        namespace: default
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: web-app
        template:
          metadata:
            labels:
              app: web-app
          spec:
            containers:
            - name: web
              image: nginx:latest
              ports:
              - containerPort: 80

Лучшие практики и рекомендации

  • Используйте теги для выборочного выполнения задач
  • Группируйте переменные по окружениям (dev, staging, prod)
  • Всегда проверяйте плейбуки с --check перед выполнением
  • Используйте vault для всех секретных данных
  • Документируйте ваши плейбуки и роли
  • Тестируйте на dev-окружении перед продакшеном

Структура проекта для продакшена:

ansible-project/
├── inventories/
│   ├── production/
│   │   ├── hosts
│   │   └── group_vars/
│   └── staging/
│       ├── hosts
│       └── group_vars/
├── playbooks/
├── roles/
├── library/
├── filter_plugins/
└── ansible.cfg

Полезные ресурсы

Заключение

Ansible превращает хаос ручного управления серверами в элегантный автоматизированный процесс. Начните с простых задач — установки пакетов, копирования файлов, управления службами. Постепенно усложняйте плейбуки, добавляя условия, циклы и собственные роли.

Главные преимущества Ansible:

  • Низкий порог входа — можно начать использовать за пару часов
  • Не требует агентов — работает через SSH
  • Идемпотентность — безопасно запускать многократно
  • Огромное сообщество и экосистема готовых решений

Используйте Ansible для автоматизации рутинных задач, стандартизации окружений и ускорения развёртывания. Это инвестиция, которая окупится уже через неделю использования, сэкономив часы монотонной работы и снизив количество ошибок.

Начните с малого, экспериментируйте и не бойтесь ошибок — в этом вся прелесть декларативного подхода. Удачи в автоматизации!


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

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

Leave a reply

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