Что такое коллекция и зачем разделили ansible-core и контент
Раньше Ansible был одним большим пакетом: движок плюс тысячи модулей в одной поставке. Это стало неподъёмным - релизы редкие, модули разной свежести, всё тащится скопом. Решение - разделение. Теперь есть ansible-core (сам движок, парсер плейбуков, базовый набор ansible.builtin) и коллекции - пакеты с контентом, которые версионируются и обновляются отдельно.
Коллекция (collection) - это способ упаковки и распространения контента: модулей, ролей, плагинов (фильтры, lookup, callback), а заодно документации и тестов. У каждой коллекции есть имя из двух частей: пространство имён (namespace) и собственно имя. Например, ansible.posix - это namespace "ansible" и коллекция "posix". community.general - namespace "community", коллекция "general".
Проверить, что движок и так далее у тебя в системе, и какая версия ansible-core стоит:
Код: Выделить всё
ansible --version
# ansible [core 2.16.x]
ansible-galaxy collection list

FQCN и пространства имён: почему firewalld пишут как ansible.posix.firewalld
FQCN расшифровывается как Fully Qualified Collection Name - полностью квалифицированное имя. Это форма namespace.collection.module, например ansible.posix.firewalld. Почему так? Потому что короткое имя firewalld может встречаться в нескольких коллекциях, и движку нужно знать однозначно, какой именно модуль ты зовёшь.
Модули из ansible.builtin (copy, file, template, service, dnf, user) идут вместе с ansible-core, их ставить не нужно. А вот firewalld, selinux, mount, authorized_key, sysctl живут в ansible.posix - и эту коллекцию надо установить отдельно.
Сравни. Не сработает на чистой системе без коллекции:
Код: Выделить всё
- name: Открыть HTTP в firewalld
ansible.posix.firewalld:
service: http
state: enabled
permanent: true
immediate: true
Код: Выделить всё
- name: Скопировать конфиг
ansible.builtin.copy:
src: app.conf
dest: /etc/app/app.conf
owner: root
group: root
mode: "0644"
Установка: ansible galaxy collection install и requirements.yml
Самый прямой путь - поставить коллекцию из Galaxy:
Код: Выделить всё
ansible-galaxy collection install ansible.posix
ansible-galaxy collection install community.general
Код: Выделить всё
ansible-galaxy collection install ansible.posix:1.5.4
Код: Выделить всё
[defaults]
collections_path = ./collections
Код: Выделить всё
ansible-galaxy collection install ansible.posix -p ./collections
Код: Выделить всё
---
collections:
- name: ansible.posix
version: ">=1.5.0"
- name: community.general
- name: community.crypto
roles:
- name: geerlingguy.nginx
Код: Выделить всё
ansible-galaxy collection install -r requirements.yml
# роли из того же файла:
ansible-galaxy role install -r requirements.yml
Создать свою коллекцию: init, galaxy.yml, build и install
Когда у тебя накопились свои роли и пара плагинов, их удобно упаковать в одну коллекцию и раздавать командой. Чтобы создать коллекцию ansible, есть скелет-генератор:
Код: Выделить всё
ansible-galaxy collection init mycompany.infra
Код: Выделить всё
mycompany/
infra/
galaxy.yml
README.md
docs/
plugins/
roles/
meta/
Код: Выделить всё
namespace: mycompany
name: infra
version: 1.0.0
readme: README.md
authors:
- Ivan Admin <ivan@example.com>
description: Внутренние роли и модули инфраструктуры
license:
- GPL-2.0-or-later
tags:
- linux
- rhel
dependencies:
ansible.posix: ">=1.5.0"
repository: https://git.example.com/mycompany/infra
Код: Выделить всё
ansible-galaxy collection build
# создаст mycompany-infra-1.0.0.tar.gz
Код: Выделить всё
ansible-galaxy collection install mycompany-infra-1.0.0.tar.gz -p ./collections
Типичные грабли
- Ошибка "couldn't resolve module/action 'firewalld'" - коллекция ansible.posix не установлена либо лежит вне collections_path. Лечится install и проверкой ansible-galaxy collection list.
- Путаница в requirements.yml: коллекции идут под ключом collections, роли под roles. Если свалить роль в секцию collections, получишь невнятную ошибку.
- ansible-galaxy collection install -r ставит только коллекции. Роли из того же файла надо отдельно: ansible-galaxy role install -r requirements.yml. Это частая засада на экзамене.
- Коллекция установлена для одного пользователя (~/.ansible), а плейбук запускается из-под другого или из CI - и она "пропадает". Используй collections_path в проекте.
- При сборке своей коллекции забывают поднять version в galaxy.yml - install не перезатрёт уже установленную ту же версию, и кажется, что правки не приехали. Используй опцию --force при отладке.
- Неверный license: должен быть валидный SPDX-идентификатор (GPL-2.0-or-later, MIT), произвольную строку build не пропустит.
- Проверь версию: ansible --version и ansible-galaxy collection list. Найди, есть ли уже ansible.posix.
- Создай requirements.yml с ansible.posix и community.general, поставь обе в локальный ./collections через -p.
- Пропиши collections_path = ./collections в ansible.cfg и напиши плейбук с ansible.posix.firewalld (открой http). Запусти, добейся идемпотентности (второй прогон - changed=0).
- Сделай ansible-galaxy collection init mycompany.infra, положи в roles/ простую роль, заполни galaxy.yml, собери build и установи тарбол. Вызови роль по FQCN mycompany.infra.имя.
- Что такое FQCN и почему firewalld надо писать как ansible.posix.firewalld, а copy можно как ansible.builtin.copy без установки?
- Чем отличается секция collections от roles в requirements.yml и какими двумя командами они ставятся?
- Какой параметр в ansible.cfg задаёт, где Ansible ищет коллекции, и зачем держать их в каталоге проекта?
- Какие шаги нужны, чтобы создать коллекцию ansible с нуля и установить её на другую машину (перечисли команды)?
Коллекции - это модульная упаковка контента Ansible с версиями и пространствами имён. ansible-builtin едет с движком, а всё остальное (ansible.posix, community.general) ставится через ansible-galaxy collection install, лучше через requirements.yml с фиксацией версий и collections_path внутри проекта. Для RHCE/EX294 обязательны ansible.posix (firewalld, selinux, mount, authorized_key) и уверенная установка коллекций - на этом срезаются чаще всего. А когда своих ролей становится много, init, build и install превращают их в переносимую коллекцию.