一 terraform apply的是什么?
我们正常在使用terraform时,先init初始化本地配置,再执行plan生成一个plan文件以供审阅,看看那些东西是变更了,比如哪些东西是创建,哪些要更新,哪些要被摧毁等,我们可以apply执行此时审阅后的plan文件,然后就是可以得到 我们期待的资源。
一个问题是apply的是什么?从上面的描述我们知道,apply会执行terraform中的配置文件,比如创建/更新/摧毁资源,所以aplly时会与provider交互,调用相应的api进行资源管理,API执行完毕后,会返回对应资源的ID等信息,terraform cli再将信息搜集后存储到state file,就形成了最初的state file。
二 terraform refresh 干了什么事?
我们都清楚refresh会根据本地的资源state file文件,到infra上查找对应的资源,如果资源不存在则从state file移除对应的状态,如果资源有变更,则会同步最新的infra上的资源信息到state file,这样就得到了refresh后的state file,基本是跟infra上是一致的,但是我说的是基本,如果有些资源不是terraform创建的,则需要terraform另外的import功能,将资源纳入state file 管理,这个另当别论。
三 为什么不一致?
根据上面的分析,我们知道:
1. 如果资源被terraform创建后,存在人为的变更,那么就会导致状态不一致,所以这个时候的资源state file跟实际是不一样。
2.还有一种情况,就是refresh调用的API跟apply返回的数据是一样的。但是apply主要作用是应用并反馈plan的变更,而refresh反馈的是真实的infra的状态。比如资源一共ABCD四个字段,apply时变更返回了A,B,C三个重要配置字段 ;但是在refresh时返回的是全字段A,B,C,D;所以这也是导致差异的一个 重要原因。
3.最后比较恶劣的情况,就是state file被人篡改了,这是不允许的。
四 总结
本文简单臆测了apply后的state file不一致的推测原因,真正的缘由还需要看源码实地探究,以上内容为个人臆测,如有雷同纯属意外。