Ansible #7: Ansible Galaxy и готовые роли
| Подробности урока | |
|---|---|
| Уровень сложности | Лёгкий |
| Права root | Требуются |
| Требования | Терминал Linux |
| Категория | Настройка ПО |
| Совместимость с ОС | Debian, Ubuntu |
| Примерное время чтения | 40 мин |
Введение
В предыдущей статье мы использовали Ansible Galaxy для установки коллекции community.docker, необходимой для управления Docker-контейнерами. Galaxy позволяет находить и устанавливать готовые компоненты Ansible, которые можно использовать в собственных Playbook.
Это особенно удобно, когда не хочется каждый раз самостоятельно писать одни и те же задачи для установки и настройки программного обеспечения.
В этой статье рассмотрим:
-
что такое Ansible Galaxy;
-
чем отличаются роли и коллекции;
-
как искать готовые компоненты;
-
как устанавливать роли и коллекции;
-
как использовать готовую роль в Playbook;
-
где хранятся установленные компоненты.
Что такое Ansible Galaxy
Ansible Galaxy - это каталог готового содержимого для Ansible.
В нём можно найти:
-
роли;
-
коллекции;
-
готовые компоненты для настройки различных программ и систем.
Например, с помощью Galaxy можно найти готовые решения для:
-
Nginx;
-
Docker;
-
MariaDB;
-
PostgreSQL;
-
Zabbix;
-
Apache;
-
Redis;
-
различных операционных систем.
Вместо того чтобы самостоятельно писать десятки задач, можно найти готовую роль и использовать её в собственном проекте.
Роли и коллекции
Роль - это готовый набор задач, переменных, шаблонов, обработчиков и других файлов для выполнения определённой задачи. Например, роль может полностью устанавливать и настраивать Nginx.
Коллекция - более крупный набор содержимого Ansible. Она может включать:
-
модули;
-
роли;
-
плагины;
-
документацию.
Поэтому роль и коллекция - не одно и то же.
Например, в предыдущей статье мы использовали коллекцию:
community.docker
А внутри коллекции могут находиться различные модули и роли для работы с Docker.
Установка коллекции
Для установки коллекций используется команда:
ansible-galaxy collection install community.docker
После выполнения Ansible скачает коллекцию и установит её на управляющий сервер.
Проверить установленные коллекции:
ansible-galaxy collection list
В списке должна появиться:
community.docker
После этого можно использовать модули коллекции:
community.docker.docker_container:
Поиск ролей
Для поиска готовых ролей используется:
ansible-galaxy search nginx
Например:
ansible-galaxy search docker
Команда покажет найденные роли. Также роли и коллекции можно искать через веб-интерфейс Ansible Galaxy.
Установка роли
Для установки роли используется:
ansible-galaxy role install имя_роли
Например:
ansible-galaxy role install geerlingguy.nginx
После установки роль можно использовать в Playbook.
Использование готовой роли
Создадим Playbook:
---
- name: Установка Nginx
hosts: web
roles:
- geerlingguy.nginx
Ansible выполнит задачи, которые находятся внутри роли. Настройки роли обычно передаются через переменные.
Например:
---
- name: Установка Nginx
hosts: web
vars:
nginx_remove_default_vhost: true
roles:
- geerlingguy.nginx
Конкретный набор переменных зависит от используемой роли.
Перед использованием готовой роли обязательно стоит ознакомиться с её документацией.
Где устанавливаются роли
По умолчанию роли устанавливаются в каталог Ansible Galaxy.
Посмотреть текущие пути можно командой:
ansible-config dump | grep DEFAULT_ROLES_PATH
Также можно указать собственный каталог для ролей.
Например:
/opt/ansible/roles/
Структура проекта может выглядеть так:
/opt/ansible/
├── inventory
├── group_vars/
├── host_vars/
├── roles/
│ └── nginx/
└── site.yml
Установка зависимостей
Если Playbook использует несколько ролей и коллекций, удобно описать их зависимости в отдельном файле.
Для ролей используется:
requirements.yml
Например:
---
roles:
- name: geerlingguy.nginx
Теперь все роли из файла можно установить одной командой:
ansible-galaxy role install -r requirements.yml
Для коллекций:
---
collections:
- name: community.docker
Установка:
ansible-galaxy collection install -r requirements.yml
В одном requirements.yml можно описать и роли, и коллекции:
---
roles:
- name: geerlingguy.nginx
collections:
- name: community.docker
После этого:
ansible-galaxy install -r requirements.yml
Ansible установит все необходимые зависимости.
Почему это удобно
Использование Galaxy особенно полезно при работе с несколькими проектами. Вместо ручной установки каждой зависимости достаточно хранить список в requirements.yml.
Например:
requirements.yml
может описывать всё необходимое для проекта:
---
roles:
- name: geerlingguy.nginx
collections:
- name: community.docker
После переноса проекта на новый сервер достаточно выполнить:
ansible-galaxy install -r requirements.yml
и необходимые компоненты будут установлены.
На что обратить внимание
Готовая роль не означает, что её можно устанавливать и запускать без проверки. Перед использованием стоит посмотреть:
-
автора роли;
-
количество загрузок;
-
дату последнего обновления;
-
поддерживаемые версии ОС;
-
документацию;
-
список переменных;
-
зависимости;
-
исходный код.
Особенно важно понимать, какие изменения роль вносит в систему. После установки роль можно посмотреть в каталоге:
ansible-galaxy role list
А содержимое самой роли - непосредственно в её каталоге.
Практический пример: установка Nginx с помощью готовой роли
До этого мы устанавливали Nginx, создавали конфигурацию и управляли службой самостоятельно. Теперь сделаем то же самое с помощью готовой роли из Ansible Galaxy.
Это хорошо показывает основное преимущество готовых ролей: большая часть стандартных задач уже написана за нас.
Установка роли
Установим роль geerlingguy.nginx:
ansible-galaxy role install geerlingguy.nginx
Проверим, что роль установлена:
ansible-galaxy role list
В списке должна появиться:
Inventory
Для примера добавим сервер в группу web:
[web]
web1 ansible_host=192.168.88.40
Playbook
Создадим файл:
nginx-role.yml
Добавим:
---
- name: Установка Nginx с помощью готовой роли
hosts: web
roles:
- geerlingguy.nginx
Запустим Playbook:
ansible-playbook -i inventory nginx-role.yml
Роль самостоятельно выполнит необходимые задачи для установки и настройки Nginx.
После завершения можно проверить веб-сервер:
ansible -i inventory web -m command -a "systemctl is-active nginx"
Ожидаемый результат:
Передача настроек роли
Готовые роли обычно позволяют изменить своё поведение с помощью переменных.
Например, у роли geerlingguy.nginx можно отключить стандартный виртуальный хост:
---
- name: Установка Nginx с помощью готовой роли
hosts: web
vars:
nginx_remove_default_vhost: true
roles:
- geerlingguy.nginx
Таким образом, саму роль изменять не нужно. Мы передаём ей необходимые параметры из своего Playbook.
Сравнение с ручной настройкой
В предыдущих статьях мы самостоятельно создавали задачи:
- name: Установка Nginx
ansible.builtin.apt:
name: nginx
state: present
Затем отдельно создавали каталоги, конфигурационные файлы, настраивали службу и другие параметры. При использовании готовой роли большая часть этой работы уже выполнена автором роли.
Наш Playbook при этом остаётся небольшим:
---
- name: Установка Nginx с помощью готовой роли
hosts: web
roles:
- geerlingguy.nginx
Это не означает, что готовые роли всегда лучше собственного Playbook. Для простой задачи иногда проще написать несколько задач самостоятельно. Роли особенно полезны, когда требуется сложная и повторяющаяся настройка, которую уже реализовал другой разработчик.
Заключение
Ansible Galaxy позволяет использовать готовые роли и коллекции вместо написания всех компонентов Playbook с нуля. Роли удобно применять для типовых задач, а коллекции позволяют устанавливать дополнительные модули и другие компоненты Ansible.
Для небольших задач можно написать необходимые задачи самостоятельно. Когда проект становится сложнее, готовые роли и коллекции помогают сократить количество собственного кода и упростить поддержку.
В следующей статье вернёмся к написанию собственных Playbook и разберём условия, циклы и обработку ошибок.
Полезные ссылки
-
Ansible Galaxy - каталог ролей и коллекций.
-
Документация Ansible - Galaxy - официальная документация.
-
Ansible - Roles - использование ролей.
-
Ansible - Collections - работа с коллекциями.
-
Ansible - requirements.yml - установка зависимостей из файла.






