で定義されたバイナリ型はありませんテラフォームに似terraformにAND AND OR条件演算子がありますか?
回数= "$ {var.I_am_true}" & & "$ {var.I_am_false}"
で定義されたバイナリ型はありませんテラフォームに似terraformにAND AND OR条件演算子がありますか?
回数= "$ {var.I_am_true}" & & "$ {var.I_am_false}"
deniszhの答えはかなり近いですが、私はそれを少し明確にして構文を整理すると思っていました。テラフォームで
、ブールtrue
は1
に変換され、ブールfalse
は0
に変換されます。ですから、2つのブール変数、var.foo
とvar.bar
を持っている場合、あなたは単純な乗算使っAND
を表すことができます。上記のコードで
count = "${var.foo * var.bar}"
を、count
は* 1 1があるようvar.foo
とvar.bar
は、両方のtrue
ある場合にのみ、1になります1.他のすべてのケース(1 * 0、0 * 1、0 * 0)では、0が返されます。
ORを表すには、signum(x)の機能を利用できます。x
を渡すと1が返されますは正の数であり、x
が0の場合は0、x
の場合は-1 egative number。このことを考慮し、ここでOR:いずれかvar.foo
OR var.bar
が共にfalse
(signum(1 + 1) = 1
、signum(1 + 0) = 1
、signum(0 + 1) = 1
、signum(0 + 0) = 0
)である場合にのみtrue
と0である場合、上記のコードでは
count = "${signum(var.foo + var.bar)}"
、count
は1です。
上記の手法を使用するには、変数を文字列ではなくブール値に設定する必要があります。 Terraform tips & tricks: loops, if-statements, and gotchasとTerraform: Up & Runningをチェックアウトし、テラフォームの条件文の様々な操作を行う方法についての詳細情報については
variable "foo" {
# THIS WILL NOT WORK!
default = "true"
}
:
variable "foo" {
# Proper boolean usage
default = true
}
ないで、この:あなたはこれをしたいです。
を何かを使用する方法はありますテラフォーム。しかし、あなたは使用しようとすることができますsimple math
たとえば、 I_am_true == 1とI_am_falseの== 0
はしかし、両方をしようとしなかった場合
または同等
count = signum(${var.I_am_true} + ${var.I_am_false})
と同等
count = ${var.I_am_true} * ${var.I_am_false}
の両方が動作します。
Terraform 0.8conditional logicのファーストクラスのサポートを、以前のハックの回避策ではなく追加しました。env
が"production"
に設定されている場合
variable "env" { default = "development" }
resource "aws_instance" "production_server" {
count = "${var.env == "production" ? 1 : 0}"
...
}
は今、これが唯一の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}"
}
一つは、テラフォームが実際にその後に使用される値を選択する前に、両面を評価していることです論理がトリガする三項の面だけを怠惰に評価するのではなく、三項の記述を使用します。
これは、あなたが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に設定されているかどうかによって定義されていません。
私は最後にチェックしたとは思いません。しかし、あなたは問題追跡から何かを見つけるかもしれません:https://github.com/hashicorp/terraform/issues –