terraform中是否有方法和/或条件运算符?

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} +

有没有办法在地形中使用这样的东西

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} + ${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版本的公认答案。