Задачи, которые решаются с помощью Ansible, часто повторяются у разных людей и команд. Как и в случае программирования, где общий код выделяют в библиотеку, Ansible выделяет повторяющиеся вещи в роли. Эти роли выкладываются в общий каталог, через который любой человек может найти себе готовое решение по установке и настройке чего-либо.
Роль представляет собой набор задач, обработчик, переменных, файлов и других артефактов, которые распространяются и подключаются как единое целое к плейбуку. Обычно, роли выполняют достаточно высокоуровневые задачи, например установку баз данных, веб-серверов и тому подобное. Иногда они автоматизируют работу с каким-то низкоуровневым сервисом, который не встроен в сам Ansible.
Возьмем для примера веб-сервер Nginx. Для его установки в Ansible Galaxy можно найти множество ролей от разных разработчиков, среди которых есть и официальная, разрабатываемая компанией NGINX. Вот ее страничка. Здесь мы видим описание и инструкцию для установки. Разберем их.
Первый шаг – установка роли. Она выполняется с помощью команды ansible-galaxy
:
ansible-galaxy install nginxinc.nginx
Имя роли состоит из двух частей. Неймспейс, который обычно совпадает с именем пользователя на github и собственно имени роли, в данном случае nginx. Таким образом избегаются коллизии имен.
Второй шаг - подключение. Роли добавляются в плейбук через ключ roles
:
- hosts: all
roles:
- role: nginxinc.nginx
tasks: ...
Ansible начинает выполнять роли до tasks
независимо от порядка организации верхнеуровневых ключей в плейбуке. Но иногда требуется выполнить какие-то подготовительные действия до выполнения роли. В таком случае есть два варианта.
Добавить подготовительные задачи в pre_tasks
:
- hosts: all
pre_tasks: # Выполняются до ролей
# Тут список задач
- name: Какая-то задача
ansible.builtin.shell: # Делаем что-нибудь
roles:
- role: nginxinc.nginx
- role: # какая-нибудь другая роль
tasks: # Выполняются после ролей
# Тут список задач
Добавлять роли через import_role
- hosts: all
tasks:
- name: Какая-то задача
ansible.builtin.shell: # Делаем что-нибудь
- name: Ставим nginx через роль
import_role:
name: nginxinc.nginx
- name: Какая-то задача
ansible.builtin.shell: # Делаем что-нибудь
Роли стараются делать достаточно общими, чтобы их можно было использовать в разных ситуациях. Для этого, внутри роли определяются переменные, с помощью которых можно управлять поведением, например, способом установки, версией пакета и так далее. Переменные, которые для этого созданы можно найти в директории defaults/
в репозитории самой роли. Пример из Nginx:
# Enable NGINX and NGINX modules.
# Variables for these options can be found below.
# Default is true.
nginx_enable: true
# Print NGINX configuration file to terminal after executing playbook.
nginx_debug_output: false
# Install NGINX Dynamic Modules.
# You can select any of the dynamic modules listed below. Beware of NGINX Plus only dynamic modules (these are marked).
# Format is list with either the dynamic module name or a dictionary (see njs for an example).
# When using a dictionary, the default value for state is present, and for version it's nginx_version if specified.
# Default is an empty list (no dynamic modules are installed).
nginx_modules: []
# - auth-spnego # NGINX Plus
# - brotli # NGINX Plus
# - cookie-flag # NGINX Plus
# - encrypted-session # NGINX Plus
# - geoip
Переопределяются эти переменные через ключ vars
:
# roles
- hosts: all
roles:
- role: nginxinc.nginx
vars:
nginx_debug_output: true
nginx_modules:
- geoip
# import_role
- hosts: all
tasks:
- import_role:
name: nginxinc.nginx
vars:
nginx_debug_output: true
nginx_modules:
- geoip
Ansible умеет автоматически устанавливать роли. Для этого создается файл requirements.yml, например, в том месте где запускается ansible
. Туда добавляется список нужных ролей:
roles:
# Install a role from Ansible Galaxy.
- name: geerlingguy.java
version: 1.9.6
Затем выполняется установка:
ansible-galaxy install -r requirements.yml
Воспользуемся готовыми ролями из [Ansible Galaxy](https://galaxy.ansible.com/) и сконфигурируем с их помощью окружение. Для этого необходимо
Зайти на Ansible Galaxy и найдите роль, которая устанавливает NodeJS и PostgreSQL
Создать новый плейбук. В нём будет выполняться настройка и развертывание приложения.
Добавить в этот плейбук роль, установить 16 версию NodeJS
Выполнить плейбук и запушить изменения на Github
Вам ответят команда поддержки Хекслета или другие студенты.
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.
Наши выпускники работают в компаниях:
Зарегистрируйтесь или войдите в свой аккаунт
Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу