【问题标题】:azurerm_resource_group_template_deployment ignoring parameter fileazurerm_resource_group_template_deployment 忽略参数文件
【发布时间】:2021-03-23 06:03:02
【问题描述】:

我正在尝试使用 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": [
        {
....

第一次部署和运行时,即。使用 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) 的最新版本,但问题仍然存在。目前,鉴于我公司的不同层级、dev、test 和 prod 具有不同的前缀和名称,这种情况使得 ARM 在 terraform 中存在问题,即。 prod-, dev-。

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

【问题讨论】:

    标签: terraform arm-template terraform-provider-azure azure-rm


    【解决方案1】:

    经过我的验证,您可以在嵌套块生命周期中使用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"
    }
    

    【讨论】:

    【解决方案2】:

    我选择只使用旧的提供程序,实际上在 github 上有一个关于同一问题的开放错误报告

    【讨论】:

      猜你喜欢
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 2011-12-01
      • 2016-04-21
      • 2013-06-14
      相关资源
      最近更新 更多