Модуль Ansible
Модуль Ansible — это автономная единица кода, предназначенная для выполнения определённого действия на управляемом узле (целевом хосте) в рамках системы управления конфигурациями Ansible. Модули являются основным строительным блоком плейбуков (playbooks) и ad-hoc команд, обеспечивая декларативное или императивное управление состоянием системы, приложений и сетевых устройств. Каждый модуль реализует конкретную задачу: установку пакета, копирование файла, управление пользователем, перезапуск службы, выполнение команды или взаимодействие с облачным API.
История и происхождение
Ansible был создан Майклом ДеХааном (Michael DeHaan) и впервые выпущен в 2012 году. Изначально проект развивался как более простая альтернатива сложным системам управления конфигурациями, таким как Puppet, Chef и SaltStack. Ключевой идеей было отсутствие необходимости в установке агента на управляемые узлы — Ansible использует SSH (или WinRM для Windows) и выполняет модули, которые после завершения работы удаляются.
Первые версии Ansible включали небольшой набор модулей для базовых операций (command, shell, copy, file, yum, apt). По мере роста популярности инструмента сообщество начало активно разрабатывать новые модули. В 2015 году Red Hat приобрела компанию Ansible, что привело к значительному расширению штата разработчиков и ускорению выпуска модулей для облачных платформ (AWS, Azure, GCP), сетевого оборудования (Cisco, Juniper, Arista) и контейнерных технологий (Docker, Kubernetes).
Классификация модулей
Модули Ansible классифицируются по нескольким признакам: по типу управляемого объекта, по способу выполнения, по источнику распространения.
По типу управляемого объекта
- Системные модули: управляют базовыми ресурсами операционной системы. Примеры:
user(создание/удаление пользователей),group(управление группами),service(запуск/остановка служб),mount(монтирование файловых систем),firewalld(настройка брандмауэра). - Модули управления пакетами: устанавливают, обновляют и удаляют программное обеспечение. Примеры:
apt(Debian/Ubuntu),yum(RHEL/CentOS 7),dnf(RHEL/CentOS 8+),pip(Python-пакеты),gem(Ruby-гемы). - Файловые модули: работают с файлами и каталогами. Примеры:
copy(копирование файла с управляющего узла),template(копирование файла с подстановкой переменных Jinja2),lineinfile(управление строками в текстовом файле),fetch(скачивание файла с управляемого узла). - Модули для работы с базами данных: управляют СУБД. Примеры:
mysql_db,postgresql_db,mongodb_user. - Сетевые модули: управляют конфигурацией сетевого оборудования. Примеры:
ios_config(Cisco IOS),junos_config(Juniper Junos),eos_config(Arista EOS). - Облачные модули: взаимодействуют с API облачных провайдеров. Примеры:
ec2(AWS),azure_rm_virtualmachine(Azure),gcp_compute_instance(GCP). - Модули для управления контейнерами: работают с Docker, Podman, Kubernetes. Примеры:
docker_container,k8s,helm. - Модули мониторинга и уведомлений: взаимодействуют с системами мониторинга. Примеры:
datadog_monitor,zabbix_host,slack(отправка уведомлений).
По способу выполнения
- Прямые (action) модули: выполняются на управляющем узле (control node), а не на целевом хосте. Используются для операций, которые не могут быть выполнены через SSH, например,
fetch(скачивание файла),wait_for(ожидание открытия порта),template(генерация файла на control node). - Модули с возвратом фактов (facts): собирают информацию о системе. Модуль
setupавтоматически выполняется в начале каждого плейбука и собирает факты (IP-адреса, версия ОС, архитектура, объём памяти и т.д.). Пользовательские модули также могут возвращать факты. - Модули с идемпотентностью: большинство модулей Ansible являются идемпотентными — многократное применение одного и того же модуля с одинаковыми параметрами приводит к одному и тому же результату, не вызывая побочных эффектов. Например, если модуль
userуже создал пользователя, повторный запуск не изменит состояние системы, если параметры не были изменены.
По источнику распространения
- Встроенные модули (core modules): поставляются в составе пакета Ansible. Включают наиболее востребованные модули, поддерживаемые командой разработчиков Red Hat.
- Модули из коллекций (collections): начиная с Ansible 2.9, модули распространяются в виде коллекций. Коллекция — это пакет, содержащий модули, роли, плагины и документацию. Коллекции могут быть официальными (например,
community.general,ansible.windows) или сторонними (например,cisco.ios,netapp.ontap). Установка коллекции выполняется командойansible-galaxy collection install. - Пользовательские модули: могут быть написаны на любом языке программирования, который поддерживает вывод JSON в stdout (Python, Bash, Ruby, PowerShell). Модуль должен быть помещён в директорию
libraryрядом с плейбуком или в глобальную директорию модулей, указанную в конфигурации Ansible.
Устройство и структура модуля
Модуль Ansible — это исполняемый скрипт, который принимает аргументы в формате JSON (через stdin) и возвращает результат в формате JSON (через stdout). Основные элементы модуля:
- Аргументы: модуль определяет набор принимаемых параметров с указанием их типов и обязательности. Например, модуль
copyпринимает параметрыsrc(источник),dest(назначение),owner,group,mode. - Логика выполнения: код, который выполняет требуемое действие на целевом хосте. Модуль может использовать системные утилиты, библиотеки Python или PowerShell.
- Возвращаемое значение: модуль должен вернуть словарь JSON с ключами
changed(True/False),failed(True/False),msg(сообщение),ansible_facts(дополнительные факты) и другими данными, специфичными для модуля.
Пример упрощённого модуля на Python:
```python
!/usr/bin/python
from ansible.module_utils.basic import AnsibleModule
def main(): module = AnsibleModule( argument_spec=dict( name=dict(type='str', required=True), state=dict(type='str', default='present', choices=['present', 'absent']) ) ) name = module.params['name'] state = module.params['state']
Логика проверки и изменения состояния
if state == 'present':
Создать ресурс
module.exit_json(changed=True, msg=f"Resource {name} created") else:
Удалить ресурс
module.exit_json(changed=False, msg=f"Resource {name} already absent")
if __name__ == '__main__': main() ```
Применение в плейбуках
Модули используются в задачах (tasks) плейбуков. Каждая задача ссылается на один модуль и передаёт ему параметры. Пример плейбука, использующего несколько модулей:
```yaml
- name: Установка и настройка веб-сервера
hosts: webservers become: yes tasks:
- name: Установить Nginx
apt: name: nginx state: present
- name: Скопировать конфигурационный файл
template: src: nginx.conf.j2 dest: /etc/nginx/nginx.conf notify: restart nginx
- name: Запустить и включить Nginx
service: name: nginx state: started enabled: yes
handlers:
- name: restart nginx
service: name: nginx state: restarted ```
В этом примере используются модули apt, template и service. Модуль template также генерирует файл на основе шаблона Jinja2.
Разработка и тестирование
Создание собственного модуля требует понимания API Ansible. Рекомендуется использовать утилиту ansible-doc -l для просмотра списка доступных модулей, а ansible-doc <имя_модуля> для получения справки. Для тестирования модуля можно использовать команду ansible -m <модуль> -a "<параметры>" <хост>.
Тестирование модулей обычно включает:
- Проверку идемпотентности (повторный запуск не должен изменять состояние).
- Проверку корректной обработки ошибок (неверные параметры, отсутствие прав).
- Проверку возвращаемых значений.
Критика и ограничения
Несмотря на широкую распространённость, модули Ansible имеют ряд недостатков:
- Зависимость от Python на управляемом узле: для выполнения большинства модулей на целевом хосте должен быть установлен Python (версия 2.6+ или 3.5+). Для Windows требуется PowerShell 3.0+. Это ограничивает применение на встраиваемых системах или минимальных образах контейнеров.
- Сложность отладки: при возникновении ошибки модуль возвращает JSON, но не всегда предоставляет достаточную информацию для диагностики. Логирование на управляемом узле может быть ограничено.
- Производительность: для выполнения каждого модуля Ansible устанавливает SSH-соединение, копирует модуль на целевой хост и запускает его. При большом количестве задач (сотни) это может приводить к значительным задержкам.
- Разрастание коллекций: с переходом на коллекции количество модулей резко возросло, что усложняет поиск нужного модуля и поддержание актуальной документации.
Примеры популярных модулей
command— выполняет произвольную команду на целевом хосте. Не идемпотентен (всегда возвращаетchanged=True).shell— аналогиченcommand, но запускает команду через оболочку/bin/sh, поддерживает перенаправление ввода/вывода, конвейеры.copy— копирует файл с управляющего узла на целевой. Идемпотентен (сравнивает контрольную сумму).file— управляет атрибутами файлов и каталогов (права доступа, владелец, тип).yum/apt— управление пакетами в дистрибутивах Linux.uri— выполняет HTTP-запросы (GET, POST, PUT, DELETE) к веб-сервисам.debug— выводит сообщение в лог выполнения плейбука, используется для отладки.assert— проверяет выполнение заданных условий (например, что переменная определена).
Источники
- Официальная документация Ansible — раздел «Модули» (Ansible Documentation).
- Книга «Ansible: Up and Running» (Lorin Hochstein, René Moser).
- Репозиторий Ansible на GitHub (github.com/ansible/ansible).
- Документация коллекций Ansible Galaxy (galaxy.ansible.com).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →