Skip to content

Latest commit

 

History

History
102 lines (71 loc) · 8.33 KB

File metadata and controls

102 lines (71 loc) · 8.33 KB

← Оглавление

Terraform

Инфраструктура не кликами в консоли, а кодом: описал в файле — получил тот же сервер и в первый, и в сотый раз


Terraform — инструмент «инфраструктура как код» (IaC, Infrastructure as Code) от HashiCorp: ты декларативно описываешь нужную инфраструктуру (серверы, сети, базы, DNS) в текстовых файлах, а Terraform создаёт и поддерживает её, обращаясь к API облаков. Один язык (HCL) — под любое облако: AWS, GCP, Azure, Yandex Cloud, а также Docker и Kubernetes.

Проблема: инфраструктура «руками»

Поднять сервер кликами в веб-консоли облака быстро, но:

  • не воспроизводимо — через месяц никто не вспомнит точные настройки;
  • нет истории и ревью — кто, что и зачем менял;
  • дрейф — прод и staging расходятся, «у меня работает».

IaC решает это: инфраструктура описана файлом под гитом — её можно ревьюить, версионировать, воссоздать одной командой и держать одинаковой везде.

Как устроено

  • Провайдер (provider) — плагин под конкретную платформу (AWS, Yandex Cloud, Docker…). Он знает, какие ресурсы бывают и как их создавать через API.
  • Ресурс (resource) — единица инфраструктуры: виртуалка, сеть, база, DNS-запись, бакет.
  • Состояние (state) — файл terraform.tfstate: карта «что описано в коде → что реально создано». По нему Terraform понимает, что менять. Ключевой и опасный элемент (см. ловушки).

Декларативность и рабочий цикл

Ты описываешь желаемый конечный вид, а Terraform сам вычисляет разницу с текущим состоянием и приводит к нему (как Kubernetes, только для инфраструктуры, а не контейнеров).

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

resource "yandex_compute_instance" "web" {
  name   = "web-1"
  zone   = "ru-central1-a"
  resources {
    cores  = 2
    memory = 4
  }
  # ...
}
terraform init      # скачать провайдеры, подготовить рабочую папку
terraform plan      # ПОКАЗАТЬ, что будет создано/изменено/удалено — без применения
terraform apply     # применить изменения (создать/поменять инфраструктуру)
terraform destroy   # снести всё, что создано этим конфигом

plan — главная страховка. Он показывает точный diff (+ создать, ~ изменить, - удалить) до того, как что-то произойдёт. Всегда смотри plan перед apply, особенно на проде — заметишь случайное destroy.

Ключевые понятия

  • Идемпотентность. Повторный apply без изменений в коде ничего не делает — Terraform приводит реальность к описанию и удерживает. Изменил код → применяется только разница.
  • Иммутабельность. Часто ресурс проще пересоздать, чем менять на месте (сменил образ ВМ → Terraform удалит старую и создаст новую).
  • Модули (modules) — переиспользуемые пакеты конфигурации (например, «типовой сервис»), с входными переменными и выходами.
  • Переменные и outputs — параметризация конфигурации и передача значений (IP, id) наружу.
  • Удалённое состояние. В команде tfstate хранят не локально, а в общем бэкенде (S3, Terraform Cloud) с блокировкой — чтобы двое не применяли одновременно.

Terraform против Ansible

Их часто путают — но это разные слои:

Terraform Ansible
Задача создать инфраструктуру (provisioning) настроить ПО на существующих серверах (configuration)
Стиль декларативный (желаемое состояние) преимущественно процедурный (шаги)
Пример поднять 3 ВМ и сеть поставить nginx и выкатить конфиг на эти ВМ

Часто их сочетают: Terraform поднимает серверы → Ansible их настраивает.

Ловушки

Ручные правки в обход Terraform. Поменял ресурс кликами в консоли — возник дрейф: реальность разошлась с state. Следующий apply попытается «вернуть как в коде» и может сломать. Правило: всё — только через Terraform.

Потеря/порча tfstate. Без state Terraform «забывает», что создавал, и может задублировать ресурсы. Держи state в удалённом бэкенде с блокировкой и бэкапами, не коммить локальный tfstate в гит.

Секреты в state. Пароли и ключи попадают в tfstate открытым текстом — храни state в защищённом бэкенде, не в публичном репозитории (Веб-безопасность).

Лицензия. С 2023 Terraform перешёл на лицензию BSL (не полностью открытая); полностью open-source форк — OpenTofu (совместим по командам и HCL).

Связи

  • Kubernetes — оркестрация контейнеров; Terraform часто поднимает сам кластер, k8s управляет подами внутри;
  • Docker — Terraform умеет и Docker-провайдером, но обычно оперирует уровнем облака/ВМ;
  • CI CD — terraform plan/apply встраивают в пайплайн (инфраструктура выкатывается автоматически);
  • Развертывание проекта — Terraform готовит серверы, на которые катится приложение;
  • Веб-безопасность — секреты в state; хранение и доступ;
  • конфиги — HCL как язык описания (рядом с YAML/JSON).

Источники