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

use*_*360 15 terraform

有没有办法在Terraform中使用这样的东西?

count ="$ {var.I_am_true}"&&"$ {var.I_am_false}"

Nic*_*owe 25

这在实际版本中更合适(0.11.X)

支持的运营商是:

等式:==和!=
数值比较:>,<,> =,<=
布尔逻辑:&&,||,一元!

https://www.terraform.io/docs/configuration/interpolation.html#conditionals

condition_one和条件二:

count = var.condition_one && var.condition_two ? 1 : 0
Run Code Online (Sandbox Code Playgroud)

contiion_one和NOT condition_two:

count = var.condition_one && !var.condition_two ? 1 : 0
Run Code Online (Sandbox Code Playgroud)

condition_one OR condition_two:

count = var.condition_one || var.condition_two ? 1 : 0
Run Code Online (Sandbox Code Playgroud)

  • 这应该是当前tf版本的可接受答案。 (3认同)

Yev*_*man 17

deniszh的答案非常接近,但我想我会澄清它并清理语法.

在Terraform中,布尔值true转换为a 1,布尔值false转换为a 0.因此,如果您有两个布尔变量,var.foo并且var.bar可以AND使用简单乘法表示:

count = "${var.foo * var.bar}"
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,count仅当var.fooAND var.bar为两者时才true为1,因为1*1为1.在所有其他情况下(1*0,0*1,0*0),您得到0.

要表示OR,您可以利用函数signum(x),如果x传入的是正数,则返回1 ,如果x是0则返回0,如果x是负数,则返回-1 .考虑到这一点,这里是OR:

count = "${signum(var.foo + var.bar)}"
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,count将是1,如果任一var.fooOR var.bartrue0仅当两者都是false(signum(1 + 1) = 1,signum(1 + 0) = 1,signum(0 + 1) = 1,signum(0 + 0) = 0).

请注意,要使用上述技术,必须注意将变量设置为布尔值而不是字符串.你要这个:

variable "foo" {
  # Proper boolean usage
  default = true
}
Run Code Online (Sandbox Code Playgroud)

不是这个:

variable "foo" {
  # THIS WILL NOT WORK!
  default = "true"
}
Run Code Online (Sandbox Code Playgroud)

有关如何执行各种Terraform条件的更多信息,请查看Terraform提示和技巧:循环,if语句和陷阱以及Terraform:Up&Running.


yda*_*coR 7

Terraform 0.8增加了对条件逻辑的一流支持,而不是以前的hacky变通方法.

这使用经典的三元语法,所以现在你可以做这样的事情:

variable "env" { default = "development" }

resource "aws_instance" "production_server" {
  count = "${var.env == "production" ? 1 : 0}"
  ...
}
Run Code Online (Sandbox Code Playgroud)

现在这只会production_serverenv设置为时创建EC2实例"production".

您也可以在其他地方使用它,例如设置变量/参数,如下所示:

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}"
}
Run Code Online (Sandbox Code Playgroud)

有一点需要注意的是,Terraform实际上会在选择三元语句中使用的值之前对双方进行评估,而不是懒惰地评估逻辑将触发的三元一侧.

这意味着你不能做这样的事情,就像我最近试图解决aws_route53_zone数据源问题一样:

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}"
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,这将在计划中失败,因为根据是设置为true还是false,定义了data.aws_route53_zone.private_zone.zone_iddata.aws_route53_zone.public_zone.zone_id未定义public_zone.


小智 6

所有答案都足够了,但还有另一种情况。

例如,您有multiple这样的环境;

  • master
  • dev
  • staging

并且需要OBJECT_ENABLE根据这些环境来设置key的值。您可以按照以下方式执行此操作:

OBJECT_ENABLE = var.app_env == "master" || var.app_env == "dev" ? "true" : "false"
Run Code Online (Sandbox Code Playgroud)

根据上述条件,OBJECT_ENABLEkey的值如下;

对于masterOBJECT_ENABLEtrue

对于devOBJECT_ENABLEtrue

对于stagingOBJECT_ENABLEfalse