Выражения for
Terraform являются ответом на большинство проблем, связанных с преобразованием и фильтрацией коллекций, и я думаю, что это верно и в этом случае.
locals {
odd_users = [
for octet, email in var.users : {
email = email
octet = octet
dns_map = tostring(octet)
instance_private_ip = cidrsubnet("11.12.14.0/24", octet)
}
if (octet % 2) == 1
]
even_users = [
for octet, email in var.users : {
email = email
octet = octet
dns_map = tostring(octet)
instance_private_ip = cidrsubnet("11.12.13.0/24", octet)
}
if (octet % 2) == 0
]
}
module "instance" {
source = "..."
instance_private_ip = local.even_users[*].instance_private_ip
dns_map = local.even_users[*].dns_map
users = local.even_users[*].email
}
module "instance2" {
source = "..."
instance_private_ip = local.odd_users[*].instance_private_ip
dns_map = local.odd_users[*].dns_map
users = local.odd_users[*].email
}
В приведенном выше примере два локальных значения сначала фильтруют и преобразуют список, каждое из которых создает список объектов, описывающих пользователей. Затем в двух module
блоках я использовал выражения-сплат , чтобы превратить это обратно в плоский список строк, как вы призывали в своем примере,
Вместо определения трех отдельных переменные в вашем дочернем модуле, которые все должны иметь одинаковую длину и индексы, я бы предложил переработать этот интерфейс, чтобы вместо этого взять один список объектов. Вы можете определить переменную users
в своем дочернем модуле следующим образом:
variable "users" {
type = list(object({
email = string
dns_map = string
instance_private_ip = string
}))
}
Определив ее так, вы можете просто передавать локальные значения непосредственно в вызовы модуля:
module "instance" {
source = "..."
users = local.even_users
}
module "instance2" {
source = "..."
users = local.odd_users
}
Ваш дочерний модуль сам может затем использовать выражения-знаки для повторного получения плоских списков строк, если это то, что ему нужно, или он может использовать список объектов напрямую, в зависимости от того, что дочерний модуль собирается делать с этими списками.