簡體   English   中英

如何利用 for_each 縮短我的 Terraform 代碼?

[英]How can I leverage for_each to shorten my Terraform code?

我想創建一組 Azure 策略並將它們添加到使用 Terraform 的計划中。

然而,我建立架構/結構的方式感覺不對,因為我必須一遍又一遍地重復自己。 我的policy-module將會有更多實例(例如module "resource-group-policy" {} )。 目前,我還必須為每個策略資源添加一個policy_definition_reference

我的第一種方法是提出一個附加模塊,將我的policy-module的類似實例捆綁在一起。 這樣,我的 main.tf 變得更短且可讀性更高,但是,它幾乎使我的代碼翻了一番,因為我不得不為我的每個子模塊引入 output var 到 output 策略 id。

有沒有辦法可以利用例如for_each語句來顯着縮短我的 terraform 代碼?

./policy-module/main.tf

terraform {
   # ...
}

resource "azurerm_policy_definition" "policy" {
    # ...
}

./policy-module/output.tf

output "id" {
    value = azurerm_policy_definition.policy.id
}

./policy-module/variables.tf

variable "pattern" {
    type = string
}

# ...

./main.tf

terraform {
  # ...
}

provider "azurerm" {
  # ...
}

resource "azurerm_policy_set_definition" "initiative" {    
    # ...

    policy_definition_reference {
      policy_definition_id = module.management-group-policy.id
    }

    policy_definition_reference {
      policy_definition_id = module.resource-group-policy.id
    }

    # ...    
}
    
module "management-group-policy" {
    source = "./policy-module"

    pattern = "mg-*"
    type = "Microsoft.Management/managementGroups"
    display_name = "Management Groups"
}

module "resource-group-policy" {
    source = "./policy-module"

    pattern = "rg-*"
    type = "Microsoft.Resources/resourceGroups"
    display_name = "Resource Groups"
}

# many more variations of modul

從這樣的事情開始:

module "policies" {
    source = "./policy-module"

    for_each = {
        rg = {
            pattern = "rg-*",
            type = "Microsoft.Resources/resourceGroups",
            display_name = "Resource Groups"
        },
        mg = {
            pattern = "mg-*",
            type = "Microsoft.Management/managementGroups",
            display_name = "Management Groups"
        }
    }

    pattern = each.value.pattern
    type = each.value.type
    display_name = each.value.display_name
}

您的azurerm_policy_set_definition實際上是更棘手的一個:

resource "azurerm_policy_set_definition" "initiative" {    
    # ...

    policy_definition_reference {
        for_each = module.policies

        policy_definition_id = each.key.id
    }
}

我對此不是 100% 確定的,可以試一試,但本質是您需要再次迭代您在上面創建的policies

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM