Terraform如何实现if条件满足时才创建并要求输入对应变量
问题根因
Terraform 对输入变量的必填校验发生在资源配置逻辑求值之前。只要你在变量文件中声明了没有配置默认值的输入变量,无论后续资源块里的条件表达式会不会引用到这个变量,执行terraform plan/terraform apply时都会强制要求给所有无默认值的变量传参。
你写的var.drives==2 ? var.size2:null这类条件逻辑,只会决定对应变量值最终会不会传给云盘资源,不会跳过变量本身的必填校验,所以即使drives=1用不到size2、size3,Terraform还是会提示你输入这两个值。
解决方法
改造成本最低的方案是给非必填的size2、size3变量设置默认值null,把它们变成可选输入项,修改后的variable.tf代码如下:
variable size { description = "size of the disk" type = number } variable size2 { description = "size of the disk " type = number default = null } variable size3 { description = "size of the disk " type = number default = null } variable drives { description = "drive value (max=3)" type = number # 可选:增加参数校验,避免传入超出1-3范围的非法值 validation { condition = contains([1, 2, 3], var.drives) error_message = "Valid drives value is 1, 2 or 3." } }
修改后你原来main.tf里的逻辑不需要做任何调整:
- 当
drives=1时,你不需要传入size2、size3,变量会自动取默认值null,最终传给资源的size2、size3也为null,不会创建额外磁盘 - 当
drives=2时,你只需要额外传入size2的值即可,size3保持默认null即可 - 当
drives=3时,传入size2、size3的值就可以正常创建3块磁盘
注意:不要给size2、size3设置0这类非null的默认值,否则当你不需要对应磁盘时,无效的默认值可能会触发资源创建报错,或者创建出不符合预期的小容量磁盘,用
null作为默认值是最安全的选择,Terraform接收到null参数时会直接忽略该配置项。
如果你使用的是Terraform 1.3及以上版本,也可以把磁盘配置整合成带可选属性的对象类型变量,把相关的配置聚合在一起管理,不过上面给的默认值方案改动最小,完全适配你现在的代码结构,适合初学者快速解决问题。
内容的提问来源于stack exchange,提问作者AMAN JAIN
相关产品推荐
相关产品推荐

