如何在Terraform中修改ARM参数文件指定值后执行Azure部署
原写法存在的问题
你当前的写法存在3处错误,无法正常运行:
- Terraform中所有
local值都是不可修改的,你尝试直接给local.raw_data.parameters下的键赋值属于语法错误,执行plan阶段就会直接报错 - ARM参数的每个参数项必须是包含
value字段的对象结构,你直接把local.FirstValue赋值给"First Key"会导致结构不符合要求,Azure部署时会拒绝识别该参数 parameters_content的赋值多套了一层无用的{},jsonencode({ local.raw_data })生成的结构完全不符合ARM参数文件的规范,会直接触发部署失败
正确高效的实现方式
使用Terraform内置的merge函数合并原始参数和需要覆盖的参数即可,不需要修改原始解码后的值,写法如下:
// ---- local.tf ---- // 解码原始参数文件 raw_params = jsondecode(file("arm_template_parameters.json")) // 合并覆盖需要修改的参数,其余参数保持不变 final_arm_params = merge( local.raw_params, { parameters = merge( local.raw_params.parameters, { "First Key" = { value = local.FirstValue } "Second Key" = { value = local.SecondValue } } ) } )
// ---- main.tf ---- resource "azurerm_resource_group_template_deployment" "rgtemplatedeployment" { name = local.arm_temp_deployment_name resource_group_name = var.resource_group_name deployment_mode = "Incremental" parameters_content = jsonencode(local.final_arm_params) template_content = file("arm_template.json") }
该写法会完整保留原始参数文件的$schema、contentVersion字段,以及除了First Key、Second Key之外的所有参数取值,完全符合Azure ARM部署的参数规范。如果不需要单独抽离参数处理逻辑,也可以把merge逻辑直接写在parameters_content字段中,拆分到local变量只是为了更高的可读性和可维护性。
内容的提问来源于stack exchange,提问作者Mukteswar Patnaik
相关产品推荐
相关产品推荐

