Внедрение Terraform в команде: процессы и культура

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

Внедрение Terraform в команде: процессы и культура

Сообщение 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 и карьера
Зачем вообще этот урок про "процессы"

Ты уже умеешь писать HCL, гонять terraform plan apply и собирать модули terraform. Технически ты готов. Но вот неприятная правда: 90 процентов провалов внедрения IaC происходят не из-за плохого кода, а из-за людей. Один админ ночью руками поправил security group в консоли Yandux Cloud, забыл сказать команде, и через неделю чей-то apply снёс это изменение. Прод лежит, виноватых нет, а terraform получает репутацию "той штуки, которая всё ломает".

Инфраструктура как код - это не про синтаксис. Это про договорённости. Terraform работает ровно настолько, насколько вся команда согласна играть по одним правилам. Можно иметь идеальный код и при этом полный хаос, если половина команды правит ресурсы мышкой. В этом уроке разберём, как протащить IaC в команду так, чтобы это прижилось, а не было выброшено через два месяца со словами "не взлетело".

Изображение

Как продать IaC начальству и команде

Начальство не интересует слово "декларативность". Его интересуют деньги, риски и скорость. На этом языке и говори.

Аргумент про риск. Ручные правки в консоли - это не задокументированные изменения, которые знает только тот, кто их сделал. Уволился человек - знание ушло с ним. Случилась авария в 3 ночи - никто не может воспроизвести инфраструктуру, потому что она существует только в голове и в текущем состоянии облака. Terraform превращает это в код в git, который читается, ревьюится и восстанавливается.

Аргумент про скорость. Поднять копию окружения для тестов руками - это день кликанья. С terraform - это terraform apply и пятнадцать минут. Новый менеджер просит staging-стенд? Не проблема, у тебя есть модуль.

Аргумент про аудит. Кто, когда и что менял в инфраструктуре - это git log. Для безопасников и для разбора инцидентов это золото.
Лайфхак: не проси разрешения переписать всё. Попроси разрешения на маленький пилот - один некритичный сервис. Покажи результат цифрами (было N часов, стало M минут), и дальше тебя начнут просить сами.
Постепенный переход вместо big bang

Главная ошибка энтузиаста - попытаться затерраформить всю компанию за один спринт. Это всегда заканчивается выгоранием и откатом. Big bang не работает по простой причине: ты не можешь одновременно учиться, переписывать прод и не ломать бизнес.

Правильный путь - инкрементальный:
  • Начни с нового, а не со старого. Все новые ресурсы создаём только через terraform. Старое пока живёт как живёт.
  • Импортируй существующее постепенно. terraform import затаскивает уже созданные руками ресурсы под управление кода, по одному, когда до них дошли руки.
  • Сначала некритичное. Dev и staging - отличный полигон. Если apply там что-то сломает, никто не пострадает.
  • Прод - в последнюю очередь и осознанно, когда команда уже набила руку.
И заложи время на обучение явно. Не "разберётесь по ходу", а реальные часы в спринте на чтение доков, разбор terraform state и совместные ревью первых конфигов. IaC - это смена мышления с императивного "пойди и сделай" на декларативное "опиши, что должно быть". На эту перестройку мозгу нужно недели две-три. Если этого времени не дать, люди будут тихо саботировать и втихаря всё делать руками.

Правило только-через-код и дрейф

Это самое важное организационное правило всего IaC. Звучит просто: никаких ручных изменений в консоли облака. Вообще. Если что-то надо поменять - меняешь код и делаешь apply.

Почему так строго? Из-за дрейфа конфигурации (configuration drift). Terraform хранит в terraform state своё представление о мире. Когда кто-то правит ресурс мышкой, реальность расходится с состоянием и с кодом. Дальше два сценария, оба плохие:
  • Следующий apply увидит расхождение и откатит ручную правку обратно к коду. Поздравляю, ты только что снёс чужой "временный" фикс на проде.
  • Или ты добавишь это изменение в код задним числом, но уже потеряв понимание, зачем оно было нужно.
Проверять дрейф можно регулярным terraform plan на пустом изменении - если plan показывает изменения, которых ты не вносил в код, значит кто-то лазил руками. Хорошая практика - гонять такой plan в CI по расписанию и алертить, если он не пустой.

Чтобы правило работало не на честном слове, его подкрепляют технически: у людей забирают права на запись в консоли облака, оставляя read-only для просмотра. Менять инфру может только сервисный аккаунт из CI-пайплайна. Звучит жёстко, но именно это убивает дрейф в зародыше.

Вот так выглядит безобидный кусок инфраструктуры в Yandex Cloud, который теперь живёт только в репозитории и меняется только через pull request:

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

terraform {
  required_providers {
    yandex = {
      source = "yandex-cloud/yandex"
    }
  }
}

resource "yandex_compute_instance" "app" {
  name        = "app-prod"
  platform_id = "standard-v3"
  zone        = "ru-central1-a"

  resources {
    cores  = 2
    memory = 4
  }

  boot_disk {
    initialize_params {
      image_id = "fd8ccebmjslue5nphmt6" # ubuntu образ
      size     = 20
    }
  }

  network_interface {
    subnet_id = yandex_vpc_subnet.app.id
    nat       = true
  }
}

resource "yandex_vpc_network" "app" {
  name = "app-network"
}

resource "yandex_vpc_subnet" "app" {
  name           = "app-subnet"
  zone           = "ru-central1-a"
  network_id     = yandex_vpc_network.app.id
  v4_cidr_blocks = ["10.10.0.0/24"]
}
Захотел добавить ещё ядер виртуалке? Не лезешь в консоль - меняешь cores в коде, открываешь PR, проходишь ревью, мёржишь, CI делает apply. Скучно? Да. Предсказуемо? Тоже да. Именно это нам и нужно.

Кто владеет кодом, ревью и ответственность

IaC без владельцев - это код, который гниёт. Нужно явно решить, кто отвечает за инфра-репозиторий.

Две крайности, между которыми выбирают команды. Первая - выделенная платформенная команда владеет всем terraform, а разработчики просят изменения через тикеты. Надёжно, но платформа становится узким горлышком. Вторая - каждая продуктовая команда владеет своим куском инфры (модель "you build it, you run it"). Быстро, но требует зрелости и общих стандартов, иначе расцветает зоопарк.

На практике побеждает гибрид: платформенная команда даёт переиспользуемые модули terraform и общие правила, а продуктовые команды собирают из этих модулей свои окружения. Так и контроль есть, и узкого горла нет.

Ревью обязателен для любого изменения инфраструктуры. terraform plan в пайплайне прикладывается прямо к pull request, и ревьюер видит, что именно изменится, до применения. Особое внимание - на строки с destroy и replace в выводе плана. Одно дело "добавится диск", совсем другое - "пересоздастся база с данными". План в PR ловит такие сюрпризы до того, как они станут инцидентом.

Используй CODEOWNERS в git, чтобы изменения в чувствительных директориях (сеть, IAM, прод) автоматически требовали аппрува нужного человека.

Монорепо или полирепо

Извечный спор, как организовать репозитории инфраструктуры.

Монорепо - вся инфра в одном репозитории. Плюсы: общие модули под рукой, атомарные изменения через несколько компонентов, единая история. Минусы: один большой terraform state становится медленным и опасным (любой apply трогает весь мир), плюс права доступа выдаются на весь репозиторий сразу.

Полирепо - у каждой команды или сервиса свой репозиторий и свой state. Плюсы: маленький радиус поражения, гранулярные права, быстрые независимые apply. Минусы: переиспользуемые модули приходится выносить в отдельный репозиторий и версионировать, история размазана.

Здравый компромисс для большинства: общие модули в отдельном версионируемом репозитории, а окружения - в репозиториях по командам или по доменам. И обязательно дроби terraform state по окружениям и компонентам - один гигантский state на всю компанию это бомба замедленного действия.

Типичные грабли
  • Один общий state на всё и всех. Рано или поздно два человека сделают apply одновременно и подерутся за блокировку, а время плана уползёт в минуты.
  • Нет remote backend с блокировкой. Если state лежит у людей локально - вы обречены на конфликты и потерю состояния. Храни его в Yandex Object Storage с блокировкой.
  • Секреты в коде и в state. Пароли и ключи нельзя класть в HCL открытым текстом, а сам state надо считать секретным файлом (там лежат пароли в открытом виде).
  • Правило только-через-код есть на бумаге, но права в консоли не отобрали. Тогда оно не работает - кто-нибудь обязательно "по-быстрому поправит руками".
  • Внедрили инструмент, но не сменили культуру. Terraform без договорённостей о ревью и владении - это просто ещё один способ сломать прод, только теперь декларативно.
Мини-лаба

Руками тренировать тут особо нечего, это организационный урок. Но проделай мысленный (а лучше письменный) разбор для своей текущей работы:
  • Выпиши три аргумента, которыми ты убедишь своего тимлида попробовать IaC на одном пилотном сервисе. Цифрами, а не лозунгами.
  • Сформулируй для своей команды правило только-через-код в одно предложение и придумай, как технически запретить ручные правки.
  • Нарисуй, как ты разложишь инфраструктуру по репозиториям и по state-файлам: что в монорепо, что отдельно, где граница.
  • Реши, кто будет CODEOWNER для прод-сети и IAM, и почему именно он.
Контрольные вопросы
  • Что такое дрейф конфигурации и почему правило "только через код" - это не занудство, а защита от инцидентов?
  • Почему стратегия big bang при внедрении terraform обычно проваливается, и как выглядит постепенный переход?
  • Чем монорепо отличается от полирепо для инфраструктуры, и почему один общий terraform state на всё - плохая идея?
  • Зачем прикладывать terraform plan к pull request и на какие строки вывода смотреть особенно внимательно?
Итог: что запомнить

Terraform - это на 30 процентов инструмент и на 70 процентов договорённости в команде. Продавай IaC начальству на языке рисков, скорости и аудита, а не терминов. Внедряй постепенно: новое - через код, старое - импортом, прод - последним. Святое правило - только через код, подкреплённое отбором прав в консоли, иначе дрейф съест тебя. Назначь владельцев, сделай ревью с обязательным planом в PR, разнеси state по окружениям. Сделаешь это - и terraform станет скучным и надёжным. А скучная инфраструктура - это лучший комплимент, который можно ей сделать.
👍2 ❤️2 🔥 😄 🤔
Аватара пользователя
nortlord
Сообщения: 1
Зарегистрирован: 11 май 2026, 08:09

Re: Внедрение Terraform в команде: процессы и культура

Сообщение nortlord »

Вопрос по правилу только-через-код: а если прод реально лежит и счет на минуты, неужели нельзя быстро поправить руками а потом донести в код? Или это прям табу всегда?
👍2 ❤️ 🔥 😄 🤔
Аватара пользователя
emacsnerd
Сообщения: 1
Зарегистрирован: 22 май 2026, 21:20

Re: Внедрение Terraform в команде: процессы и культура

Сообщение emacsnerd »

Спасибо, наконец дошло чем монорепо от полирепо отличается на инфре. У нас один state на все окружения и apply реально стал тормозить, теперь понятно почему. Пойду дробить.
👍 ❤️1 🔥 😄 🤔2
Ответить
← Предыдущая глава
Нативный terraform test и статический анализ
Следующая глава →
Конвейер развёртывания прикладного кода

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

Поделиться темой: ✈ Telegram VK
Похожие запросы: terraform yandex cloud с чего начать новичкукак установить terraform и opentofu на linuxчто такое terraform state и tfstate простыми словамиудаленный backend terraform на object storage yandex cloudчто такое инфраструктура как код iac простыми словамиterraform plan и apply что делают и чем отличаются

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

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

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