Как удалить значения с карты в Terraform, которые соответствуют значению ключа

#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 .