Terraform≤0.13下硬件规格变更时重建VM的方案咨询
解决方案:使用
for_each触发实例重建 在Terraform ≤0.13版本中,无法使用replace_triggered_by,可以通过for_each将硬件规格作为资源的唯一标识,实现规格变更时自动重建VM的需求。
代码示例
resource "oci_core_instance" "my_instance" { # 将规格值包装为集合,作为for_each的判断依据 for_each = toset([var.etcd_shape]) # 必填参数示例(根据实际环境补充) compartment_id = var.compartment_id shape = each.key # 直接使用集合元素作为实例规格 # 可选:启用先建后删,避免服务中断 lifecycle { create_before_destroy = true } }
原理说明
当var.etcd_shape变更时,for_each的集合元素会从旧规格切换为新规格:
- Terraform会识别到对应旧规格的实例资源已不在集合中,自动销毁旧实例
- 同时创建对应新规格的新实例,实现完整的重建流程
替代方案(基于你已有的null_resource)
如果希望保留null_resource的触发逻辑,可以通过local-exec执行terraform taint命令强制标记实例为待重建:
resource "null_resource" "shape_trigger" { triggers = { node_shape = var.etcd_shape } provisioner "local-exec" { # 标记实例为待重建,执行terraform apply时会重新创建 command = "terraform taint oci_core_instance.my_instance" } } resource "oci_core_instance" "my_instance" { depends_on = [null_resource.shape_trigger] # 其他必填参数 compartment_id = var.compartment_id shape = var.etcd_shape }
注意:此方案要求运行Terraform的环境已安装Terraform,且有权限修改状态文件。
内容的提问来源于stack exchange,提问作者Jitendra
相关产品推荐
相关产品推荐

