Terraform - 将类型对象作为参数传递给 Azure 模板部署

2023-12-30

我试图通过为 Terraform 提供 Azure ARM 模板来使用 Terraform 来预配 Azure AD 域服务,这是因为 Terrafrom 本身不支持预配 Azure AD 域服务。

我已经导出了 ARM 模板及其参数,其中一个参数称为"notificationSettings"这是一种类型Object如下所示:

    "notificationSettings": {
        "value": {
            "notifyGlobalAdmins": "Enabled",
            "notifyDcAdmins": "Enabled",
            "additionalRecipients": []
        }
    }

其他参数都是strings我可以毫无问题地通过它们,例如:

"apiVersion" = "2017-06-01"

我尝试将此对象传递给如下参数:

"notificationSettings" = [{
                "notifyGlobalAdmins" = "Enabled"
            "notifyDcAdmins" ="Enabled"
            "additionalRecipients" = []
}]

但是,当我执行terrafrom apply,terraform 抱怨道:

属性“参数”的值不合适:元素 “notificationSettings”:必填字符串。

如何将对象类型的参数传递给template body?

我还尝试通过使用将整个 ARM json 参数作为文件提供给 terraformparameters_body选项如下:

parameters_body = "${file("${path.module}/temp/params.json")}"

但是,在执行 terraform 脚本时出现以下错误:

请求内容无效,无法反序列化:'Error 转换价值 ”https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json# https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#” 输入 “Microsoft.WindowsAzure.ResourceStack.Frontdoor.Data.Definitions.DeploymentParameterDefinition”。 路径“properties.parameters.$schema”,第 1 行,位置 2952。”。

下面是params.json file:

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "apiVersion": {
            "value": "2017-06-01"
        },
        "sku": {
            "value": "Standard"
        "location": {
            "value": "westus"
        },
        "notificationSettings": {
            "value": {
                "notifyGlobalAdmins": "Enabled",
                "notifyDcAdmins": "Enabled",
                "additionalRecipients": []
            }
        },
        "subnetName": {
            "value": "xxxx"
        },
        "vnetName": {
            "value": "xxxx"
        },
        "vnetAddressPrefixes": {
            "value": [
                "10.0.1.0/24"
            ]
        },
        "subnetAddressPrefix": {
            "value": "10.0.1.0/24"
        },
        "nsgName": {
            "value": "xxxxx"
        }
    }
}

有一种方法可以将任意数据结构从 Terraform 传递到 ARM。

有两种方法可以将数据传递到 azure_template_deployment 提供程序中的 ARM 模板

  • use the parameters块,仅限于字符串参数
  • use the parameters_body块,它几乎是任意的 JSON。

我发现使用参数块的最简单方法是使用我需要的结构创建一个局部变量,然后调用jsonencode在上面。我还喜欢将 ARM 模板保存在单独的文件中,并通过file()调用,降低地形的复杂性。

locals {
  location = "string"
  members = [
    "array",
    "of",
    "members"
  ]
  enabled = true
  tags = {
    "key" = "value",
    "simple" = "store"
  }

  # this is the format required by ARM templates
  parameters_body = {
    location = {
      value = "${local.location}"
    },
    properties = {
      value = {
        users = {
          members = "${local.members}"
        }
        boolparameter = "${local.enabled}"
      }
    }
    tags = {
      value = "${module.global.tags}"
    }
  }
}

resource "azurerm_template_deployment" "sample" {
  name = "sample"
  resource_group_name = "rg"
  deployment_mode = "Incremental"
  template_body = "${file("${path.module}/arm/sample_arm.json")}"
  parameter_body = "${jsonencode(local.parameters_body)}"
}

我发现的唯一警告是 bool 参数作为字符串传递,因此在 ARM 参数部分将它们声明为字符串,然后使用 ARM 函数转换为 bool

"parameters: {
  "boolParameter": {
     "type": "string"
  }
},
"variables": {
  "boolVariable": "[bool(parameters('boolParameter'))]"
},
"resources": [
  ...
  "boolArm": "[variables('boolVariable')]",
  ...
]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Terraform - 将类型对象作为参数传递给 Azure 模板部署 的相关文章

随机推荐