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 и блокировки для командной работы.
Прошли материал до конца? Отметьте урок пройденным.
Прогресс сохранён в этом браузере
Почистишь историю или откроешь с телефона, и отметки пропадут. Оставь почту, они переедут в аккаунт. Пароль придумывать не нужно.
Готово. теперь в аккаунте: прогресс виден с любого устройства. Мой прогресс