回答
deniszh的答案非常接近,但我想我会澄清一点,并清理语法。
在Terraform中,布尔型true
转换为1
,而布尔型false
转换为0
。所以,如果你有两个布尔变量,var.foo
和var.bar
,您可以使用简单的乘法表示AND
:
count = "${var.foo * var.bar}"
在上面的代码,count
将1只,如果var.foo
和var.bar
都true
,为1 * 1 1.在所有其他情况下(1 * 0,0 * 1,0 * 0),您得到0.
要表示OR,您可以利用函数signum(x),如果传入的x
返回1是一个正数,如果x
为0,则为0,如果x
是-1,则为-1编号。考虑到这一点,下面是OR:
count = "${signum(var.foo + var.bar)}"
在上面的代码,count
将为1如果任var.foo
OR var.bar
是true
和0仅当两者都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"
}
有关如何做各种Terraform条件句,检查出Terraform tips & tricks: loops, if-statements, and gotchas和Terraform: Up & Running更多信息。
的方式有没有定义任何二进制类型Terraform。但您可以尝试使用simple math
E.g.
或同等
count = signum(${var.I_am_true} + ${var.I_am_false})
和等效
count = ${var.I_am_true} * ${var.I_am_false}
双方将工作,如果I_am_true == 1和I_am_false == 0,
没有尝试两种,虽然。
Terraform 0.8加一流的支持conditional logic,而不是以前的哈克解决方法。
本采用了经典的三元语法,所以现在你可以做这样的事情:
variable "env" { default = "development" }
resource "aws_instance" "production_server" {
count = "${var.env == "production" ? 1 : 0}"
...
}
现在,当env
设置为"production"
这只会创建production_server
EC2实例。
你也可以用它在其他地方也如设置这样的变量/参数:
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_route53_zone
data source:
variable "vpc" {}
variable "domain" {}
variable "private_zone" { default = "true" }
data "aws_vpc" "vpc" {
filter {
name = "tag-key"
values = [ "Name" ]
}
filter {
name = "tag-value"
values = [ "${var.vpc}" ]
}
}
data "aws_route53_zone" "private_zone" {
count = "${var.private_zone == "true" ? 1 : 0}"
name = "${var.domain}"
vpc_id = "${data.aws_vpc.vpc.id}"
private_zone = "true"
}
data "aws_route53_zone" "public_zone" {
count = "${var.private_zone == "true" ? 0 : 1}"
name = "${var.domain}"
private_zone = "false"
}
output "zone_id" {
value = "${var.private_zone == "true" ? data.aws_route53_zone.private_zone.zone_id : data.aws_route53_zone.public_zone.zone_id}"
}
在上面的例子中,这将在计划失败,因为无论是data.aws_route53_zone.private_zone.zone_id
或data.aws_route53_zone.public_zone.zone_id
没有根据public_zone
设置为true还是false来定义。
- 1. TypeScript是否有空条件运算符
- 2. 是否有三元运算符不是某种形式的条件运算符
- 3. 条件运算符是否很慢?
- 4. 有和没有条件运算符()
- 5. Apache PIG中是否有任何条件IF运算符?
- 6. 条件运算符语法
- 7. 空,条件运算符和!=
- 8. Powershell和条件运算符
- 9. MASM是否有::运算符?
- 10. PHP语法惊喜与条件运算符“:”和“或”
- 11. 条件运算符是否应该评估所有参数?
- 12. AppleScript是否具有条件(三元)运算符的等效项?
- 13. 当空条件运算符短路时,它是否仍评估方法参数?
- 14. 空条件运算符和无效的方法
- 15. bash中有条件的运算符
- 16. 条件运算符
- 17. 条件运算符
- 18. 多个动态条件或运算符
- 19. GQL中是否有OR运算符?
- 20. 在条件运算符内部运行代码是否安全?
- 21. 是否有像条件运算符那样缩短语句的语法?
- 22. “条件”(?:)运算符是否像JavaScript一样在JavaScript中工作?
- 23. Java&=运算符是否应用&或&&?
- 24. terraform有条件的资源
- 25. Ruby中的运算符和方法
- 26. 在Matlab中是否有一个splat运算符(或等效)?
- 27. rxjs中是否有逻辑或类型的运算符?
- 28. 多条件下的CAML IN运算符和AND运算符
- 29. 或运算符JSOUP select()方法
- 30. 空合并运算符或条件运算
我想我没有最后一次检查。但是你可以从他们的问题追踪中找到一些东西:https://github.com/hashicorp/terraform/issues –