Управление конфигурацией (Ansible)
Идемпотентность Ansible, роли и структура каталогов, приоритет переменных, выбор модулей, Vault, поэтапный выкат и вопрос императивности против декларативности.
8 вопросов
JuniorТеорияОчень частоЧто такое Ansible и почему идемпотентность центральна для его работы?
Что такое Ansible и почему идемпотентность центральна для его работы?
Ansible — безагентный инструмент управления конфигурацией, приводящий хост к объявленному желаемому состоянию по SSH, вместо серверов-снежинок вручную. Идемпотентность центральна: play объявляет конечное состояние, а не шаги, поэтому повтор приводит хост к нему и сообщает changed лишь когда что-то изменил.
Типичные ошибки
- ✗Думать, что Ansible нужен агент, установленный на каждом управляемом хосте
- ✗Считать, что идемпотентность — это когда задачи не запускаются повторно, а не сходимость
- ✗Воспринимать playbook как упорядоченный скрипт, а не объявленное конечное состояние
Уточняющие вопросы
- →Как нативный модуль понимает, что менять при повторе нечего?
- →Из-за чего задача
commandилиshellломает идемпотентность?
JuniorТеорияИногдаЧто такое роль в Ansible и какова её стандартная структура каталогов?
Что такое роль в Ansible и какова её стандартная структура каталогов?
Роль — переиспользуемый набор автоматизации Ansible с фиксированной структурой, чтобы playbook подключали её по имени, а не копировали задачи. Внутри roles/<name>/ лежат автозагружаемые подкаталоги: tasks/, handlers/, templates/, files/, а также vars/ и defaults/ (наименьший приоритет) и meta/.
Типичные ошибки
- ✗Путать роль с группой хостов инвентаря
- ✗Думать, что в
defaults/лежат переменные высокого, а не наименьшего приоритета - ✗Не знать, что
tasks/main.ymlзагружается по соглашению автоматически
Уточняющие вопросы
- →Где
defaults/роли стоят в общем приоритете переменных? - →Как передать параметры в роль в момент её подключения?
MiddleТеорияИногдаКак безагентный Ansible подключается к свежему хосту и чем push отличается от pull?
Как безагентный Ansible подключается к свежему хосту и чем push отличается от pull?
Ansible работает по push и безагентен: control node заходит по SSH к каждому хосту инвентаря, копирует код модуля, запускает его питоном цели и применяет become (sudo) для привилегированных задач — демон не ставится. Свежему хосту нужны лишь SSH и Python. Инструменты pull вроде Puppet или Chef держат на узле агент, опрашивающий центральный master по расписанию.
Типичные ошибки
- ✗Думать, что Ansible ставит агент или опрашивает, как Puppet/Chef
- ✗Забывать, что цели нужны SSH плюс Python для большинства модулей
- ✗Путать push/pull с контролем версий, а не с тем, кто инициирует
Уточняющие вопросы
- →Как забутстрапить Python на хост, где его нет?
- →Когда pull масштабируется лучше push для тысяч узлов?
MiddleТеорияИногдаКогда вы предпочитаете модули package, service или copy сырому command и почему?
Когда вы предпочитаете модули package, service или copy сырому command и почему?
Предпочитайте нативный модуль почти всегда: package, service, copy и template декларативны и идемпотентны — проверяют состояние хоста и действуют, лишь если оно расходится, точно сообщая changed. Сырой command/shell просто выполняется и сообщает changed каждый запуск. Берите command, только когда модуля нет, и ограждайте его через creates:.
Типичные ошибки
- ✗Тянуться к
shell/command, когда есть нативный модуль - ✗Думать, что сырой
commandидемпотентен без ограждения - ✗Не знать, что
creates:/changed_when:возвращают идемпотентный отчёт
Уточняющие вопросы
- →Что выражает
changed_when: falseна команде только для чтения? - →Как ведёт себя check mode (
--check) для модулей противcommand?
MiddleДебаггингИногдаЗадача сообщает changed при каждом запуске, хотя должна быть идемпотентной — диагностируйте и исправьте.
Задача сообщает changed при каждом запуске, хотя должна быть идемпотентной — диагностируйте и исправьте.
Каждая задача — shell/command, который просто выполняется и безусловно сообщает changed — Ansible не видит состояние за сырой командой, сходимости нет. Исправьте нативными идемпотентными модулями: file: state=directory, get_url и apt: name=nginx state=present. Где команда неизбежна, оградите её через creates: или changed_when:.
Типичные ошибки
- ✗Винить кэш фактов или
become, а не сыройshell/command - ✗Думать, что один
registerделаетcommandидемпотентным - ✗Не заменять команды модулями состояния
file/get_url/apt
Уточняющие вопросы
- →Что делает
changed_when: falseдля по сути read-only команды? - →Как повёл бы себя режим
--checkна модульной версии этого play?
MiddleТеорияИногдаЧто даёт serial (rolling-выкат) и как не уронить весь флот сразу?
Что даёт serial (rolling-выкат) и как не уронить весь флот сразу?
По умолчанию Ansible гонит play по всем подходящим хостам параллельно (до forks), поэтому плохое изменение бьёт разом. serial: разбивает выкат на пачки — serial: 1 или serial: 25% обновляет столько хостов за волну, давая канареечный выкат и проверку. Свяжите его с max_fail_percentage, чтобы прервать прогон при сбоях, и выводите пачку из балансировщика.
Типичные ошибки
- ✗Думать, что Ansible обновляет хосты по одному и без
serial - ✗Читать
serialкак порядок задач или задержку на хост - ✗Пропускать
max_fail_percentage, так плохая пачка катится на весь флот
Уточняющие вопросы
- →Как
pre_tasks/post_tasksвыводят и возвращают хост из балансировщика? - →Как
max_fail_percentageвзаимодействует с размером пачкиserial?
MiddleТеорияИногдаЧто такое Ansible Vault и как держать секреты вне Git?
Что такое Ansible Vault и как держать секреты вне Git?
Ansible Vault шифрует чувствительные данные в покое (AES-256), чтобы они жили в репозитории: вы ansible-vault encrypt файл переменных или значения, а Ansible расшифровывает их при запуске по паролю vault (через --ask-vault-pass или файл пароля). Никогда не коммитьте открытый текст — коммитьте лишь зашифрованную форму, а пароль держите вне Git.
Типичные ошибки
- ✗Думать, что Vault — это контроль доступа, а не шифрование в покое
- ✗Коммитить пароль vault рядом с зашифрованным файлом
- ✗Полагать, что Vault лишь обфусцирует (base64), а не шифрует данные
Уточняющие вопросы
- →Как ротировать утёкший пароль vault по многим файлам?
- →Когда взять внешнее хранилище секретов вместо Vault?
MiddleТеорияРедкоГде extra-vars (-e) стоят в приоритете переменных Ansible относительно defaults роли?
Где extra-vars (-e) стоят в приоритете переменных Ansible относительно defaults роли?
Extra-vars, переданные с -e, имеют наивысший приоритет — перекрывают любой источник, годятся для разовых переопределений. defaults/ роли стоят у самого низа, перекрываемые инвентарём, group_vars, host_vars или vars play. Так что -e всегда побеждает; defaults/ действует, лишь когда выше ничего не задано.
Типичные ошибки
- ✗Думать, что
defaults/роли перекрывают командную строку - ✗Считать, что приоритет решает порядок чтения файлов, а не лестница
- ✗Полагать, что
-eсливается с нижними источниками, а не перекрывает их
Уточняющие вопросы
- →Где
group_varsиhost_varsотносительно vars уровня play? - →Когда разовое
-eпредпочтительнее правки group_vars?