Terraform升级至1.1.0+版本时状态文件版本字段未更新问题
问题原因
这不是操作流程错误,核心是两个机制导致的:
- Terraform 1.0 进入语义化版本阶段后,只有执行了会修改状态文件内容的操作时,才会更新state里记录的
terraform_version字段。如果切换到1.1、1.2版本后执行plan/apply时没有产生任何实际资源变更,Terraform不会重写状态文件,里面记录的版本号自然停留在1.0.0。 - 要先排查配置里的版本约束:如果所有根模块、子模块里的
required_version写了类似~> 1.0.0、< 1.1.0的硬限制,高版本Terraform执行时会直接抛版本不兼容错误,如果你没注意到报错、实际apply没跑成功,版本号也不会更新。
排查&处理方法
- 切换版本后先执行
terraform version,确认当前终端实际调用的二进制版本就是你要升级的目标版本,排除tfswitch切换不生效、实际仍在调用1.0.0版本的问题。建议直接选目标大版本的最新补丁版(比如1.2系列最新补丁),不要用1.1.0、1.2.0这类初始小版本,初始版本bug较多。 - 全局搜索所有
.tf文件中的required_version配置,把版本约束放宽到覆盖目标升级版本,比如调整为>= 1.0.0, < 1.3.0,调整后执行terraform init重新初始化,确认没有版本兼容类报错。 - 初始化完成后执行
terraform plan,如果输出No changes. Your infrastructure matches the configuration.,说明没有资源需要变更,此时状态文件不更新版本号是正常现象。这个字段仅记录最后一次修改状态时使用的Terraform版本,不代表高版本无法正常管理现有资源,只要plan无兼容报错,就已经可以正常用高版本操作,不需要刻意追求这个字段的更新。 - 如果需要强制更新状态里的版本记录,执行一次仅刷新状态的操作即可:1.0到1.1版本用
terraform refresh,1.2及以上版本用terraform apply -refresh-only,执行完成后再拉取状态查看,版本号就会更新为当前使用的Terraform版本。
额外说明:1.0之后的Terraform跨小版本是向后兼容的,不需要像0.x阶段那样每升一个小版本就执行一次apply,直接切到目标1.x版本做初始化、验证plan无异常就完成升级了,不用逐版本递进操作。
内容的提问来源于stack exchange,提问作者Maverick32
相关产品推荐
相关产品推荐

