【问题标题】:How to use `policy_definition_reference` block with templatefile(path,vars) syntax如何使用带有模板文件(路径,变量)语法的`policy_definition_reference`块
【发布时间】:2021-11-03 13:49:57
【问题描述】:

我正在使用 Terraform 设置多个标记策略定义。我已经在自定义 json 文件中提到了带有策略定义 id 和参数的标签定义。

tag_definitions.json

[
  {
    "parameters": {
      "tagName": {
        "value": "cost_center"
      },
      "tagValue": {
        "value": "${cost_center}"
      }
    },
    "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/XXXXXXX-XXXXXXX"
  }
]

ma​​in.tf

resource "azurerm_policy_set_definition" "tag_definition" {
  name         = "${var.subscription_name}-tag-definition"
  display_name = "${var.subscription_name}-tag-definition"
  description  = "Append the default tags definition"
  policy_type  = "Custom"
  policy_definitions = templatefile("${path.module}/templates/tag_definitions.json",
  { cost_center = var.cost_center })
  metadata = <<METADATA
    { "category" : "Tags" }
  METADATA
  lifecycle { ignore_changes = [metadata] }
}

在上面的 main.tf 文件中,policy_definitions 参数现在已被弃用。而不是我想使用policy_definition_reference 参数。

我已关注azurerm_policy_set_definition 文档。但本文档不包含有关如何使用“policy_definition_reference”块设置多个策略定义的信息。

我想将 policy_definition_reference 块与我的自定义 tag_definitions.json 文件以及参数值一起使用。

基于以下 cmets,我尝试使用以下代码。但它没有按预期工作。

tag_definitions_params.json

 [
  {
    "parameters": {
      "tagName": {
        "value": "common.cost_center"
      },
      "tagValue": {
        "value": "${cost_center}"
      }
    }
  },
  {
    "parameters": {
      "tagName": {
        "value": "common.env_type"
      },
      "tagValue": {
        "value": "${env_type}"
      }
    }
  }
]

ma​​in.tf

resource "azurerm_policy_set_definition" "tag_definition" {
  name         = "${var.subscription_name}-tag-definition"
  display_name = "${var.subscription_name}-tag-definition"
  description  = "Append the default tags definition"
  policy_type  = "Custom"
  #policy_definitions = templatefile("${path.module}/templates/tag_definitions.json",
  #{ cost_center = var.cost_center, env_type = var.env_type, owner_accountname = var.owner_accountname, product = var.product })
  policy_definition_reference {
    policy_definition_id = "/providers/Microsoft.Authorization/policyDefinitions/XXXXXXXX"
    parameter_values     = templatefile("${path.module}/templates/tag_definitions_params.json",
                            { 
                              cost_center = var.cost_center,
                              env_type = var.env_type
                            })
  }
  policy_definition_reference {
    policy_definition_id = "/providers/Microsoft.Authorization/policyDefinitions/XXXXXXXXX"
    parameter_values     = templatefile("${path.module}/templates/tag_definitions_params.json",
                            { 
                              cost_center = var.cost_center,
                              env_type = var.env_type
                            })
  }
  metadata = <<METADATA
    { "category" : "Tags" }
  METADATA
  lifecycle { ignore_changes = [metadata] }
}

【问题讨论】:

  • 你收到错误了吗?
  • @MoonHorse,我收到此错误expanding policy_definition_reference: unmarshalling parameter_values: json: cannot unmarshal array into Go value of type map[string]*policy.ParameterValuesValue'

标签: azure terraform-provider-azure azure-policy


【解决方案1】:

您可以在此处找到有关“policy_definition_reference”块的信息:

policy_definition_reference 块支持以下内容:

policy_definition_id -(必填)策略定义的 ID 或 将包含在此策略集中的策略集定义 定义。

parameter_values - (可选)被引用的参数值 政策规则。此字段是一个 JSON 字符串,允许您分配 此策略规则的参数。

reference_id -(可选)此策略集中的唯一 ID 此策略定义参考的定义。

policy_group_names - (可选)策略名称列表 此策略定义引用所属的定义组。

https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/policy_set_definition#policy_definition_reference

你也可以使用如下:

policy_definition_id ="/providers/Microsoft.Authorization/policyDefinitions/XXXXXXX-XXXXXXX" 
parameter_values = templatefile("${path.module}/templates/tag_definitions_params.json" 

因此,您只需将参数包含在 json 文件中,并使用 policy_definition_id 属性在 terraform 代码中设置策略集的 ID。

【讨论】:

  • 感谢 MoonHorse,在我的问题中,我已经明确提到如何在 policy_definition_reference 块内使用多个策略定义 ID。
  • @Pradeep ,策略集或策略倡议是一组多个策略。正如文档中所写,您必须传递策略集定义的 id。清楚了吗?
  • @Pradeep,您还可以多次使用 policy_definition_reference 块。你试过吗?
  • 我正在使用此代码 policy_definitions = templatefile("${path.module}/templates/tag_definitions.json", { cost_center = var.cost_center }) 分配多个策略定义。以同样的方式,我想使用policy_definition_reference 块。
  • 如果您多次使用 policy_definition_reference 块,显然它有效。但我必须使用超过 20 次。取而代之的是,我正在寻找迭代概念。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 2014-03-15
相关资源
最近更新 更多