Кастомные модули
Тема дорожной карты · Ansible
Пользовательские модули Ansible — это Python-скрипты, расширяющие встроенную библиотеку модулей Ansible для автоматизации задач, для которых не существует стандартного модуля, — например, взаимодействие с проприетарными API, управление пользовательскими операциями с базами данных или интеграция с внутренними инструментами. Пользовательский модуль помещается в каталог library/ проекта playbook или в подкаталог library/ role, и Ansible автоматически обнаруживает его и делает доступным по имени файла модуля как ключевое слово задачи. Пользовательские модули используют вспомогательный класс AnsibleModule из ansible.module_utils.basic для единообразной обработки аргументов, сообщений об ошибках и структуры результата changed/failed — так же, как у встроенных модулей. Для повторного использования в разных проектах пользовательские модули Ansible следует упаковывать в collection Ansible, документировать с помощью блока DOCUMENTATION по стандартной схеме и проверять через ansible-test sanity для обеспечения совместимости с тестовым фреймворком Ansible.
Как это работает
Кастомные модули покрывает условия (when:), циклы (loop:/with_items:), error handling (block/rescue/always, failed_when, changed_when), делегирование (delegate_to: localhost для запуска задачи на контроллере), async-задачи (async: 60 poll: 5 для долгих операций), кеширование facts (fact_caching = redis), разработку filter/lookup/callback-плагинов. Ansible — настоящий DSL с серьёзной программируемостью.
Когда применять
block/rescue/always вместо ignore_errors для нормального error handling. async — для задач дольше SSH-таймаута (миграции БД, сборка образов). delegate_to — для "сделать на load balancer" посреди play. Кеширование facts в Redis — при большом inventory + медленных gather_facts.
Типичные ошибки
Ловушки Кастомные модули: сложный Jinja2 + Ansible-специфика (when: var is defined and var | length > 0 — порядок важен, is defined первым для short-circuit); чрезмерный delegate_to ("магия на расстоянии"); loop с очень большими списками = медленный запуск + рост памяти (используйте batch: или chunked-плейбуки); сбор facts на каждом play в долгом запуске (поставьте gather_facts: false после первого play).