Объявления переменных для каждого модуля полностью независимы, поэтому в Terraform нет встроенной функции для их совместного использования.
Если вы используете файловую систему, которая поддерживает символические ссылки, вы можете использовать те же символические ссылки .tf
файл в несколько каталогов, чтобы получить аналогичный эффект.Тем не менее, если набор объявлений переменных не является особенно большим или сложным, я бы рекомендовал просто скопировать их: в долгосрочной перспективе хранение каждой конфигурации часто более полезно, чем избегание небольшого копирования простого стандартного кода.
Если вы используете Terraform v0.12, вы можете объединить все эти общие настройки в единое значение объекта, чтобы уменьшить шаблон:
locals {
context = {
app = "example"
env = var.environment
}
}
module "ec2" {
source = "../service1"
context = local.context
}
module "workspaces" {
source = "../service2"
context = local.context
}
Объявление переменной, подобноеследующие (в каждом из ваших дочерних модулей) сделают форму этого context
объекта более явной, поэтому Terraform сможет обнаружить и сообщить об ошибке, если передано недопустимое значение:
variable "context" {
type = object({
app = string
env = string
})
}
При разложении на несколько модулей обход стандартного набора контекста, подобного описанному выше, часто достаточно хорош, но если ваша система особенно сложна (множество различных подсистем, представленных модулями), в конечном итоге может быть полезно подумать точночто нужно каждому модулю и паэти явные вещи явно, а не просто пропускают один и тот же объект везде.
Например, если вы хотите отделить ec2
модуль от его вызывающего, возможно, вы бы спроектировали еготак что у него нет понятия «приложение» или «окружение» - эти понятия принадлежат модулю вызывающего, но не являются понятиями EC2 - и вместо этого выражают то же самое в более EC2-ориентированном виде, например, через теги:
locals {
# Common tags for all AWS objects
aws_tags = {
Name = "example ${var.environment}"
Environment = var.environment
}
}
module "ec2" {
source = "../service1"
# (other EC2-oriented settings)
tags = local.aws_tags
}
При таком подходе модуль EC2 заботится только о концепциях EC2, а корневой модуль переводит свои собственные представления о «приложении» и «среде» в представление о тегах в EC2.Это может позволить позднее использовать тот же модуль EC2 в другом контексте, где, например, подходит другая схема тегирования.
Более подробная информация об этом подходе приведена в разделе документации Terraform по Состав модуля .