3.4 Ansible
Знакомство с Ansible
Свойства Ansible
- Декларативность
- Идемпотентность (при повторном применении давать тот же результат)
- Не требуется агент
Задачи Ansible
- Автоматизация установки софта
- Обеспечение повторяемости
- Масштабируемость
4 концепции Ansible
- Inventory - хранение информации о машинах в сети
- Modules - непосредственно что загружается и выполняется
- Plugins - расширяют функциональность самого Ansible (например ssh)
- Api - интерфейс взаимодействия
Простые примеры запуска
Запуск модуля на всех хостах
Пример заполнения hosts.ini
Варианты задания переменных
Переменные внутри роли переопределяют переменные плейбука
- Одна переменная в одном месте
- Называем переменные, включая роли/пакеты в имя
- Избегаем простых имён (server, host)
- ansible_facts - факты о машинах, переопределить невозможно
Разумная таблица приоритетов переменных
Примерно такая же, как тут, но без WTF'ов.
- Vars set on the command line -e foo=set_on_cmd_line
- Vars set in the vars_files: block in the play
- Vars set in the vars: block in the play
- Vars set in host_vars/
- Vars set in group_vars/
- Role default vars roles/.../defaults/main.yml
Пример ping
Из командной строки
С помощью плейбука
Примеры установки LAMP стека
Правильная структура и описание
- inventories
- host, group_vars, host_vars
- hosts - основной инвентарный файл, в который добавляем хосты и параметры к хостам
- group_vars - переменные которые будут применены к определенной группе хостов
- host_vars - добавляются переменные для определенного хоста
- host, group_vars, host_vars
- roles - директория с ролями, пример название ролей nginx, php
- Роль позволяет сгруппировать несколько задач в один конвейер
- tasks/main.yml – основной список задач которые будет исполнять роль
- handlers/main.yml – списки задач (обработчиков), триггеры notify
- defaults/main.yml – переменные по умолчанию с очень низким приоритетом
- vars/main.yml – переменные с большим приоритетом
- files – директория с файлами которые используются в роли
- templates – директория с шаблонами Jinja2
- meta/main.yml – директория с метадатай об авторе, зависимостях которые использует роль
- ansible.cfg - конфигурационный файл, в котором назначаются настройки по умолчанию
- playbook.yml - файл в котором мы связываем хосты и роли которые нужно выполнять
Ansible galaxy
Коллекции в Ansible — формат распространения набора модулей и плагинов. Скачиваются и хранятся в ~/.ansible/collections
| requirements.yml | |
|---|---|
Info
Yandex cloud при создании из образа сразу добавляет эту строку в /etc/sudoers.d/cloud_init
Jinja шаблоны
Notify and Handler
- Notify это триггер (например если файл изменился то нужно перезагрузить nginx)
- Вызывается только если task получило статус change (т.е. сделало какие то изменения)
- Если несколько одинаковых notify выполниться всё равно один handler
- Handler выполняется в конце каждого play’a (Play — связывает список ролей и тасков с списком хостов )
- Notify одной роли может вызвать handler из другой
- Если в процессе выполнения произошла ошибка то handler вызван не будет
Dinamic inventory
- Позволяет работать с inventory полученным из внешних сервисов
- Решает проблему дублирования и отслеживания хостов
- Поддерживает использования внешних скриптов для получения данных из внешних систем
Ansible Vault шифрование
- Консольная утилита для работы с секретными данными
- Переменные можно подключать через vars_files
- Позволяет хранить в общих репозиториях файлах, в которых содержится приватная информация
- Для более сложных случаев используется Hashicorp Vault
Отладка
- -vvvv - подробный вывод
- Пошаговое выполнение --step
- Ansible-console
- debugger (break point внутри task)
- p task.vars
- p task.args