Стиль, ревью и CI/CD-инструменты: Atlantis, TACOS, policy as code

Рейтинг: 67.6% · 8 голосов
Подробный курс по Terraform и OpenTofu на примерах Yandex Cloud: ресурсы и провайдеры, состояние и бэкенды, модули, циклы и условия HCL, секреты и Lockbox, тестирование, CI/CD и командная работа. С актуализацией на 2026 (Terraform 1.3-1.10, OpenTofu).
Ответить
Аватара пользователя
Vlad_DevOps
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Стиль, ревью и CI/CD-инструменты: Atlantis, TACOS, policy as code

Сообщение Vlad_DevOps »

Оглавление курса (47)
  1. Что такое инфраструктура как код и зачем она нужна
  2. Категории инструментов IaC: чем отличаются Ansible, Packer, Kubernetes и Terraform
  3. Чем Terraform отличается от Ansible, Pulumi и CloudFormation
  4. Как работает Terraform под капотом и кто такой OpenTofu
  5. Установка Terraform и OpenTofu, подготовка Yandex Cloud
  6. Первый ресурс: разворачиваем виртуальную машину в Yandex Cloud
  7. Веб-сервер на ВМ: метаданные, user-data и группы безопасности
  8. Переменные ввода и выходные значения в Terraform
  9. Кластер ВМ: группа экземпляров Yandex Compute Instance Group
  10. Балансировщик нагрузки: Application Load Balancer в Yandex Cloud
  11. Состояние Terraform: что такое tfstate и чем опасен локальный файл
  12. Удалённое хранилище состояния: бэкенд на Yandex Object Storage
  13. Изоляция состояния: рабочие области против раскладки по папкам
  14. Источники данных и terraform_remote_state: связываем компоненты
  15. Модули Terraform: переиспользуем инфраструктуру
  16. Входные, локальные и выходные переменные модуля
  17. Версионирование модулей и подводные камни
  18. Циклы в Terraform: параметр count
  19. Циклы в Terraform: for_each по множествам и картам
  20. Выражения for и строковые директивы
  21. Условная логика: count-трюк, for_each и директива if
  22. Встроенные функции, типы и выражения HCL
  23. Развёртывание без простоя: create_before_destroy
  24. Подводные камни Terraform и рефакторинг с блоком moved
  25. Управление секретами: основы и типы
  26. Инструменты управления секретами: Yandex Lockbox, Vault, SOPS
  27. Аутентификация провайдера и секреты: сервисные аккаунты и OIDC
  28. Секреты в ресурсах и состоянии, ephemeral-значения
  29. Провайдеры Terraform: установка, версии, required_providers
  30. Несколько копий одного провайдера: alias и мультизона
  31. Несколько провайдеров и аккаунтов: configuration_aliases
  32. Terraform, Docker и Kubernetes: Managed Kubernetes в Yandex Cloud
  33. Код Terraform промышленного уровня: почему это долго
  34. Мелкие компонуемые модули вместо монолита
  35. Тестируемые модули и проверки: validation, precondition, postcondition
  36. Версионирование, публикация модулей и Terragrunt
  37. Ручное тестирование Terraform и очистка ресурсов
  38. Автоматические тесты на Terratest: модульные тесты
  39. Интеграционные и сквозные тесты, пирамида тестирования
  40. Нативный terraform test и статический анализ
  41. Внедрение Terraform в команде: процессы и культура
  42. Конвейер развёртывания прикладного кода
  43. Конвейер инфраструктурного кода и золотое правило Terraform
  44. Стиль, ревью и CI/CD-инструменты: Atlantis, TACOS, policy as code (вы здесь)
  45. Что нового в Terraform 1.3-1.10: моды, импорт, провайдер-функции, Stacks
  46. OpenTofu в 2026: чем живёт форк и как мигрировать
  47. Сертификация HashiCorp Terraform Associate и карьера
Представь ситуацию. Пятница, вечер, коллега кидает в чат: "залил терраформ, гляньте". Открываешь его PR - а там сорок изменённых файлов, переменные названы как попало, отступы пляшут, и где-то в середине притаился destroy на боевую базу данных. Ты это заметишь? А через год, когда таких PR будет по десять в день?

Вся прошлая часть курса была про то, как писать terraform так, чтобы он работал. Этот урок - про то, как сделать так, чтобы инфраструктура как код жила в команде и не превращалась в минное поле. Стиль, ревью, автоматизация прогона и policy as code - это не бюрократия, а ремни безопасности. Поехали.

Стиль и структура: чтобы код читался, а не расшифровывался

Начнём с дешёвого и обязательного. terraform fmt (или tofu fmt в OpenTofu) переформатирует все .tf файлы по канону: отступы, выравнивание знаков "=", переносы. Спорить о стиле скобок - пустая трата нервов, инструмент решает это за тебя. В CI добавляй проверочный режим, который не правит, а падает, если форматирование съехало:

Код: Выделить всё

terraform fmt -check -recursive
terraform validate
Дальше - именование и раскладка по файлам. Жёсткого стандарта нет, но есть здравая конвенция, которую ждёт любой ревьюер:
  • ресурсы и переменные - в snake_case, без транслита и сокращений типа srv1;
  • имя ресурса не дублирует тип. Пиши resource "yandex_compute_instance" "web", а не "web_instance" - тип уже в первом аргументе;
  • main.tf - основные ресурсы, variables.tf - входы, outputs.tf - выходы, versions.tf - блок required_providers и backend, locals.tf - вычисляемые значения;
  • один логический компонент - один модуль, а не сто ресурсов в плоском main.tf на тысячу строк.
    [/code был тут лишним, продолжаем списком]
Документацию не пиши руками - она протухнет на второй неделе. Инструмент terraform-docs читает переменные, выходы и сам генерирует таблицу в README модуля. Запустил - и описание входов всегда совпадает с кодом:

Код: Выделить всё

terraform-docs markdown table . > README.md
Минимальный осмысленный кусок, который ревьюер должен видеть в каждом модуле под Yandex Cloud:

Код: Выделить всё

variable "zone" {
  description = "Зона доступности YC"
  type        = string
  default     = "ru-central1-a"
}

resource "yandex_compute_instance" "web" {
  name = "web-app"
  zone = var.zone

  resources {
    cores  = 2
    memory = 2
  }

  boot_disk {
    initialize_params {
      image_id = var.image_id
    }
  }

  network_interface {
    subnet_id = var.subnet_id
    nat       = true
  }
}
Здесь каждое имя говорящее, есть description у переменной, нет магических чисел в открытую. Вот таким код и должен приходить на ревью.

Изображение

Ревью инфра-PR: читаем не код, а plan

Главная мысль урока: на ревью инфраструктуры ты смотришь не столько на .tf, сколько на вывод terraform plan apply-цикла - то есть на сам plan. Код может выглядеть невинно, а план - показывать destroy боевого ресурса. План это правда о том, что реально произойдёт.

В выводе plan есть три значка, и ты обязан читать их как сапёр:
  • "+" create - создаётся ресурс. Обычно безопасно, но проверь, не плодим ли дубль;
  • "~" update in-place - меняется на месте, downtime маловероятен;
  • "-" destroy и особенно "-/+" replace - ресурс будет удалён и пересоздан. Для базы данных, диска или статического IP это потенциальная катастрофа. Тут останавливаемся и думаем, почему terraform хочет это сделать.
Replace часто вылезает из-за изменения атрибута, который провайдер помечает как forces replacement - например, переименование инстанса или смена образа загрузочного диска. На ревью спрашивай: мы точно готовы потерять этот ресурс? Если нет - правим код или используем lifecycle с prevent_destroy. И отдельно держи в голове terraform state: если в плане внезапно "пляшут" ресурсы, которых никто не трогал, - возможно, кто-то менял инфраструктуру руками в консоли, и состояние разъехалось с реальностью. Это называется дрейф, к нему вернёмся.

Автоматизация: Atlantis, TACOS и policy as code

Гонять plan и apply с локальной машины - путь к беде. У всех разные версии CLI, у кого-то лежат прод-ключи в открытом виде, а кто-то забыл, что у него незакоммиченные правки. Решение - вынести весь цикл в pull request.

Atlantis - это open-source сервис, который ты хостишь сам. Он слушает вебхуки от GitHub/GitLab и работает прямо в комментариях PR. Открыл PR - Atlantis сам пишет результат terraform plan в комментарий. Посмотрел, ревьюер апрувнул - пишешь atlantis apply, и инфраструктура применяется. Никто не запускает apply со своего ноута, всё проходит через PR и аудируется. Atlantis активно развивается - на 2026 год это версия из ветки 0.4x. Для России и self-hosted это основной вариант: ставишь в свой контур, ключи Yandex Cloud живут на сервере Atlantis, наружу ничего не утекает. Минимальный atlantis.yaml в корне репозитория:

Код: Выделить всё

version: 3
projects:
  - name: prod
    dir: environments/prod
    workflow: default
    apply_requirements:
      - approved
      - mergeable
apply_requirements тут - страховка: применить нельзя, пока PR не одобрен и не сливается без конфликтов.

TACOS (TerraForm/OpenTofu Automation and Collaboration Software) - это управляемые платформы того же назначения, но с UI, RBAC, очередями и хранением state из коробки: Terraform Cloud (HCP Terraform), Spacelift, env0, Scalr. Удобно, но это SaaS, и для многих российских команд это стоп-фактор по доступности, оплате и тому, где физически лежит state. Поэтому в РФ типовой стек - self-hosted Atlantis либо просто пайплайн в GitLab CI, который сам по шагам гоняет fmt, validate, plan на MR и apply на main. Логика та же, просто без отдельного сервиса.

Policy as code - последний рубеж. Договорённости "мы не открываем порт 22 наружу" нельзя держать только в головах. Их кодируют политиками на OPA (язык Rego) и проверяют утилитой Conftest на машиночитаемом плане. Schema простая: превращаем план в JSON и прогоняем через политики, и если правило нарушено - merge блокируется автоматически, без участия живого ревьюера:

Код: Выделить всё

terraform plan -out=tfplan.binary
terraform show -json tfplan.binary > tfplan.json
conftest test tfplan.json
Atlantis умеет встраивать этот шаг в свой workflow и показывать результат policy-проверки в том же комментарии PR, рядом с планом. Удобно: и план, и вердикт политик в одном месте.

Дрейф-детект и типичные грабли

Дрейф (drift) - это расхождение между тем, что записано в state, и тем, что реально в облаке. Кто-то поправил security group через веб-консоль Yandex Cloud - и terraform об этом не знает. Ловится регулярным прогоном plan по расписанию (например, ночной job в CI): если plan не пустой, хотя кода никто не менял, - кто-то лазил руками. Atlantis и TACOS-платформы умеют такой drift detection из коробки и присылают алерт.

Грабли, на которых спотыкаются все:
  • apply с локальной машины в обход PR. Один такой apply - и state в репозитории разъехался с тем, что реально применили коллеги через Atlantis;
  • ревью только по диффу кода без чтения plan. Самое опасное - destroy/replace - в коде выглядит безобидно;
  • auto-apply на merge без апрува. Заманчиво, но один кривой PR улетит в прод без единого человеческого взгляда;
  • policy-проверки не как блокирующие, а "для информации". Если они не блокируют merge, их просто перестают читать;
  • секреты в открытом state. State хранит значения в открытом виде. В OpenTofu есть нативное шифрование state (начиная с 1.7, ключи через PBKDF2, а также AWS/GCP KMS) - в чувствительных проектах это must have.
Мини-лаба

Возьми любой свой модуль под Yandex Cloud и руками прогони полный конвейер:
  • terraform fmt -check -recursive и terraform validate - убедись, что код чистый;
  • сгенерируй README через terraform-docs и сравни таблицу входов с реальными переменными;
  • сделай plan, сохрани его в JSON через terraform show -json и глазами найди значки "+", "~", "-/+";
  • напиши на Rego одну простую политику (например, "у любого yandex_compute_instance memory не больше 8") и прогони Conftest - сначала на проходящем плане, потом нарушь правило и убедись, что проверка падает.
Контрольные вопросы
  • Почему на ревью инфра-PR главное - читать plan, а не только дифф .tf файлов?
  • Чем "-/+" (replace) в плане опаснее обычного "~" (update in-place) и для каких ресурсов это критично?
  • Почему для российских и self-hosted команд Atlantis или GitLab CI обычно предпочтительнее SaaS-TACOS вроде Spacelift или env0?
  • Что такое дрейф инфраструктуры и как его поймать автоматически?
Итог: что запомнить

terraform fmt и terraform-docs - бесплатная гигиена, ставь в CI и забудь о спорах про стиль. На ревью читай plan и охоться за destroy и replace - именно там прячется боль. Apply гоняй только через PR: self-hosted Atlantis для РФ, GitLab CI как простая альтернатива, TACOS - если доступен SaaS. Policy as code на OPA/Conftest делай блокирующим на merge, иначе он бесполезен. И раз в сутки проверяй дрейф - руками в облаке всегда кто-нибудь да полазит. Так инфраструктура как код перестаёт быть лотереей и становится инженерной дисциплиной.
👍5 ❤️3 🔥3 😄 🤔
Аватара пользователя
kappa
Сообщения: 1
Зарегистрирован: 28 май 2026, 08:36

Re: Стиль, ревью и CI/CD-инструменты: Atlantis, TACOS, policy as code

Сообщение kappa »

Спасибо, наконец дошло зачем читать именно plan а не код. Вчера чуть не пропустил replace на диске, теперь буду глазами искать -/+ в первую очередь.
👍2 ❤️2 🔥 😄 🤔
Аватара пользователя
greenhouse
Сообщения: 1
Зарегистрирован: 27 май 2026, 15:51

Re: Стиль, ревью и CI/CD-инструменты: Atlantis, TACOS, policy as code

Сообщение greenhouse »

А подскажите, Atlantis обязательно в свой кубер ставить или можно просто на отдельную виртуалку в YC? У нас контур маленький, кубера пока нет.
👍 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Конвейер инфраструктурного кода и золотое правило Terraform
Следующая глава →
Что нового в Terraform 1.3-1.10: моды, импорт, провайдер-функции, Stacks

Все главы курса «Terraform: инфраструктура как код на Yandex Cloud»

Поделиться темой: ✈ Telegram VK
Похожие запросы: cicd для начинающих с чего начать на jenkinsjenkins vs gitlab ci и github actions что выбрать

Вернуться в «Terraform: инфраструктура как код на Yandex Cloud»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость