Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Устройство ролей Основы автоматизации в Ansible

В этом уроке мы разберем то, как устроены роли внутри, что поможет эффективнее их анализировать и создавать свои в случае необходимости.

Роли можно изучать на базе существующих, открыв их, например, на Github. А можно создать новую роль с нуля, чтобы увидеть, базовую структуру, которая туда была заложена. Пойдем по второму пути и создадим новую роль с помощью команды ansible-galaxy.

ansible-galaxy role init role_name

Выполнять саму команду генерации можно в любом месте, если планируется эту роль добавлять на Github и публиковать в Ansible Galaxy. Но можно пойти и по другому пути. Если разместить содержимое роли в директории roles в корне проекта где запускается Ansible, то появится возможность использовать эту роль напрямую, без необходимости публиковать ее в Galaxy.

# Пример структуры Хекслет
├── Makefile
├── development.yml
├── inventory
├── files
├── group_vars
│   ├── all.yml
│   ├── evaluators.yml
├── kubernetes.repo
├── pull.yml
├── requirements.yml
├── roles # <- Роли, которые мы создали сами
│   ├── consul
│   ├── cronner
│   ├── datadog
│   ├── docker
│   ├── evaluator
│   ├── slack
│   └── user
├── templates

Команда выше создаст базовую структуру роли, добавив в нее файлы и директории, необходимые для работы роли. Всего 8 директорий.

tree role_name
role_name
├── README.md
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml

8 directories, 8 files

Из всех файлов в структуре выше, обязательными являются только meta/main.yml и tasks/main.yml. Остальные появляются в зависимости от обстоятельств. Вот их предназначение:

  • defaults: содержит значения переменных по умолчанию. Эти значения могут быть изменены во время использования роли в плейбуке.
  • files: сюда добавляются любые необходимые файлы, которые нужны роли.
  • handlers: обработчики, которые могут быть использованы ролью.
  • meta: содержит метаданные роли. Сюда входит лицензия, информация о платформе зависимости и многое другое.
  • tasks: задачи роли, которые выполняются во время ее запуска.
  • templates: шаблоны роли.
  • tests: тесты роли.
  • vars: переменные роли.
  • README.md: описание, которое будет использоваться как документация.

Метаданные

Метаданные выполняют несколько задач. Во-первых, они описывают роль и помогают ее найти в Ansible Galaxy. Во-вторых, с их помощью указываются зависимости, другие роли, которые используются внутри этой.

# meta/main.yml
galaxy_info:
  author: your name
  description: your role description
  company: your company (optional)
  license: license (GPL-2.0-or-later, MIT, etc)
  min_ansible_version: 2.1

  # Provide a list of supported platforms, and for each platform a list of versions.
  # If you don't wish to enumerate all versions for a particular platform, use 'all'.
  # To view available platforms and versions (or releases), visit:
  # https://galaxy.ansible.com/api/v1/platforms/
  #
  # platforms:
  # - name: Fedora
  #   versions:
  #   - all
  #   - 25

  galaxy_tags: []
    # List tags for your role here, one per line. A tag is a keyword that describes
    # and categorizes the role. Users find roles by searching for tags. Be sure to
    # remove the '[]' above, if you add tags to this list.

dependencies: []
  # List your role dependencies here, one per line. Be sure to remove the '[]' above,
  # if you add dependencies to this list.

Задачи и обработчики

Файл tasks/main.yml, представляет собой playbook, который будет запущен на выполнение при включении роли в playbook проекта или другой роли. По умолчанию этот файл пустой. Ожидается, что мы добавим сюда необходимые задачи.

Если задач станет много, то их можно будет разбить на разные файлы внутри директории tasks. main.yml будет точкой входа, которая включает в себя все эти файлы. Принцип разделения по файлам может быть разным, один из классических примеров это разные файлы с задачами под разные платформы.

# role_name/tasks/main.yml
- name: Install the correct web server for RHEL
  import_tasks: redhat.yml
  when: ansible_facts['os_family']|lower == 'redhat'

- name: Install the correct web server for Debian
  import_tasks: debian.yml
  when: ansible_facts['os_family']|lower == 'debian'

# role_name/tasks/redhat.yml
- ansible.builtin.yum:
    name: "httpd"
    state: present

# roles/example/tasks/debian.yml
- ansible.builtin.apt:
    name: "apache2"
    state: present

Если задачам роли нужны обработчики, то они добавляются в директорию handlers/main.yml. Ansible автоматически их найдет и подключит.

Переменные роли

Для определения переменных, Ansible предлагает два разных варианта: директорию defaults и директорию vars. И там и там хранятся переменные, которые роль использует для своей работы. Разница между этими директориями заключается в том, что в vars хранятся переменные, которые нужны роли для ее работы, но пользователю про них знать не нужно, это внутренние переменные. defaults же содержит переменные, которые пользователь роли может или должен задать при использовании этой роли. Типичный пример параметра по умолчанию, это номер версии устанавливаемой программы. Обычно его можно поменять, без необходимости менять внутренности роли.

# Пример роли nginxinc.nginx

# ansible-role-nginx/vars/main.yml

# Supported NGINX Open Source distributions
# https://nginx.org/en/docs/install.html
nginx_supported_distributions:
  almalinux:
    name: AlmaLinux
    versions: [8, 9]
    architectures: [x86_64, aarch64, s390x]
  alpine:
    name: Alpine Linux
    versions: [3.15, 3.16, 3.17, 3.18]
    architectures: [x86_64, aarch64]

# ansible-role-nginx/defaults/main.yml

nginx_type: opensource
nginx_install_source_build_tools: true
nginx_install_source_pcre: false
nginx_install_source_openssl: true
nginx_install_source_zlib: false

Шаблоны и файлы

Остальные директории могут содержать типовые файлы, которые встречаются в playbook. Структура этих директорий никак не специфицирована. Все файлы внутри них раскладываются так как удобно создателю роли.


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

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

  1. Создайте роль для настройки окружения пользователя. Эта роль состоит из двух задач: создание пользователя с заданными именем и паролем и добавление Git конфига для него. Конфиг Git генерируется только для создаваемых пользователей

  2. Подключите роль в плейбуке для установки и настройки окружения

В результате выполнения у вас получится плейбук, который настраивает рабочее окружение для пользователей.


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

  1. Официальная документация

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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