Terraform 1.1.7中对比两个Map并控制资源执行逻辑
Terraform 1.1.7 对比卷配置Map区分变更状态的实现方案
需求背景
需要对比两个Map结构的卷配置:
- 远程状态中的卷配置(来自之前部署的状态输出):
{ "boot_volume_name": { "id": "some id", "size": "100GB" }, "block_volume_name": { "id": "some id", "size": "300GB" }, "block_volume_name2": { "id": "some id", "size": "1000GB" } }
- 本地auto.tfvars中的卷配置:
{ "boot_volume_name": { "id": "some id", "size": "100GB" }, "block_volume_name": { "id": "some id", "size": "400GB" }, "block_volume_name2": { "id": "some id", "size": "1000GB" } }
通过对比两个Map的卷size字段,区分出有变更和无变更的卷,分别用null_resource执行禁用/启用复制的本地命令。
完整实现代码
1. 变量与远程状态引用
首先定义本地卷变量,并引用远程状态:
# variables.tf variable "volumes" { type = map(object({ id = string size = string })) description = "本地定义的卷配置" } # 引用远程状态(根据实际后端调整配置) data "terraform_remote_state" "previous" { backend = "s3" # 示例为S3后端,替换为你的实际后端类型 config = { bucket = "your-terraform-state-bucket" key = "path/to/state/file" region = "us-east-1" } }
2. 本地变量对比逻辑
在locals中实现卷配置的对比,筛选出变更和未变更的卷:
locals { # 本地卷配置(来自auto.tfvars) volumes = var.volumes # 远程状态中的卷配置(假设远程状态输出键为volumes) volumes_from_state = data.terraform_remote_state.previous.outputs.volumes # 筛选size发生变更的卷(仅包含远程状态中已存在的卷) volumes_with_changes = { for key, vol in local.volumes : key => vol if lookup(local.volumes_from_state, key, null) != null && vol.size != local.volumes_from_state[key].size } # 筛选size未变更的卷(仅包含远程状态中已存在的卷) volumes_no_changes = { for key, vol in local.volumes : key => vol if lookup(local.volumes_from_state, key, null) != null && vol.size == local.volumes_from_state[key].size } }
3. 控制null_resource执行命令
分别为变更和未变更的卷定义null_resource,执行对应的复制控制命令:
# 对有size变更的卷禁用复制 resource "null_resource" "disable_replication" { for_each = local.volumes_with_changes provisioner "local-exec" { # 替换为实际的API命令,这里用示例占位 command = "api-command disable-replication --volume-id ${each.value.id}" } # 触发条件:当卷size变更时重新执行命令 triggers = { volume_size = each.value.size } } # 对size未变更的卷启用复制 resource "null_resource" "enable_replication" { for_each = local.volumes_no_changes provisioner "local-exec" { # 替换为实际的API命令,这里用示例占位 command = "api-command enable-replication --volume-id ${each.value.id}" } # 可选:依赖禁用操作,确保执行顺序 depends_on = [null_resource.disable_replication] }
关键逻辑说明
- 对比逻辑:使用
for表达式遍历本地卷,通过lookup安全获取远程状态中的对应卷,对比size字段筛选结果 - 触发机制:
null_resource的triggers字段确保只有当卷size变更时,才会重新执行命令 - 兼容性:所有语法兼容Terraform 1.1.7,未使用高版本特性
内容的提问来源于stack exchange,提问作者Deprived.Writer
相关产品推荐
相关产品推荐

