Автоматизация инфраструктуры — не роскошь, а необходимость в современном DevOps-цикле. Конфигурация серверов, установка пакетов, деплой приложений и масштабирование ресурсов вручную не только утомительны, но и подвержены ошибкам. Чтобы устранить хаос и повысить воспроизводимость, в дело вступает Ansible.
Ansible — это open-source-инструмент для автоматизации задач администрирования, написанный на Python. Он не требует установки агентов, использует YAML и SSH, а также имеет простую, читаемую синтаксическую структуру. Его используют компании уровня NASA, Twitter, и Red Hat.
В этом материале — полное погружение в Ansible: теория, структура, методы, функции, плейбуки, примеры и API-интеграции.
Основная часть
Что такое Ansible
Краткое определение
Ansible — это инструмент автоматизации конфигураций, управления серверами, оркестрации и деплоя. Написан на Python и использует YAML как DSL для описания задач.
Преимущества
-
Безагентная архитектура
-
Использует SSH
-
Простота синтаксиса (YAML)
-
Расширяемость через Python-модули
-
Поддержка Windows и Linux
Установка
pip install ansible
Или через пакетный менеджер:
sudo apt install ansible
Архитектура Ansible
Основные компоненты
Компонент | Назначение |
---|---|
Inventory | Список управляемых хостов |
Playbook | Набор задач в YAML-файле |
Module | Отдельная операция (копирование, установка) |
Role | Переиспользуемая логическая структура задач |
Variable | Переменные, шаблоны |
Plugin | Расширение поведения (callback, connection) |
Inventory (инвентори)
[web]
web1 ansible_host=192.168.1.10
web2 ansible_host=192.168.1.11
Основы Playbook
Playbook — это сценарий в YAML-формате, описывающий задачи и их порядок.
Пример
- name: Установка Nginx
hosts: web
become: true
tasks:
- name: Установка пакета
apt:
name: nginx
state: present
Структура
-
name
: описание задачи -
hosts
: цель (группа из inventory) -
tasks
: список действий -
become
: использованиеsudo
Модули Ansible
Модули — единицы логики: копирование файлов, перезапуск сервиса и т.д. Поставляются по умолчанию или пишутся самостоятельно.
Популярные модули
Модуль | Назначение |
apt |
Управление пакетами (Debian) |
yum |
Пакеты в RedHat/CentOS |
copy |
Копирование файлов |
template |
Jinja2-шаблоны |
service |
Управление службами |
command |
Выполнение shell-команд |
Пример copy
- name: Копирование index.html
copy:
src: ./index.html
dest: /var/www/html/index.html
Переменные и шаблоны
Переменные можно задавать в playbook, в инвентори, через CLI или в vars-файлах. Шаблоны — через Jinja2.
Пример
vars:
app_port: 8080
Jinja2-шаблон (template.j2)
server {
listen {{ app_port }};
}
Роли и структуры
Роли позволяют разделить логику на повторно используемые компоненты.
ansible-galaxy init myrole
Создаётся структура:
myrole/
├── tasks/main.yml
├── handlers/main.yml
├── templates/
├── vars/main.yml
В playbook:
roles:
- myrole
Ansible и Python API
Ansible может использоваться программно через ansible-runner
и ansible.inventory.manager
.
Пример вызова playbook через Python
import ansible_runner
r = ansible_runner.run(private_data_dir='/tmp/demo', playbook='site.yml')
print(r.status)
print(r.rc)
Работа с инвентарём
from ansible.parsing.dataloader import DataLoader
from ansible.inventory.manager import InventoryManager
loader = DataLoader()
inventory = InventoryManager(loader=loader, sources='hosts.ini')
Ansible Galaxy и коллекции
Ansible Galaxy — хранилище ролей и коллекций.
ansible-galaxy install geerlingguy.mysql
В playbook:
roles:
- geerlingguy.mysql
CI/CD с Ansible
Ansible интегрируется с Jenkins, GitLab, GitHub Actions.
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Установка Ansible
run: sudo apt install ansible -y
- name: Деплой
run: ansible-playbook -i inventory site.yml
Безопасность
-
Используйте
ansible-vault
для хранения секретов -
Применяйте минимальные привилегии
-
Логируйте выполнение
ansible-vault encrypt secrets.yml
Ошибки и отладка
Запуск с подробным выводом:
ansible-playbook -vvv site.yml
Проверка синтаксиса:
ansible-playbook --syntax-check site.yml
Сравнение с другими инструментами
Инструмент | Агент | Язык | Подходит для |
Ansible | Нет | YAML+Python | Универсальная DevOps-автоматизация |
Puppet | Да | Puppet DSL | Большие инфраструктуры |
Chef | Да | Ruby | Сложные сценарии |
SaltStack | Да | YAML | Реактивные системы |
Основные компоненты Ansible Python API
-
ansible-core
— базовая библиотека для работы с Ansible. -
ansible-runner
— запуск Ansible playbooks и ad-hoc команд из Python. -
ansible.module_utils
— утилиты для написания кастомных модулей. -
ansible.inventory
— управление инвентарём. -
ansible.playbook
— работа с playbooks.
1. ansible-core
— базовые функции
Основные классы и функции
Класс/Функция | Описание |
---|---|
ansible.constants |
Глобальные константы Ansible (настройки). |
ansible.errors |
Исключения Ansible (AnsibleError , AnsibleParserError ). |
ansible.executor |
Исполнение задач (TaskExecutor ). |
ansible.parsing |
Парсинг YAML и JSON (DataLoader ). |
ansible.plugins |
Загрузка плагинов (PluginLoader ). |
ansible.template |
Шаблонизация Jinja2 (Templar ). |
Пример использования
from ansible.parsing.dataloader import DataLoader from ansible.inventory.manager import InventoryManager loader = DataLoader() inventory = InventoryManager(loader=loader, sources='hosts.ini') print(inventory.list_hosts()) # Список хостов
2. ansible-runner
— запуск Ansible из Python
Библиотека для выполнения playbooks и ad-hoc команд.
Основные функции
Функция | Описание |
---|---|
run() |
Запуск playbook или модуля. |
run_async() |
Асинхронный запуск. |
get_inventory() |
Получение инвентаря. |
Пример
import ansible_runner result = ansible_runner.run( inventory='hosts.ini', module='ping', host_pattern='all' ) print(result.stats) # Статистика выполнения
3. ansible.module_utils
— создание кастомных модулей
Используется для написания своих модулей Ansible.
Основные модули
Модуль | Описание |
---|---|
basic.AnsibleModule |
Базовый класс для модулей. |
common.collections |
Работа с коллекциями. |
common.parameters |
Парсинг параметров. |
Пример модуля
from ansible.module_utils.basic import AnsibleModule def main(): module = AnsibleModule( argument_spec=dict( name=dict(type='str', required=True), enabled=dict(type='bool', default=True) ) ) name = module.params['name'] module.exit_json(changed=True, msg=f"Hello, {name}!") if __name__ == '__main__': main()
4. ansible.inventory
— управление инвентарём
Работа с хостами и группами.
Основные классы
Класс | Описание |
---|---|
InventoryManager |
Управление инвентарём. |
Host |
Описание хоста. |
Group |
Описание группы. |
Пример
from ansible.inventory.manager import InventoryManager from ansible.parsing.dataloader import DataLoader loader = DataLoader() inventory = InventoryManager(loader=loader, sources='hosts.ini') for host in inventory.get_hosts(): print(host.name, host.vars)
5. ansible.playbook
— выполнение playbooks
Основные классы
Класс | Описание |
---|---|
PlaybookExecutor |
Запуск playbook. |
Play |
Отдельный play. |
Task |
Задача в playbook. |
Пример
from ansible.playbook import Playbook from ansible import context context.CLIARGS = {'inventory': 'hosts.ini'} pb = Playbook.load('deploy.yml', loader=DataLoader()) pb.run()
6. Дополнительные модули
1. ansible.vars
— управление переменными
from ansible.vars.manager import VariableManager vars = VariableManager(loader=DataLoader(), inventory=inventory) print(vars.get_vars())
2. ansible.galaxy
— работа с коллекциями
from ansible.galaxy.collection import CollectionRequirement col = CollectionRequirement.from_name('community.general') col.install()
3. ansible.utils
— вспомогательные утилиты
from ansible.utils.display import Display display = Display() display.warning("Это предупреждение!")
Пример: запуск playbook из Python
from ansible import context from ansible.executor.playbook_executor import PlaybookExecutor from ansible.inventory.manager import InventoryManager from ansible.parsing.dataloader import DataLoader loader = DataLoader() inventory = InventoryManager(loader=loader, sources='hosts.ini') context.CLIARGS = {'inventory': inventory} executor = PlaybookExecutor( playbooks=['deploy.yml'], inventory=inventory, loader=loader, passwords={} ) executor.run()
Заключение
Ansible — это мощный, но простой инструмент автоматизации инфраструктуры. Он сочетает читаемость YAML, гибкость Python, мощные модули и бесагентную архитектуру. Для DevOps-инженеров и разработчиков Ansible остаётся одним из лучших выборов для управления конфигурацией, деплоем и масштабируемостью.