在Azure中使用Terraform检查资源组是否存在的方法咨询
Azure Terraform 资源组存在性判断与条件创建
你之前用azurerm_resources查不到资源组的原因是默认该数据源查询的是资源组内部的资源,而非资源组本身,必须指定资源组的类型Microsoft.Resources/resourceGroups才能正确查询订阅级的资源组。
以下是两种可行的实现方案,均能满足「存在则复用,不存在则创建」的需求:
方案一:通过azurerm_resources精准查询资源组
# 订阅级查询指定名称的资源组 data "azurerm_resources" "target_rg" { name = var.resource_group_name type = "Microsoft.Resources/resourceGroups" } # 判断资源组是否存在 locals { rg_exists = length(data.azurerm_resources.target_rg.resources) > 0 } # 仅当资源组不存在时创建 resource "azurerm_resource_group" "main" { count = local.rg_exists ? 0 : 1 name = var.resource_group_name location = var.resource_group_location } # 统一后续资源使用的资源组名称 locals { target_rg_name = local.rg_exists ? data.azurerm_resources.target_rg.resources[0].name : azurerm_resource_group.main[0].name }
逻辑说明
- 指定
type = "Microsoft.Resources/resourceGroups"后,azurerm_resources会在当前订阅下查询资源组资源 - 通过
length(resources)判断是否有匹配结果,大于0则表示资源组存在 - 用
count控制资源组资源的创建:存在则创建0个,不存在则创建1个 - 后续所有资源直接引用
local.target_rg_name即可自动适配两种场景
方案二:用try函数捕获数据源查询错误
如果更倾向于直接使用azurerm_resource_group数据源,可以用try函数捕获资源组不存在时的报错,返回null来判断状态:
# 尝试查询指定资源组 data "azurerm_resource_group" "target_rg" { count = 1 name = var.resource_group_name } # 捕获查询错误,不存在则返回null locals { existing_rg = try(data.azurerm_resource_group.target_rg[0], null) rg_exists = local.existing_rg != null } # 条件创建资源组 resource "azurerm_resource_group" "main" { count = local.rg_exists ? 0 : 1 name = var.resource_group_name location = var.resource_group_location } # 统一资源组引用 locals { target_rg = local.rg_exists ? local.existing_rg : azurerm_resource_group.main[0] }
逻辑说明
- 用
count=1强制创建数据源实例(避免默认情况下不存在直接报错终止执行) try函数会尝试读取数据源结果,若查询失败(资源组不存在)则返回null- 通过判断
existing_rg是否为null确定资源组状态,后续逻辑与方案一一致
注意事项
- 确保使用azurerm provider 3.0及以上版本,旧版本的
azurerm_resources不支持订阅级资源查询 - 执行Terraform的账号需要拥有订阅级资源读取权限(至少
Microsoft.Resources/subscriptions/resourceGroups/read) - 两种方案任选其一即可,无需混用
内容的提问来源于stack exchange,提问作者timcrall
相关产品推荐
相关产品推荐

