azurerm_resource_group_template_deployment 忽略参数文件

azurerm_resource_group_template_deployment ignoring parameter file

我正在尝试使用 Terraform 和嵌入式 ARM 模板来允许在 Azure 中创建一个简单的逻辑应用程序。我在 terraform 中的资源块为:

resource "azurerm_resource_group_template_deployment" "templateTEST" {
  name                = "arm-Deployment"
  resource_group_name = azurerm_resource_group.rg.name
  deployment_mode     = "Incremental" 
  template_content    = file("${path.module}/arm/createLogicAppsTEST.json")
  parameters_content = jsonencode({ 
    logic_app_name = { value = "logic-${var.prefix}" }
  })

}

并且 createLogicAppsTEST.json 文件被定义(只是前几行)

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "logic_app_name": {
            "defaultValue": "tsa-logic-dgtlbi-stage-001",
            "type": "string"
        }
    },
    "variables": {},
    "resources": [
        {
....

第一次部署和 运行ning 时,即。使用 Terraform 和嵌入式 ARM 模板创建逻辑应用程序资源,它将创建正确传递的名称给定:

  parameters_content = jsonencode({ 
    logic_app_name = { value = "logic-${var.prefix}" }
  })

但是,如果我再次 运行,terraform 似乎会忽略我传递的参数并使用 ARM 模板中的默认参数:

    "logic_app_name": {
        "defaultValue": "tsa-logic-dgtlbi-stage-001",
        "type": "string"
    }

我已经更新到terraform (0.14.2) 和azurerm (2.40.0) 的最新版本,但问题仍然存在。目前,鉴于我公司的不同层级、开发、测试和生产具有不同的前缀和名称,这种情况使得 ARM 在 terraform 中存在问题。产品-、开发-.

是否有设置使 terraform 实际使用我通过 azurerm_resource_group_template_deployment 资源块传递的参数?

经过我的验证,您可以在嵌套块生命周期中使用 ignore_changes 字段。当计划更新关联的远程对象时,它会告诉 terraform ignore。

例如,

resource "azurerm_resource_group_template_deployment" "templateTEST" {
  name                = "arm-Deployment"
  resource_group_name = azurerm_resource_group.rg.name
  deployment_mode     = "Incremental" 
  template_content    = file("${path.module}/arm/createLogicAppsTEST.json")
  parameters_content = jsonencode({ 
    logic_app_name = { value = "logic-${var.prefix}" }
  })

   lifecycle {
        
        ignore_changes = [template_content,]
    }

}

但是,在这种情况下,最好在嵌入式 ARM 模板中声明没有默认值的空参数,而不是通过 parameters_content.

传递真实参数

例如在ARM模板中声明这样的参数。这将始终使用外部参数的内容。

"logic_app_name": {
    "type": "string"
}

我选择只使用旧的提供程序,实际上在 github

上有一个关于同一问题的公开错误报告