Ansible – автоматизация DevOps

онлайн тренажер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Автоматизация инфраструктуры — не роскошь, а необходимость в современном 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

  1. ansible-core — базовая библиотека для работы с Ansible.

  2. ansible-runner — запуск Ansible playbooks и ad-hoc команд из Python.

  3. ansible.module_utils — утилиты для написания кастомных модулей.

  4. ansible.inventory — управление инвентарём.

  5. ansible.playbook — работа с playbooks.


1. ansible-core — базовые функции

Основные классы и функции

Класс/Функция Описание
ansible.constants Глобальные константы Ansible (настройки).
ansible.errors Исключения Ansible (AnsibleErrorAnsibleParserError).
ansible.executor Исполнение задач (TaskExecutor).
ansible.parsing Парсинг YAML и JSON (DataLoader).
ansible.plugins Загрузка плагинов (PluginLoader).
ansible.template Шаблонизация Jinja2 (Templar).

Пример использования

python
 
Copy
 
Download
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() Получение инвентаря.

Пример

python
 
Copy
 
Download
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 Парсинг параметров.

Пример модуля

python
 
Copy
 
Download
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 Описание группы.

Пример

python
 
Copy
 
Download
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.

Пример

python
 
Copy
 
Download
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 — управление переменными

python
 
Copy
 
Download
from ansible.vars.manager import VariableManager

vars = VariableManager(loader=DataLoader(), inventory=inventory)
print(vars.get_vars())

2. ansible.galaxy — работа с коллекциями

python
 
Copy
 
Download
from ansible.galaxy.collection import CollectionRequirement

col = CollectionRequirement.from_name('community.general')
col.install()

3. ansible.utils — вспомогательные утилиты

python
 
Copy
 
Download
from ansible.utils.display import Display

display = Display()
display.warning("Это предупреждение!")

Пример: запуск playbook из Python

python
 
Copy
 
Download
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 остаётся одним из лучших выборов для управления конфигурацией, деплоем и масштабируемостью.

Новости