web-dev-qa-db-ja.com

テラフォームにAND / OR条件演算子がありますか?

Terraformでこのようなものを使用する方法はありますか?

カウント= "$ {var.I_am_true}" && "$ {var.I_am_false}"

16
user2062360

Deniszhの答えはかなり近いですが、少し明確にして構文をクリーンアップすると思いました。

Terraformでは、ブールtrueは_1_に変換され、ブールfalseは_0_に変換されます。したがって、2つのブール変数_var.foo_と_var.bar_がある場合、単純な乗算を使用してANDを表すことができます。

_count = "${var.foo * var.bar}"
_

上記のコードでは、countは、1 * 1が1であるため、_var.foo_ AND _var.bar_が両方ともtrueである場合にのみ1になります。他のすべての場合(1 * 0、0 * 1、0 * 0) 、0を取得します。

ORを表すには、関数 signum(x) を利用できます。これは、渡したxが正の数の場合は1を返し、xが0の場合は0を返し、xがaの場合は-1を返します。負の数。これを考慮に入れて、ここにOR:

_count = "${signum(var.foo + var.bar)}"
_

上記のコードでは、いずれかの_var.foo_ OR _var.bar_がcountである場合、trueは1であり、両方が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のヒントとコツ:ループ、ifステートメント、および問題 およびTerraform :稼働中

18

これは実際のバージョン(0.12.X)でより適切です

サポートされている演算子は次のとおりです。

同等:==および!=
数値比較:>、<、> =、<=
ブール論理:&&、||、単項!

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

condition_oneと条件2:

count = var.condition_one && var.condition_two ? 1 : 0

condition_oneおよびNOT condition_two:

count = var.condition_one && !var.condition_two ? 1 : 0

condition_one OR condition_two:

count = var.condition_one || var.condition_two ? 1 : 0
33
NicoKowe

Terraform 0.8 以前のハッキーな回避策ではなく、 条件付きロジック のファーストクラスサポートを追加しました。

これは古典的な三項構文を使用しているため、次のようなことができます。

variable "env" { default = "development" }

resource "aws_instance" "production_server" {
  count = "${var.env == "production" ? 1 : 0}"
  ...
}

これにより、envproduction_serverに設定されている場合にのみ、"production" 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}"
}

知っておくべきことの1つは、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}"
}

上記の例では、data.aws_route53_zone.private_zone.zone_idがtrueに設定されているかfalseに設定されているかに応じてdata.aws_route53_zone.public_zone.zone_idまたはpublic_zoneが定義されていないため、これは計画に失敗します。

8
ydaetskcoR

Terraformで定義されているバイナリタイプはありません。しかし、あなたは simple math を使用することを試みることができます

例えば。

または同等

 count = signum(${var.I_am_true} + ${var.I_am_false})

AND相当

 count = ${var.I_am_true} * ${var.I_am_false}

I_am_true == 1およびI_am_false == 0の場合、どちらも機能します。

ただし、両方は試しませんでした。

2
deniszh