Ansible
Last updated
Last updated
Установить Ansible можно 2 способами:
Через пакетный менеджер Linux.
Через менеджер python - pip.
Hosts
- инвентарный файл, где описываются хосты, группы хостов, а так же хранятся переменные для этих хостов.
Inventories
- директория, где хранятся инвентарные файлы, а также переменные для групп и хостов.
Task
- минимальный элемент описания конфигурации в котором описано состояние объекта.
Role
- логически завершенный и обосновано выделенный набор tasks, который в дальнейшем используется для применения повторяющейся конфигурации в разных playbooks.
Playbook
- файл с полным описанием конфигурации для конкретных хоста/группы, включает в себя tasks и roles.
Vars
- переменные, используемые для вариативности параметров конфигурации в зависимости от хоста/группы/роли/etc.
Module
- многоразовый автономный сценарий, который возможно конфигурировать от своих задач.
Requirements
- файл с перечнем Ansible-ролей.
ansible.cfg
- первоначальная настройка для ansible.
playbook-name.yml
- ansible-playbook, в котором описаны задачи.
requirements.yml
- файл с перечнем ansible-ролей, отдельно вынесенных задач.
inventories
- директория для инвентарей ansible.
hosts
- файл инвентаризации для рабочих серверов.
Конфигурационный файл ansible.cfg
может находиться в таких местах, и в таком приоритете происходит поиск файла.
ANSIBLE_CONFIG
- переменная среды, если установлена.
./ansible.cfg
– в текущей директории.
~/.ansible.cfg
— в домашней директории пользователя.
/etc/ansible/ansible.cfg
— в стандартной директории ansible.
Инвентарный файл - хост или перечень хостов, с которыми будет происходить работа.
Инвентарный файл можно описать в формате ini или yml.
[]
- В скобки указывается название группы серверов.
Частоиспользуемые ключи:
ansible_host
- ip адрес.
ansible_user
- имя пользователя для подключения на удаленный сервер.
ansible_sudo_pass
- Пароль для подключения sudo пользователя.
ansible_pass
- Пароль пользователя.
ansible_ssh_private_key_file
- путь до закрытого ключа. Для входа без участия пароля.
ansible_port
- порт подключения ssh.
Пример:
hosts
- указываются точки доступа, которые не имеют какой-то группы.
children
- указываются названия группы серверов и внутри идёт имя группы. И дальше идёт перечисление названий серверов, и как подключаться.
Пример yml файла.
Также можно указывать нужные прараметры как и в ini формате.
Пример:
Переменные предназначены для хранения значений, которые могут использоваться в playbook.
Для инициализации или переопределения в плэйбуке переменных, используется vars
.
Для использования переменных нужно заключать их в двойные фигурные скобки - {{ }}
, и обязательно внутри скобочек переменная должна отделяться пробелами.
Так же хорошей практикой считается, заключать всю переменную в двойные кавычки, где используется подстановка.
Примеры:
Также переменные можно задавать в отдельном файле.
И после этого подключить этот файл к плейбуку. Для этого используется vars_files
.
Переменные можно определять как лист.
Применение.
Переменные можно определять как словарь.
Применение.
Переменные можно переопределять, и у них есть свои приоритеты.
Модули отвечают за действия, которые выполняет Ansible. При этом каждый модуль, как правило, отвечает за свою конкретную и небольшую задачу.
name
- описание модуля.
file
- имя модуля, в версиях выше 2.9 он называется ansible.builtin.file.
path
- путь к файлу.
owner
- владелец файла.
group
- группа файла.
mode
- права файла.
state
- что требуется сделать. touch - создать файл.
shell
- запуск /bin/sh.
command
- команды не будут обрабатываться через оболочку, поэтому такие переменные, как $HOME, и такие операции, как <, >, |, ; и & не будут работать.
Почему лучше использовать модули, а не команды shell. При исполнении сценария, asnible проверяет сделано ли уже это (скопирован ли файл, установлена ли программа и пр.), И если уже это сделано, то он ничего не делает.
Для проверки условия используется специальный параметр when
.
В условиях в Ansible для сравнения используются:
==
- равно.
!=
- не равно.
>
больше.
<
меньше.
>=
больше равно.
<=
меньше равно.
Можно указать несколько условий с помощью операторов and
и or
.
Для проверки вхождения символа или подстроки в строку используются операторы in
и not
.
Примеры:
Проверка семейства ОС.
Так же можно сохранить результат выполнения модуля в переменную. Для этого используется параметр register
.
Для циклов используется специальный параметр loop
.
В данном примере просто будет выведено сообщение с номерами массива prime. В параметр loop
, просто передаётся массив, который требуется обойти, а дальше с помощью переменной item
вызывается по одному элементу.
Как один из реальных примеров применения циклов. Создание пользователей из списка.
Для создание роли используется ansible galaxy. И после этой команды будут созданы все стандартные директории для роли.
defaults
- содержится перечень всех переменных которые роль будет использовать, эти переменные могут перезаданы уровнем выше - плейбуком.
files
- хранения файлов, которые могут быть скопированы, конкретно для роли.
handlers
- специльные обработчки событий, для совершение действий.
meta
- информация о роли, создатель, компания, для каких платформ, зависимости, теги.
tasks
- директория, где хранятся все таски.
templates
- директория, где хранятся шаблоны.
tests
- директория для тестов.
vars
- перечень переменных, но их нельзя переопределить выше.
Для того чтобы вести зависимости проекта от требуемых ролей используется файл requirements.yml
.
Параметры в файле:
src
- источник роли, указывается URL-адрес репозитория.
scm
- если src является URL-адресом, нужно указать scm. Поддерживаются только git или hg. По умолчанию git.
version
- версия роли для загрузки. Используется тег, хэш коммита или имя ветки. По умолчанию master.
name
- переопределение имени роли. По умолчанию используется имя репозитория.
Примеры:
Использование https.
Использование ssh.
При установке ролей по стандарту используется директория ~/.ansible/roles
.
Установка из requirements.
Если требуется изменить путь до директории, то используется флаг --roles-path
.
Пример:
Handlers
- это специальные задачи. Они вызываются из других задач ключевым словом notify
.
Эти задачи срабатывают после выполнения всех задач в сценарии (play). При этом, если несколько задач вызвали одну и ту же задачу через notify, она выполнится только один раз.
Для этого используется специальная директория handlers
.
Пример на установке nginx. Когда устанавливается nginx и то устанавливаются какие-то настройки конфигурации, и требуется после изменения настроек перезапустить nginx.
Конфигурация задач для установки nginx в файле tasks/main.yml
. Здесь, устанавливается последняя версия nginx, а также копируются конфигурационные файлы, для настройки nginx.
Файл handlers/main.yml
, где указываются специальные задачи.
Также можно вызвать выполнение задачу в определённый момент, если нужно обновить перед определённой задачей.
Шаблоны
- это простые текстовые файлы, содержащие параметры конфигурации. Во время выполнения плейбуков, переменные будут заменены соответствующими значениями.
Кроме замены параметров также есть условные операторы, циклы, фильтры для преобразования данных, выполнение арифметических вычислений и т.д.
Файл с шаблоном имеет расширение .j2
- механизм создания шаблонов Jinja2.
Если шаблоны используется в роли, тогда создаётся директория templates
, где и хранятся все шаблоны для нужной роли.
Пример:
Пример небольшого шаблона, для подстановки значений (все переменные должны быть объявлены).
Файл nginx.conf.j2
.
Копирование шаблона.
В шаблонах можно использовать условия, для подстановки значений при различных данных.
Шаблон:
Пример:
Цикл предназначен для перебора и обрабоки массива значений.
Шаблон:
Пример:
Фильтры позволяют преобразовывать данные JSON в данные YAML, разбивать URL-адреса для извлечения имени хоста, получать хеш SHA1 строки, добавлять или умножать целые числа и многое другое.
Примеры:
Указание значение переменной по умолчанию.
Вывод списка, только с уникальными значениями.
Объединение двух списков.
Пересечение 2 списков (уникальный список всех элементов в обоих):
Разница в 2 списках (элементы в 1, которые не существуют во 2):
Molecule
- фрэймворк, предназначенный для тестирования ролей в Ansible.
Установка molecule.
Molecule использует ansible-galaxy под капотом для создания обычных макетов ролей. Дополнительно создаётся директория molecule с нужными файлами.
Файлы:
molecule.yml
- это центральная точка входа. Можно настроить каждый инструмент, который Molecule будет использовать при тестировании.
converge.yml
- это файл playbook, содержащий вызов роли.
verify.yml
- это файл Ansible, позволяет писать специальные тесты для состояния контейнера после завершения выполнения роли.
Также есть специальный файл INSTALL.rst
, он не является обязательным, но содержит инструкции, какое дополнительное программное обеспечение или шаги по настройке нужно предпринять, чтобы взаимодействовать с драйвером.
Примеры:
Создание роли nginx
с использованием драйвера docker.
Тестирование с помощью molecule запускается в корневой директории роли.
Запуск создания экземпляра.
Просмотр создания экзепляра.
Запустить проверку роли.
Запуск тестирования роли.
Если требуется проверить экземпляр руками.
Уничтожение экзепляра.
Также есть команда, если требуется запустить сразу create
, converge
, verify
и destroy
по очереди.
Для инфраструктуры можно (и нужно) писать тесты, которые проверяют, что нужный код исполнилняется верно, все нужные сервисы запускаются, файлы верно настроены и т.д.
Сейчас по стандарту используется проверка инфраструктуры с помощью Ansible. Раньше было использование с применением testinfra написанная на Python.
Полная .
Список всех терминов в .
.
.
правильной структуры директории.
Все ключи можно посмотреть в .
.
Пример на модуле . Модуль file нужен для создания/удаления файла.
Каждый модуль имеет свои параметры и не имеет смысла расписывать их, и все модули можно найти на .
Есть специальные модули и , их нужно использовать только в самый последний момент, когда нет вообще такого модуля. Как пример, когда вышла новое приложение, и под неё ещё не написали модули.
Есть специальный модуль для отладки плэйбука - .
.
.