Установка Terraform и OpenTofu, подготовка Yandex Cloud

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

Установка Terraform и OpenTofu, подготовка Yandex Cloud

Сообщение 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 и карьера
Теория - это хорошо, но пока ты не выполнил первый terraform apply, инфраструктура как код остается для тебя красивым словом. В этом уроке мы перестаем читать и начинаем стучать по клавишам: ставим Terraform и его форк OpenTofu, готовим аккаунт в Yandex Cloud, выдаем права сервисному аккаунту и настраиваем провайдер так, чтобы он реально достучался до облака. И отдельно разберем больную для России тему - почему официальный реестр провайдеров иногда недоступен и как это лечится зеркалом.

Боль, которую мы закрываем, простая. Ты нашел в интернете пример на HCL, скопировал, запустил terraform init - и получил то таймаут до registry.terraform.org, то ошибку аутентификации, то непонятное folder_id is required. После этого урока ни одна из этих формулировок тебя не удивит.

Ставим Terraform и OpenTofu

Сначала о том, что вообще ставить. Terraform - продукт HashiCorp, с 2023 года он под лицензией BSL (не совсем open source). В ответ сообщество сделало форк OpenTofu - полностью открытый, совместимый по командам и формату state. На уровне команд это почти близнецы: где у одного terraform, у другого tofu. Весь HCL, все провайдеры, вся логика из этого курса работают одинаково. Выбирай по вкусу и по требованиям компании; если сомневаешься - бери OpenTofu, меньше юридических вопросов.

Самый бытовой способ установки по системам.

Linux (Debian/Ubuntu, через пакетный репозиторий HashiCorp):

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

wget -O - https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform
macOS (через Homebrew):

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

brew tap hashicorp/tap
brew install hashicorp/tap/terraform
# или OpenTofu:
brew install opentofu
Windows проще всего через winget или choco:

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

winget install Hashicorp.Terraform
# или OpenTofu:
winget install OpenTofu.Tofu
Проверяем, что бинарник на месте:

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

terraform version
# либо
tofu version
Очень скоро ты столкнешься с тем, что один проект хочет Terraform 1.5, другой - 1.9, а третий вообще OpenTofu. Держать в голове ручную переустановку - боль. Поэтому сразу заведи менеджер версий tenv - он умеет ставить и переключать и terraform, и tofu:

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

tenv tf install 1.9.8
tenv tf use 1.9.8
tenv tofu install latest
В корне проекта кладешь файл с нужной версией, и tenv сам подхватит ее, когда ты зайдешь в каталог. Это тот случай, когда пять минут настройки экономят часы будущей злости.

Изображение

Готовим Yandex Cloud: облако, каталог, сервисный аккаунт

Чтобы Terraform мог что-то создать, ему нужны три вещи: куда складывать ресурсы и чем доказать, что он это ты. Разберем иерархию Yandex Cloud, потому что она прямо отражается в настройках провайдера.
  • Облако (cloud) - верхний контейнер, у него есть cloud_id.
  • Каталог (folder) - внутри облака, именно сюда обычно и кладутся ресурсы; у него folder_id.
  • Сервисный аккаунт (service account) - робот, от имени которого Terraform ходит в API. Ему выдают роли.
Дальше нам понадобится yc CLI - официальная утилита Yandex Cloud. Ставим и логинимся:

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

curl -sSL https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash
exec -l $SHELL
yc init
yc init проведет тебя по браузерной авторизации, попросит выбрать облако, каталог и зону по умолчанию. После этого узнать нужные идентификаторы можно так:

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

yc config list
yc resource-manager cloud list
yc resource-manager folder list
Теперь создаем сервисный аккаунт и даем ему права. Для учебы хватит роли editor на каталоге, в реальном проекте права режут точечно (об этом отдельный разговор позже):

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

yc iam service-account create --name tf-sa

yc resource-manager folder add-access-binding <folder_id> \
  --role editor \
  --subject serviceAccount:<service_account_id>

yc iam key create \
  --service-account-name tf-sa \
  --output key.json
Файл key.json - это и есть авторизованный ключ сервисного аккаунта в формате JSON. Его нельзя коммитить в git, сразу добавь в .gitignore. Альтернатива ключу - короткоживущий IAM-токен (yc iam create-token), но он живет около 12 часов и для постоянной работы неудобен.

Настраиваем провайдер yandex

Когда есть идентификаторы и ключ, описываем провайдер. Минимальный блок выглядит так (имена атрибутов взяты из документации провайдера, не выдумывай свои):

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

terraform {
  required_providers {
    yandex = {
      source  = "yandex-cloud/yandex"
      version = ">= 0.100.0"
    }
  }
}

provider "yandex" {
  service_account_key_file = "key.json"
  cloud_id  = "b1gxxxxxxxxxxxxxxxxx"
  folder_id = "b1gyyyyyyyyyyyyyyyyy"
  zone      = "ru-central1-d"
}
Запомни ключевое правило: в провайдере должен быть указан ровно один способ аутентификации - либо token, либо service_account_key_file. Оба сразу нельзя. Вариант с токеном:

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

provider "yandex" {
  token     = "t1.xxxxx..."
  cloud_id  = "b1gxxxxxxxxxxxxxxxxx"
  folder_id = "b1gyyyyyyyyyyyyyyyyy"
  zone      = "ru-central1-d"
}
Хардкодить секреты в .tf - дурной тон. Все эти параметры провайдер умеет читать из переменных окружения: YC_TOKEN, YC_SERVICE_ACCOUNT_KEY_FILE, YC_CLOUD_ID, YC_FOLDER_ID, YC_ZONE. То есть можно оставить блок provider "yandex" {} пустым и экспортировать значения в шелл - в код секреты не попадают:

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

export YC_SERVICE_ACCOUNT_KEY_FILE="key.json"
export YC_CLOUD_ID="b1gxxxxxxxxxxxxxxxxx"
export YC_FOLDER_ID="b1gyyyyyyyyyyyyyyyyy"
export YC_ZONE="ru-central1-d"
Зеркало провайдеров для РФ

А вот и главная российская засада. По умолчанию source = "yandex-cloud/yandex" разворачивается в полный адрес registry.terraform.org/yandex-cloud/yandex, и при terraform init клиент идет качать плагин именно с registry.terraform.org. С территории РФ этот реестр часто недоступен напрямую, и init виснет на стадии Initializing provider plugins или падает по таймауту.

Лечится это зеркалом. Yandex Cloud держит собственное зеркало провайдеров. Самый чистый способ - прописать его в файле конфигурации CLI ~/.terraformrc (на Windows - %APPDATA%/terraform.rc):

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

provider_installation {
  network_mirror {
    url = "https://terraform-mirror.yandexcloud.net/"
  }
  direct {
    exclude = ["registry.terraform.org/*/*"]
  }
}
После этого terraform init берет плагины с зеркала, минуя недоступный реестр. Для OpenTofu все то же самое, только файл - ~/.tofurc. Есть и оффлайновый путь - команда terraform mirror (точнее, terraform providers mirror ./dir), которая складывает нужные плагины в локальную папку, чтобы потом ставить их без интернета вообще. Это спасает в закрытых контурах.

Обзор основных команд CLI

Дальше весь курс крутится вокруг короткого набора команд. Запомни их сейчас.
  • terraform init - инициализация рабочего каталога: качает провайдеры (через зеркало), готовит backend для terraform state. Запускается первым.
  • terraform fmt - выравнивает форматирование .tf по канону. Привыкай гонять перед каждым коммитом.
  • terraform validate - проверяет синтаксис и согласованность конфигурации, не ходя в облако.
  • terraform plan - показывает, что будет создано, изменено и удалено. Сухой прогон без последствий.
  • terraform apply - применяет план, реально создавая ресурсы. Спросит подтверждение yes.
  • terraform destroy - сносит все, что описано в конфиге. На учебном стенде - твой лучший друг против лишних счетов.
Связка terraform plan apply - это рабочий цикл на каждый день: посмотрел план, убедился, что Terraform собирается сделать именно то, что ты задумал, и только потом применил.

Типичные грабли
  • Таймаут на init из РФ - забыл зеркало. Симптом: висит на Initializing provider plugins. Лечение - ~/.terraformrc выше.
  • token и service_account_key_file одновременно - провайдер ругнется. Оставь что-то одно.
  • Старый source = "yandex.cloud/yandex" из древних гайдов. Правильный адрес - yandex-cloud/yandex (через дефис).
  • key.json уехал в git - классика и беда. Сразу в .gitignore, а если уже закоммитил - ключ считается скомпрометированным, отзывай его в консоли.
  • folder_id is required - не задан каталог ни в провайдере, ни через YC_FOLDER_ID.
  • IAM-токен протух - живет около 12 часов. Для долгой работы бери ключ сервисного аккаунта.
Мини-лаба

Повтори руками, без этого дальше будет тяжело:
  • Поставь Terraform или OpenTofu и проверь terraform version.
  • Через yc init залогинься и забери cloud_id, folder_id командой yc config list.
  • Создай сервисный аккаунт tf-sa, выдай роль editor, выгрузи key.json.
  • Пропиши зеркало в ~/.terraformrc.
  • Сделай папку, положи туда блок terraform {} и provider "yandex" {} из урока, запусти terraform init и убедись, что плагин скачался с зеркала. Затем terraform validate.
Контрольные вопросы
  • Чем OpenTofu отличается от Terraform и почему их команды взаимозаменяемы?
  • Какие два взаимоисключающих способа аутентификации есть у провайдера yandex и в каком случае какой удобнее?
  • Почему terraform init может зависнуть из РФ и как именно это чинит зеркало terraform-mirror.yandexcloud.net?
  • В каком порядке идут init, plan и apply и зачем вообще нужен отдельный шаг plan?
Итог - что запомнить

Terraform и OpenTofu - почти одно и то же, выбирай и не мучайся. Для работы с Yandex Cloud нужны cloud_id, folder_id, зона и способ входа: ключ сервисного аккаунта (надежнее) или IAM-токен (на 12 часов). Секреты держи в переменных окружения YC_*, а не в .tf. Из России обязательно прописывай зеркало провайдеров в ~/.terraformrc, иначе terraform init не достучится до registry.terraform.org. И заучи шесть команд: init, fmt, validate, plan, apply, destroy - на них держится вся инфраструктура как код. В следующем уроке наконец создадим первую реальную виртуалку.
👍4 ❤️2 🔥 😄 🤔1
Аватара пользователя
ansiblesre
Сообщения: 1
Зарегистрирован: 15 май 2026, 03:41

Re: Установка Terraform и OpenTofu, подготовка Yandex Cloud

Сообщение ansiblesre »

Спасибо, наконец-то заработал init! Сидел полчаса с зависанием на провайдере, пока не дочитал до зеркала в ~/.terraformrc. У меня без него реально таймаут был.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
r00tcause
Сообщения: 1
Зарегистрирован: 13 май 2026, 16:48

Re: Установка Terraform и OpenTofu, подготовка Yandex Cloud

Сообщение r00tcause »

А подскажите, key.json безопаснее токена выходит? Я думал токен проще, а он оказывается всего на 12 часов живёт. Тогда понятно почему у меня apply на следующий день падал с ошибкой авторизации.
👍1 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Как работает Terraform под капотом и кто такой OpenTofu
Следующая глава →
Первый ресурс: разворачиваем виртуальную машину в Yandex Cloud

Все главы курса «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 гость