Отображение терраформ и передача значений в модуль

#azure #terraform #terraform-provider-azure

Вопрос:

Я работаю над созданием модуля для групп объявлений и назначений групп, и мне нужна помощь в назначении идентификаторов групп с другими идентификаторами участников, где оба значения передаются внутри модуля.

В окружающей среде: var.tf

 variable "azuread_group_name" {
  type = map(object({
    display_name = string
    description  = string
  }))
  default = {
    "Group1" = {
      display_name = "Group1"
      description  = ""
    }
    "Group2" = {
      display_name = "Group2"
      description  = ""
    }
    "Group3" = {
      display_name = "Group3"
      description  = "Desc of group 3"
    }
    "Group4" = {
      display_name = "Group4"
      description  = "Desc of group 4"
    }
    "Group5" = {
      display_name = "Group5"
      description  = "Desc of group5"
    }
  }
}
 

В модуле:
main.tf

 resource "azuread_group" "azuread_group_name" {
  for_each     = var.azuread_group_name
  display_name = each.value.display_name
  description  = each.value.description
}

#Need help here to get values back
resource "azuread_group_member" "example" {
for_each: something to loop through local.project
group_object_id  = read each value of azuread_group_object_id
member_object_id = read each value of azuread_member_object_id
}
 

Сохранение выходных данных каждой группы, созданной выше:
output.tf

 output adgroup_id {
    value =  azuread_group.azuread_group_name
}
 

Способен считывать выходные значения каждого идентификатора объекта, но борется с назначением группы в модуле/main.tf:

 resource "azuread_group_member" "example" {
  group_object_id  = azuread_group.example.id
  member_object_id = data.azuread_user.example.id
}
 

В основном:
У меня будет список примерно такой в local.tf:

 project = {
    first = {
      "azuread_group_object_id" = [
        module.main.adgroup_id["Group1"].id
      ],
      "azuread_member_object_id" = [
        module.main.adgroup_id["Group2"].id,
        module.main.adgroup_id["Group3"].id,
        module.main.adgroup_id["Group4"].id,
      ]
    }
    second = {
      "azuread_group_object_id" = [
        module.main.adgroup_id["Group2"].id,
        module.main.adgroup_id["Group3"].id,
      ],
      "azuread_member_object_id" = [
        module.main.adgroup_id["Group4"].id
        module.main.adgroup_id["Group5"].id
      ]
    }
  }
 

И нужно передать индивидуальный идентификатор, чтобы он мог назначить идентификатор group_object_id с идентификатором member_object_id
Пример:
Возьмите все возможные варианты в первом, а затем все возможные варианты во втором.

Для Первого:

 1. group_object_id -> module.main.adgroup_id["Group1"].id
   member_object_id ->  module.main.adgroup_id["Group2"].id
2. group_object_id -> module.main.adgroup_id["Group1"].id
   member_object_id ->  module.main.adgroup_id["Group3"].id
3. group_object_id -> module.main.adgroup_id["Group1"].id
   member_object_id ->  module.main.adgroup_id["Group4"].id
 

Для Второго:

 4. group_object_id -> module.main.adgroup_id["Group2"].id
   member_object_id ->  module.main.adgroup_id["Group4"].id
5. group_object_id -> module.main.adgroup_id["Group2"].id
   member_object_id ->  module.main.adgroup_id["Group5"].id
6. group_object_id -> module.main.adgroup_id["Group3"].id
   member_object_id ->  module.main.adgroup_id["Group4"].id
7. group_object_id -> module.main.adgroup_id["Group3"].id
   member_object_id ->  module.main.adgroup_id["Group5"].id
 

Не мог бы кто-нибудь помочь, пожалуйста

Комментарии:

1. Теперь все ясно! Спасибо за помощь, Марчин!

Ответ №1:

Вы можете сделать это следующим образом (я сделал строки переменных вашего модуля строками, чтобы я мог запустить код):

 
locals {
  project = {
      first = {
        "azuread_group_object_id" = [
          "module.main.adgroup_id[Group1].id"
        ],
        "azuread_member_object_id" = [
          "module.main.adgroup_id[Group2].id",
          "module.main.adgroup_id[Group3].id",
          "module.main.adgroup_id[Group4].id"
        ]
      }
      second = {
        "azuread_group_object_id" = [
          "module.main.adgroup_id[Group2].id",
          "module.main.adgroup_id[Group3].id",
        ],
        "azuread_member_object_id" = [
          "module.main.adgroup_id[Group4].id",
          "module.main.adgroup_id[Group5].id"
        ]
      }
    }
    
    reshaped = {
                for k,v in local.project:
                 k => setproduct(v["azuread_group_object_id"], v["azuread_member_object_id"])

    }
    
}

output "test" {
  value = local.reshaped
}
 

дает:

 test = {                                  
  "first" = tolist([                      
    [                                     
      "module.main.adgroup_id[Group1].id",
      "module.main.adgroup_id[Group2].id",
    ],                                    
    [                                     
      "module.main.adgroup_id[Group1].id",
      "module.main.adgroup_id[Group3].id",
    ],                                    
    [                                     
      "module.main.adgroup_id[Group1].id",
      "module.main.adgroup_id[Group4].id",
    ],                                    
  ])                                      
  "second" = tolist([                     
    [                                     
      "module.main.adgroup_id[Group2].id",
      "module.main.adgroup_id[Group4].id",
    ],                                    
    [                                     
      "module.main.adgroup_id[Group2].id",
      "module.main.adgroup_id[Group5].id",
    ],                                    
    [                                     
      "module.main.adgroup_id[Group3].id",
      "module.main.adgroup_id[Group4].id",
    ],                                    
    [                                     
      "module.main.adgroup_id[Group3].id",
      "module.main.adgroup_id[Group5].id",
    ],                 
  ])                   
}                      
 

Или, если вы хотите объединить все (точки важны, не удаляйте их):

 output "test" {
  value = concat(values(local.reshaped)...)
}
 

что дает:

 test = tolist([
  [
    "module.main.adgroup_id[Group1].id",
    "module.main.adgroup_id[Group2].id",
  ],
  [
    "module.main.adgroup_id[Group1].id",
    "module.main.adgroup_id[Group3].id",
  ],
  [
    "module.main.adgroup_id[Group1].id",
    "module.main.adgroup_id[Group4].id",
  ],
  [
    "module.main.adgroup_id[Group2].id",
    "module.main.adgroup_id[Group4].id",
  ],
  [
    "module.main.adgroup_id[Group2].id",
    "module.main.adgroup_id[Group5].id",
  ],
  [
    "module.main.adgroup_id[Group3].id",
    "module.main.adgroup_id[Group4].id",
  ],
  [
    "module.main.adgroup_id[Group3].id",
    "module.main.adgroup_id[Group5].id",
  ],
])

 

Комментарии:

1. Спасибо! это помогло. Теперь я могу изменить порядок списка и использовать setproduct и смог получить ожидаемый результат