#terraform
#terraform
Вопрос:
У меня есть образец карты, подобный приведенному ниже, и я пытаюсь удалить все учетные записи, у которых значение key2 соответствует ‘bong’.
Итак, начальная карта будет выглядеть следующим образом:
sample_map={
account1 = {
key1 ="foo"
key2 ="bar"
}
account2 = {
key1 ="bing"
key2 ="bong"
}
}
И конечный результат должен выглядеть следующим образом:
new_map={
account1 = {
key1 ="foo"
key2 ="bar"
}
}
Я пытался манипулировать следующим циклом for, но это работает, только если var.exclude соответствует метке (не ключу).
new_map = { for k, v in var.sample_map : k => v if ! contains(var.exclude, k) }
Ответ №1:
Вы были почти на месте, если я правильно понимаю. Это должно быть:
contains(values(v), var.exclude)
Рабочий пример приведен ниже:
variable "sample_map" {
default ={
account1 = {
key1 ="foo"
key2 ="bar"
}
account2 = {
key1 ="bing"
key2 ="bong"
}
}
}
variable "exclude" {
default = "bong"
}
output "test" {
value = { for k, v in var.sample_map: k => v if ! contains(values(v), var.exclude) }
}
Который дает:
test = {
"account1" = {
"key1" = "foo"
"key2" = "bar"
}
}
Комментарии:
1. Получилось, спасибо! Трудно найти хорошие примеры выражений If. Ценю помощь!
2. Этот ответ также удалит объекты, которые имеют значение для
key1
сопоставленияvar.exclude
(объекты, для которыхkey1
совпаденияbong
также будут удалены). Если вы знаете, что все объекты будут содержатьkey2
, вы можете определить защиту какif v.key2 != "bong"
. Если вы этого не сделаете, напримерif lookup(v, "key2", null) != var.exclude
.