Terraform中合并dynamic块为azuredevops_variable_group添加静态变量的方法
报错核心原因
- HCL的
merge()函数仅支持合并map/object类型的值,不能用来拼接嵌套块,你预想的合并dynamic块和静态块的写法本身不符合HCL语法规则。 conflicts with key_vault报错的原因是当前变量组已经关联了Azure Key Vault,直接给variable块显式指定value属性会和AKV关联规则冲突:绑定了AKV的变量默认从密钥库拉取值,不允许手动设置固定value。
另外你示例代码中dynamic块for_each行末尾多了一个多余的右括号,实际使用时需要删除避免语法报错。
解决方案
场景1:新增的secret-4也存储在绑定的AKV中
不需要单独写静态块,直接把变量名加到dynamic块的for_each数组中即可:
resource "azuredevops_variable_group" "secrets" { project_id = ... name = "my-secrets" description = "..." allow_access = true key_vault { name = "my-akv" service_endpoint_id = azuredevops_serviceendpoint_azurerm.dev.id } dynamic "variable" { for_each = [ "secret-1", "secret-2", "secret-3", "secret-4" # 直接追加变量名即可 ] content { name = variable.value } } }
场景2:新增的secret-4是手动赋值的静态变量,不需要从AKV拉取
你需要把所有变量的配置统一整合到遍历集合中,通过动态判断是否赋值value属性避免冲突:
locals { # 统一定义所有变量的配置 variable_list = concat( # AKV同步的变量 [for name in ["secret-1", "secret-2", "secret-3"] : { name = name from_akv = true }], # 手动赋值的静态变量 [{ name = "secret-4" value = "foo" from_akv = false is_secret = true # 按需设置是否加密存储 }] ) } resource "azuredevops_variable_group" "secrets" { project_id = ... name = "my-secrets" description = "..." allow_access = true key_vault { name = "my-akv" service_endpoint_id = azuredevops_serviceendpoint_azurerm.dev.id } dynamic "variable" { for_each = local.variable_list content { name = variable.value.name # 非AKV来源的变量才设置value,null表示不声明该属性 value = variable.value.from_akv ? null : variable.value.value is_secret = variable.value.from_akv ? true : lookup(variable.value, "is_secret", false) } } }
这个写法的核心是利用Terraform对null值的处理逻辑:如果属性赋值为null,等于完全不声明该属性,自然不会触发和key_vault配置的冲突。
内容的提问来源于stack exchange,提问作者Jonathan Prates
相关产品推荐
相关产品推荐

