- Home »

Создание и запуск вашего первого плейбука 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 Galaxy — репозиторий готовых ролей
- Исходный код на GitHub
Заключение
Ansible превращает хаос ручного управления серверами в элегантный автоматизированный процесс. Начните с простых задач — установки пакетов, копирования файлов, управления службами. Постепенно усложняйте плейбуки, добавляя условия, циклы и собственные роли.
Главные преимущества Ansible:
- Низкий порог входа — можно начать использовать за пару часов
- Не требует агентов — работает через SSH
- Идемпотентность — безопасно запускать многократно
- Огромное сообщество и экосистема готовых решений
Используйте Ansible для автоматизации рутинных задач, стандартизации окружений и ускорения развёртывания. Это инвестиция, которая окупится уже через неделю использования, сэкономив часы монотонной работы и снизив количество ошибок.
Начните с малого, экспериментируйте и не бойтесь ошибок — в этом вся прелесть декларативного подхода. Удачи в автоматизации!
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.