← Infrastructure as Code
12 мин · средне · Урок 4 из 5

Terraform: модули, переменные, outputs

Как переиспользовать инфраструктуру: переменные на вход, outputs наружу и модули как функции для ресурсов.

Зачем переиспользовать

Раньше в треке мы описывали один ресурс. На реальном проекте таких ресурсов десятки, и часто одинаковых: три почти идентичных окружения (dev, staging, prod), пять однотипных виртуалок. Копировать блоки resource плохо: правка в одном месте не доезжает до остальных. Terraform решает это переменными и модулями, как обычный код решает повторы функциями.

Переменные на вход

Переменная делает конфиг настраиваемым: вместо зашитого значения объявляют вход, который задают при запуске.

variable "instance_count" {
  type    = number
  default = 2
}

resource "yandex_compute_instance" "web" {
  count = var.instance_count   # обращение через var.имя
  name  = "web-${count.index}"
}

Значение переменной задают флагом (-var), файлом *.tfvars или переменной окружения. Так один и тот же код поднимает 2 виртуалки в dev и 10 в prod, отличаясь только значением переменной. Это та же идея «один артефакт, разные параметры» из урока про 12-factor.

Outputs наружу

Output отдаёт значение из конфигурации наружу: то, что понадобится после применения (IP созданной виртуалки, адрес базы).

output "web_ip" {
  value = yandex_compute_instance.web[0].network_interface[0].nat_ip_address
}
$ terraform apply
...
Outputs:
web_ip = "51.250.1.42"

Outputs показываются после apply и нужны, чтобы передать результат дальше: в скрипт деплоя, в другой модуль, в документацию.

Модули как функции

Модуль это папка с Terraform-кодом, которую вызывают как функцию: передают переменные на вход, получают outputs наружу. Внутри модуля описаны ресурсы, а снаружи он используется одним блоком.

module "database" {
  source         = "./modules/postgres"
  instance_count = 1
  disk_size      = 50
}

# результат модуля доступен как module.database.connection_string

source указывает, где лежит модуль (локальная папка, git-репозиторий, реестр модулей). Один модуль postgres вызывают три раза с разными переменными для dev/staging/prod, и инфраструктура остаётся единообразной. Изменение в модуле применяется ко всем, кто его вызывает.

Что важно запомнить

Переменные (variable, обращение через var.) делают конфиг настраиваемым: один код, разные параметры для разных сред. Outputs отдают результат наружу (IP, адреса) после применения.

Модуль — папка с кодом, которую вызывают как функцию: переменные на вход, outputs наружу. Один модуль переиспользуют для многих сред, и правка в нём доезжает до всех вызовов.

В следующем уроке разберём удалённый state и блокировки для командной работы.

Прошли материал до конца? Отметьте урок пройденным.