Terraform单模板部署多Azure租户:条件创建资源可行性问询
问题:Terraform条件创建ACR时,未创建资源的输出值会为空吗?
我想用单个Terraform配置,在两个Azure租户里分别部署两个独立环境:
- 环境A:包含容器注册表(ACR)和Kubernetes集群(AKS)
- 环境B:包含一个Kubernetes集群,需要引用环境A的ACR
两个环境不共享tfstate,也不想维护两套Terraform配置,打算用变量控制:
- 在
variable.tf里定义DeployRegistry变量(环境A设为True,环境B设为False)和registry_acr_id变量 - 在
registry.tf里通过count条件创建azurerm_container_registry资源,同时输出registry_acr_id
现在有个疑问:当DeployRegistry设为False、不创建ACR时,输出的registry_acr_id会不会为空?毕竟资源是条件创建的,但输出没有加条件设置。
回答
直接给结论:不会为空,反而会直接报错。因为当count=0时,azurerm_container_registry资源实例根本不存在,此时你直接引用它的.id属性,Terraform会找不到对应资源,导致规划或应用过程失败,而不是输出空值。
针对你的场景,正确的做法是让输出也跟变量DeployRegistry关联,分两种情况返回对应值:
解决方案示例(output.tf)
output "registry_acr_id" { value = var.DeployRegistry ? azurerm_container_registry.acr[0].id : var.registry_acr_id }
逻辑说明
- 部署环境A时:
DeployRegistry=True,输出自己创建的ACR实例ID(因为count=1,所以用[0]取列表里的唯一实例) - 部署环境B时:
DeployRegistry=False,输出预先通过registry_acr_id变量传入的环境A的ACR ID,正好满足环境B的AKS引用需求
这样不管哪种场景,输出都有合法值,不会出现报错或空值的问题。
内容的提问来源于stack exchange,提问作者CloudAnywhere
相关产品推荐
相关产品推荐

