terraform中是否有方法和/或条件运算符?
有没有办法在地形中使用这样的东西 count=“${var.I\u am\u true}”和&“${var.I\u am\u false}”terraform中是否有方法和/或条件运算符?,terraform,Terraform,有没有办法在地形中使用这样的东西 count=“${var.I\u am\u true}”和&“${var.I\u am\u false}” Terraform中没有定义二进制类型。但是你可以尝试使用 例如 或同等品 count = signum(${var.I_am_true} + ${var.I_am_false}) count = ${var.I_am_true} * ${var.I_am_false} 和等价物 count = signum(${var.I_am_true} +
Terraform中没有定义二进制类型。但是你可以尝试使用 例如 或同等品
count = signum(${var.I_am_true} + ${var.I_am_false})
count = ${var.I_am_true} * ${var.I_am_false}
和等价物
count = signum(${var.I_am_true} + ${var.I_am_false})
count = ${var.I_am_true} * ${var.I_am_false}
如果I\u am\u true==1和I\u am\u false==0,这两种方法都有效
不过,我没有同时尝试这两种方法。Denisz的答案非常接近,但我想我应该澄清一下,并清理一下语法 在地形中,布尔值
true
转换为1
,布尔值false
转换为0
。因此,如果您有两个布尔变量,var.foo
和var.bar
,则可以使用简单乘法表示和
:
count = "${var.foo * var.bar}"
在上面的代码中,count
只有在var.foo
和var.bar
都是true
时才是1,因为1*1是1。在所有其他情况下(1*0,0*1,0*0),得到0
要表示或,可以利用函数,如果传入的x
为正数,则返回1;如果x
为0,则返回0;如果x
为负数,则返回-1。考虑到这一点,以下是或:
count = "${signum(var.foo + var.bar)}"
在上述代码中,如果var.foo
或var.bar
为true
,则count
将为1,只有当两者都为false
(signum(1+1)=1
,signum(1+0)=1
,signum(0+1)=1
,signum(0+0)=0
)
请注意,要使用上述技术,必须注意将变量设置为布尔值而不是字符串。你想要这个:
variable "foo" {
# Proper boolean usage
default = true
}
不是这个:
variable "foo" {
# THIS WILL NOT WORK!
default = "true"
}
有关如何执行各种地形条件的更多信息,请查看并。添加了对的一流支持,而不是以前的黑客解决方法
这使用了经典的三元语法,因此现在您可以执行以下操作:
variable "env" { default = "development" }
resource "aws_instance" "production_server" {
count = "${var.env == "production" ? 1 : 0}"
...
}
variable "env" { default = "development" }
variable "production_variable" { default = "foo" }
variable "development_variable" { default = "bar" }
output "example" {
value = "${var.env == "production" ? var.production_variable : var.development_variable}"
}
现在,当env
设置为“production”
时,这将仅创建production\u服务器
EC2实例
您也可以在其他地方使用它,例如设置如下所示的变量/参数:
variable "env" { default = "development" }
resource "aws_instance" "production_server" {
count = "${var.env == "production" ? 1 : 0}"
...
}
variable "env" { default = "development" }
variable "production_variable" { default = "foo" }
variable "development_variable" { default = "bar" }
output "example" {
value = "${var.env == "production" ? var.production_variable : var.development_variable}"
}
需要注意的一点是,Terraform实际上在选择三元语句中使用的值之前对双方都进行了求值,而不是懒洋洋地只对逻辑将触发的三元语句的一侧进行求值
这意味着你不能像我最近的例子那样,试图通过以下方式解决一个问题:
在上面的示例中,这将在计划中失败,因为
数据.aws\u路由53\u区域.私有\u区域.区域id
或数据.aws\u路由53\u区域.公共\u区域.区域id
未定义,这取决于公共\u区域
是否设置为真。这在实际版本(0.12.X)中更合适
受支持的操作员包括:
相等:==和=数值比较:>,=,所有答案都足够了,但还有另一种情况 例如,您有多个
环境,如
master
dev
staging
您需要根据这些环境设置OBJECT\u ENABLE
键的值。您可以按如下方式执行此操作:
OBJECT_ENABLE = var.app_env == "master" || var.app_env == "dev" ? "true" : "false"
根据上述条件,OBJECT\u ENABLE
键的值如下:
对于master
:OBJECT\u ENABLE为true
对于dev
:OBJECT\u ENABLE为true
对于staging
:OBJECT\u ENABLE为false
我想上次检查时没有。但您可能会从他们的问题跟踪中发现一些东西:对于Terraform 0.11(2018),请参见下面的我的答案。这应该是当前tf版本的公认答案。