IaC и конфигурация
Infrastructure as Code (IaC) заменяет накликанные вручную серверы и «домашних питомцев»-машины на текст, который вы коммитите, ревьюите и перезапускаете. Вместо того чтобы вспоминать, что вы поменяли в консоли, вы объявляете желаемое состояние в файлах и даёте инструменту сверить реальность с ним. На собеседовании доминируют три инструмента, и каждый держится на одной несущей идее.
Terraform декларативно поднимает облачные ресурсы, но читает намерение не из облака — он сверяет вашу конфигурацию с файлом state, который и есть его источник истины. Почти любая ловушка Terraform (дрейф, блокировки, count против for_each, импорты, блоки moved) на деле — вопрос про state в маскировке.
Управление конфигурацией (здесь Ansible) приводит существующую машину к объявленному состоянию, и его ключевое свойство — идемпотентность: повтор play обязан быть безопасным и сообщать changed лишь тогда, когда что-то действительно изменилось. Сырая shell-команда ломает это обещание.
Helm и GitOps часто путают, но они решают разные задачи: Helm — это упаковка и шаблонизация, а GitOps — непрерывное согласование кластера с Git, из-за чего ручная правка откатывается по замыслу.
Карта темы
- Terraform — декларативное желаемое состояние, сверяемое с файлом state; plan против apply против destroy, дрейф, удалённые бэкенды с блокировкой,
countпротивfor_each, модули и безопасный рефакторинг state черезstate mv/moved. - Управление конфигурацией — повторяемое состояние машины под версионным контролем; идемпотентность как ключевое свойство, push (Ansible) против pull (Puppet/Chef), роли и handlers, Jinja2, Vault, а также mutable-конфигурация против immutable-инфраструктуры.
- Helm и GitOps — Helm-чарты, шаблонизация и откат релизов против GitOps, где Git — источник истины, а Argo CD/Flux непрерывно согласуют кластер и авто-лечат дрейф.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
| Считать облако источником истины для Terraform | Упускается, что plan сравнивает конфиг с файлом state, и дрейф/импорты перестают быть понятны |
| Коммитить или править локальный state руками | State может хранить секреты и легко портится; двое, гонящие apply, затирают друг друга |
Использовать count для набора, меняющегося в середине | Переиндексация уничтожает и пересоздаёт все последующие ресурсы вместо правки одного |
Называть сырую задачу shell/command идемпотентной | Она сообщает changed каждый запуск и не сходится — Ansible не видит состояние за ней |
| Думать, что Helm и GitOps — один слой | Смешивается упаковка с согласованием, и непонятно, почему ручная правка откатывается |
«Чинить» прод через kubectl edit под GitOps | Контроллер откатывает по замыслу; единственная настоящая правка — коммит в Git |
Значение для собеседований
Эти темы проверяют, понимаете ли вы, где живёт истина. Истина Terraform — его файл state; истина Ansible — объявленное конечное состояние, к которому надо идемпотентно сходиться; истина GitOps — Git-репозиторий, к которому контроллер согласует кластер. Кандидат, усвоивший это, чисто отвечает про дрейф, блокировки, откат и «почему исчезла моя ручная правка», а тот, кто не усвоил, описывает счастливый путь и застревает в момент, когда реальность расходится с намерением.