Terraformでこのようなものを使用する方法はありますか?
カウント= "$ {var.I_am_true}" && "$ {var.I_am_false}"
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であり、両方が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のヒントとコツ:ループ、ifステートメント、および問題 およびTerraform :稼働中。
これは実際のバージョン(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
Terraform 0.8 以前のハッキーな回避策ではなく、 条件付きロジック のファーストクラスサポートを追加しました。
これは古典的な三項構文を使用しているため、次のようなことができます。
variable "env" { default = "development" }
resource "aws_instance" "production_server" {
count = "${var.env == "production" ? 1 : 0}"
...
}
これにより、env
がproduction_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
が定義されていないため、これは計画に失敗します。
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の場合、どちらも機能します。
ただし、両方は試しませんでした。