2016-09-13 33 views

回答

1

deniszh的答案非常接近,但我想我会澄清一点,并清理语法。

在Terraform中,布尔型true转换为1,而布尔型false转换为0。所以,如果你有两个布尔变量,var.foovar.bar,您可以使用简单的乘法表示AND

count = "${var.foo * var.bar}" 

在上面的代码,count将1只,如果var.foovar.bartrue,为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.bartrue和0仅当两者都falsesignum(1 + 1) = 1signum(1 + 0) = 1signum(0 + 1) = 1signum(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 gotchasTerraform: Up & Running更多信息。

1

的方式有没有定义任何二进制类型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,

没有尝试两种,虽然。

3

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_iddata.aws_route53_zone.public_zone.zone_id没有根据public_zone设置为true还是false来定义。