desaib
desaib

Reputation: 13

Terraform mapping and passing values to the module

I am working module creation for AD Group and Group assignments and need help with assigning the group_ids with other member_ids where both values are passed inside the module.

In environment: 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"
    }
  }
}

In module: 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
}

Saving the output of the each Group created above: output.tf

output adgroup_id {
    value =  azuread_group.azuread_group_name
}

Able to read the output values of each object id but struggling with group assignment in module/main.tf:

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

Basically: I will have a list something like this in 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
      ]
    }
  }

And need to pass individual id so it could assign group_object_id with member_object_id Example: Take all possible options in first and then all possible option in second.

For First:

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

For Second:

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

Could someone help please

Upvotes: 1

Views: 2607

Answers (1)

Marcin
Marcin

Reputation: 238847

You can do this as follows (I made your module variables strings, so that I can run the code):


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
}

gives:

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",
    ],                 
  ])                   
}                      

Or if you want to concatenate everything (dots are important, don't remove them):

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

which gives:

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",
  ],
])

Upvotes: 2

Related Questions