Инфраструктура как код (IaC) — описание серверов, сетей и сервисов в декларативных конфигах. Terraform позволяет управлять облачными и on-prem ресурсами через провайдеров (AWS, Yandex Cloud, OpenStack, локальные VM). В статье — базовые концепции и первый модуль.
Зачем Terraform сисадмину
Одинаковые стенды для dev, staging и prod без ручного копирования. Версионирование изменений в Git. Откат инфраструктуры так же просто, как откат кода. Один язык (HCL) для разных провайдеров — не нужно учить десяток консолей.
Ключевые концепции
| Компонент | Назначение |
|---|---|
| Resource | Единица инфраструктуры (VM, диск, сеть); описание в HCL в .tf файлах |
| Provider | Плагин к облаку или API (yandex, aws, openstack, null для локальных скриптов) |
| State (.tfstate) | Текущее состояние ресурсов; хранить в удалённом бэкенде (S3, Terraform Cloud), не в Git |
| Plan | terraform plan — просмотр планируемых изменений без применения |
| Apply | terraform apply — применение изменений к инфраструктуре |
| Variable / tfvars | Переменные для окружений (dev/staging/prod); секреты — через env или vault |
Resource — единица инфраструктуры (VM, диск, сеть). Provider — плагин к облаку или API. State — файл с текущим состоянием; храните в удалённом бэкенде. Plan / Apply — план и применение изменений.
Минимальный пример
Инициализация: terraform init. Пример main.tf с провайдером и одной VM:
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "prod/terraform.tfstate"
region = "ru-central1"
}
}
provider "yandex" {
zone = "ru-central1-a"
}
resource "yandex_compute_instance" "vm1" {
name = "web-server"
platform_id = "standard-v3"
resources {
cores = 2
memory = 2
}
boot_disk {
initialize_params {
image_id = "fd8vmcue7saajtqo1p1g" # Ubuntu 22.04
}
}
network_interface {
subnet_id = "e9b..." # ID подсети в Yandex Cloud или ресурс yandex_vpc_subnet
nat = true
}
}
Команды: terraform init — скачать провайдеры и настроить backend; terraform plan — просмотр плана; terraform apply — применить изменения. Не коммитьте .tfstate с секретами — используйте remote backend (S3, Terraform Cloud) и переменные.
Практики
- Модули для переиспользования: сеть, VM, кластер — отдельные модули с input/output.
- Переменные (
variable,tfvars) для окружений; секреты — через environment или vault. - State lock в S3 + DynamoDB (или аналог) чтобы два apply не шли параллельно.
Кратко: Terraform — декларативный IaC с провайдерами и state. Держите state в бэкенде, модулируйте конфиг, не храните секреты в репозитории. Описание инфраструктуры в базе знаний — плюс к онбордингу и чату по архиву.