Ansible Collection Development
Ansible Collection Development — это процесс создания, упаковки и распространения наборов модулей, плагинов, ролей и других компонентов для системы управления конфигурациями Ansible, объединённых в единую коллекцию. Коллекции (collections) представляют собой стандартный способ распространения контента Ansible, начиная с версии 2.9, и являются основным форматом для публикации пользовательских расширений в Ansible Galaxy и Automation Hub.
История и предпосылки
До появления коллекций весь контент для Ansible (модули, плагины, роли) распространялся либо в составе основного пакета ansible-base (позже ansible-core), либо в виде отдельных ролей на Ansible Galaxy. Это создавало проблемы с версионированием, зависимостями и поддержкой: любое изменение в модуле требовало обновления всего пакета, а сторонние разработчики не имели удобного способа упаковки своих расширений.
В 2019 году с выходом Ansible 2.9 была введена концепция коллекций, а в 2020 году в Ansible 2.10 коллекции стали основным способом распространения контента. Основной пакет ansible был разделён на ansible-core (ядро) и набор коллекций, которые можно устанавливать независимо. Это позволило сообществу и вендорам (например, Cisco, Red Hat, VMware) выпускать собственные коллекции с модулями для своих продуктов, не дожидаясь включения в основной релиз.
Структура коллекции
Коллекция имеет строго определённую файловую структуру, которая обеспечивает автоматическое обнаружение и загрузку компонентов Ansible. Минимальная структура включает:
`` my_namespace/ └── my_collection/ ├── docs/ ├── galaxy.yml ├── meta (организация признана экстремистской, деятельность запрещена в РФ)/ │ └── runtime.yml ├── plugins/ │ ├── modules/ │ ├── inventory/ │ ├── lookup/ │ ├── filter/ │ └── callback/ ├── roles/ ├── playbooks/ ├── tests/ └── README.md ``
Основные компоненты
- galaxy.yml — мета-файл в формате YAML, содержащий информацию о коллекции: имя, версию, автора, лицензию, зависимости от других коллекций и теги. Этот файл обязателен для публикации.
- meta/runtime.yml — файл, определяющий требования к версии Ansible, совместимость с платформами и настройки выполнения (например,
requires_ansible). - plugins/ — директория, содержащая поддиректории для каждого типа плагинов:
modules/,inventory/,lookup/,filter/,callback/,connection/,vars/и другие. Каждый плагин представляет собой файл Python (или другой язык, поддерживаемый Ansible). - roles/ — директория для ролей Ansible, которые могут быть включены в коллекцию. Каждая роль имеет собственную структуру (tasks, handlers, vars, defaults, templates, files).
- playbooks/ — директория для примеров плейбуков, демонстрирующих использование коллекции.
- tests/ — директория для тестов (обычно с использованием
ansible-test).
Процесс разработки
Инициализация
Разработка коллекции начинается с создания скелета. Для этого используется команда ansible-galaxy collection init:
``bash ansible-galaxy collection init my_namespace.my_collection ``
Эта команда создаёт базовую структуру с файлом galaxy.yml и пустыми директориями. После этого разработчик может добавлять модули, плагины и роли.
Разработка модулей
Модули являются основным типом плагинов и пишутся на Python. Каждый модуль должен содержать:
- Документацию в формате DOCUMENTATION (строка YAML внутри модуля).
- Примеры использования (EXAMPLES).
- Возвращаемые значения (RETURN).
Пример минимального модуля my_module.py:
```python
!/usr/bin/python
-- coding: utf-8 --
from ansible.module_utils.basic import AnsibleModule
DOCUMENTATION = r''' --- module: my_module short_description: Пример модуля description: Этот модуль выполняет простую операцию. options: name: description: Имя для вывода. required: true type: str '''
EXAMPLES = r'''
- name: Пример использования модуля
my_namespace.my_collection.my_module: name: "World" '''
RETURN = r''' message: description: Сообщение с приветствием. returned: always type: str sample: "Hello, World!" '''
def run_module(): module = AnsibleModule( argument_spec=dict( name=dict(type='str', required=True) ) ) result = dict( changed=False, message=f"Hello, {module.params['name']}!" ) module.exit_json(**result)
def main(): run_module()
if __name__ == '__main__': main() ```
Разработка ролей
Роли в коллекции создаются в директории roles/. Каждая роль имеет стандартную структуру:
`` roles/my_role/ ├── tasks/ │ └── main.yml ├── handlers/ │ └── main.yml ├── defaults/ │ └── main.yml ├── vars/ │ └── main.yml ├── templates/ ├── files/ ├── meta/ │ └── main.yml └── README.md ``
Роль может быть вызвана из плейбука с указанием полного имени коллекции:
```yaml
- name: Применить роль
hosts: all roles:
- my_namespace.my_collection.my_role
```
Тестирование
Для тестирования коллекций используется утилита ansible-test, входящая в состав ansible-core. Она позволяет запускать:
- Синтаксические проверки (sanity tests).
- Модульные тесты (unit tests) на базе pytest.
- Интеграционные тесты (integration tests), которые выполняются на реальных или виртуальных машинах.
Тесты размещаются в директории tests/:
`` tests/ ├── sanity/ │ └── ignore.txt ├── unit/ │ └── plugins/ │ └── modules/ │ └── test_my_module.py └── integration/ └── targets/ └── my_module/ ├── tasks/ │ └── main.yml └── vars/ └── main.yml ``
Версионирование
Коллекции следуют семантическому версионированию (SemVer) в формате MAJOR.MINOR.PATCH. Версия указывается в galaxy.yml. При публикации новой версии необходимо:
- Увеличить номер версии.
- Создать Git-тег.
- Запустить сборку командой
ansible-galaxy collection build. - Опубликовать архив на Ansible Galaxy или Automation Hub.
Публикация и распространение
Ansible Galaxy
Ansible Galaxy — публичный репозиторий коллекций, поддерживаемый Red Hat. Публикация выполняется командой:
``bash ansible-galaxy collection publish ./my_namespace-my_collection-1.0.0.tar.gz ``
Для публикации требуется API-ключ, который можно получить в настройках учётной записи на galaxy.ansible.com.
Automation Hub
Automation Hub — корпоративный репозиторий, входящий в состав Red Hat Ansible Automation Platform. Публикация в него обычно выполняется через веб-интерфейс или CI/CD-пайплайны с использованием токенов аутентификации.
Установка коллекции
Пользователи устанавливают коллекции командой:
``bash ansible-galaxy collection install my_namespace.my_collection ``
Коллекция может быть установлена из Galaxy, Automation Hub, локального архива или Git-репозитория.
Зависимости и требования
Коллекции могут зависеть от других коллекций. Зависимости указываются в galaxy.yml:
``yaml dependencies: "community.general": ">=5.0.0" "ansible.netcommon": "*" ``
При установке коллекции Ansible автоматически загружает все указанные зависимости.
Инструменты и лучшие практики
Инструменты разработки
- ansible-lint — статический анализатор кода, проверяющий плейбуки, роли и коллекции на соответствие лучшим практикам.
- molecule — фреймворк для тестирования ролей, поддерживающий различные провайдеры (Docker, Vagrant, OpenStack).
- pre-commit — хуки для автоматической проверки перед коммитом (например, проверка синтаксиса YAML, форматирование Python).
Лучшие практики
- Использовать неймспейсы, отражающие организацию или проект (например,
cisco.ios,redhat.satellite). - Документировать каждый модуль и роль в формате DOCUMENTATION.
- Писать тесты для всех модулей и ролей.
- Следовать семантическому версионированию.
- Указывать минимальную версию
ansible-coreвmeta/runtime.yml. - Использовать CI/CD (например, GitHub Actions) для автоматической сборки, тестирования и публикации.
Ограничения и особенности
- Коллекции не могут переопределять встроенные модули Ansible (например,
ansible.builtin.copy). - Для использования коллекции на управляемых узлах не требуется установка дополнительного ПО — модули выполняются на control node.
- Коллекции могут содержать плагины на Python, PowerShell (для Windows) и других языках, поддерживаемых Ansible.
- Размер коллекции ограничен (рекомендуется не более 50 МБ для публикации на Galaxy).
Примеры известных коллекций
- community.general — обширная коллекция от сообщества, включающая модули для различных систем.
- cisco.ios — коллекция для управления устройствами Cisco IOS.
- redhat.satellite — коллекция для Red Hat Satellite.
- kubernetes.core — коллекция для управления Kubernetes.
- amazon.aws — коллекция для Amazon Web Services.
Источники
- Ansible Documentation. «Developing Collections» (docs.ansible.com).
- Red Hat. «Ansible Collection Structure and Development» (access.redhat.com).
- Ansible Galaxy User Guide (galaxy.ansible.com).
- «Ansible for DevOps» by Jeff Geerling (2022).
- Ansible Community. «Collection Requirements and Best Practices» (github.com/ansible-collections).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →