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
上有一个关于同一问题的公开错误报告
我正在尝试使用 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
上有一个关于同一问题的公开错误报告