Terraform实现OpenStack网络查建一体及CI/CD集成报错排查
解决Terraform查询OpenStack网络不存在时的报错问题
原代码中使用data "openstack_networking_network_v2"查询指定名称网络时,若网络不存在会直接抛出错误:Error: Your query returned no results. Please change your search criteria and try again.,这是因为Terraform默认要求数据源必须返回至少一个结果,无法直接实现“查不到就创建”的逻辑。
修正后的代码
# 查询所有匹配指定名称的网络,不存在时返回空列表而非报错 data "openstack_networking_network_v2" "existed_network_all" { name = "Network-name" all = true } # 仅当网络不存在时创建新网络 resource "openstack_networking_network_v2" "edums_network" { count = length(data.openstack_networking_network_v2.existed_network_all[*].id) == 0 ? 1 : 0 name = "Network-name" } # 可选:若需单独引用已存在网络的属性,添加此数据源 data "openstack_networking_network_v2" "existed_network" { count = length(data.openstack_networking_network_v2.existed_network_all[*].id) > 0 ? 1 : 0 name = "Network-name" }
代码说明
existed_network_all数据源通过all = true参数,查询所有匹配名称的网络资源,即使目标网络不存在,也会返回空列表而非抛出错误。- 通过
length(data.openstack_networking_network_v2.existed_network_all[*].id)判断网络是否存在:- 返回值为0时,说明无匹配网络,创建1个新网络;
- 返回值大于0时,说明网络已存在,跳过创建逻辑。
- 若不需要单独引用已存在网络的属性,可删除
existed_network数据源,直接用existed_network_all完成判断。
CI/CD集成要点
- 确保流水线环境已配置OpenStack认证所需的环境变量,如
OS_AUTH_URL、OS_USERNAME、OS_PASSWORD、OS_PROJECT_NAME等。 - 流水线执行流程建议为:
- 初始化Terraform:
terraform init - 生成执行计划:
terraform plan -out=tfplan - 应用执行计划:
terraform apply tfplan -auto-approve
- 初始化Terraform:
- 若需适配多环境,可将网络名称设为Terraform变量,通过流水线参数传递,替换硬编码的
"Network-name"。
内容的提问来源于stack exchange,提问作者Mohamed BOUZAYEN
相关产品推荐
相关产品推荐

