Зарегистрируйтесь, чтобы продолжить обучение

Роли Основы автоматизации в Ansible

Задачи, которые решаются с помощью Ansible, часто повторяются у разных людей и команд. Как и в случае программирования, где общий код выделяют в библиотеку, Ansible выделяет повторяющиеся вещи в роли. Эти роли выкладываются в общий каталог, через который любой человек может найти себе готовое решение по установке и настройке чего-либо.

Роль представляет собой набор задач или обработчик переменных, файлов и других артефактов, которые распространяются и подключаются как единое целое к плейбуку. Обычно, роли выполняют достаточно высокоуровневые задачи, например установку баз данных, веб-серверов и тому подобное. Иногда они автоматизируют работу с каким-то низкоуровневым сервисом, который не встроен в сам Ansible. Вот список некоторых популярных ролей:

  • geerlingguy.java: Роль для установки Java на Linux. Умеет ставить версии, которых нет в стандартных менеджерах.
  • ajsalminen.hosts: Роль для управления содержимым файлов /etc/hosts и /etc/hostname через удобный конфиг, вместо прямой работы с файлами.
  • jdauphant.ssl-certs: Роль для генерации сертификатов
  • ansistrano.deploy: Роль с помощью которой можно деплоить проекты на любом языке программирования

Возьмем для примера веб-сервер Nginx. Для его установки в Ansible Galaxy можно найти множество ролей от разных разработчиков, среди которых есть и официальная, разрабатываемая компанией NGINX. Вот ее страничка. Здесь мы видим описание и инструкцию для установки. Разберем их.

Первый шаг – установка роли. Она выполняется с помощью команды ansible-galaxy:

ansible-galaxy install nginxinc.nginx

Имя роли состоит из двух частей. Неймспейс, который обычно совпадает с именем пользователя на github и собственно имени роли, в данном случае nginx. Таким образом избегаются коллизии имен.

Второй шаг - подключение. Роли добавляются в плейбук через ключ roles:

- hosts: all
  roles:
    - role: nginxinc.nginx
  tasks: ...

Ansible начинает выполнять роли до tasks независимо от порядка организации верхнеуровневых ключей в плейбуке. Но иногда требуется выполнить какие-то подготовительные действия до выполнения роли. В таком случае есть два варианта.

  1. Добавить подготовительные задачи в pre_tasks:

    - hosts: all
      pre_tasks: # Выполняются до ролей
        # Тут список задач
        - name: Какая-то задача
          ansible.builtin.shell: # Делаем что-нибудь
      roles:
        - role: nginxinc.nginx
        - role: # какая-нибудь другая роль
      tasks: # Выполняются после ролей
        # Тут список задач
    
  2. Добавлять роли через 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

Самостоятельная работа

Напишем плейбук для подготовки рабочего сервера для удаленной работы программистов.

  1. Создайте плейбук для установки и новой настройки окружения для рабочего приложения

  2. Используя роли, установите на удаленные машины инструменты, с которыми обычно работаете. Например: Git, Postgres, NodeJS


Дополнительные материалы

  1. Ansible Roles
  2. Ansible Galaxy

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»