2016-09-13 14 views
0

で定義されたバイナリ型はありませんテラフォームに似terraformにAND AND OR条件演算子がありますか?

回数= "$ {var.I_am_true}" & & "$ {var.I_am_false}"

+0

私は最後にチェックしたとは思いません。しかし、あなたは問題追跡から何かを見つけるかもしれません:https://github.com/hashicorp/terraform/issues –

答えて

1

deniszhの答えはかなり近いですが、私はそれを少し明確にして構文を整理すると思っていました。テラフォームで

、ブールtrue1に変換され、ブールfalse0に変換されます。ですから、2つのブール変数、var.foovar.barを持っている場合、あなたは単純な乗算使っANDを表すことができます。上記のコードで

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

を、countは* 1 1があるようvar.foovar.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が共にfalsesignum(1 + 1) = 1signum(1 + 0) = 1signum(0 + 1) = 1signum(0 + 0) = 0)である場合にのみtrueと0である場合、上記のコードでは

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

countは1です。

上記の手法を使用するには、変数を文字列ではなくブール値に設定する必要があります。 Terraform tips & tricks: loops, if-statements, and gotchasTerraform: Up & Runningをチェックアウトし、テラフォームの条件文の様々な操作を行う方法についての詳細情報については

variable "foo" { 
    # THIS WILL NOT WORK! 
    default = "true" 
} 

variable "foo" { 
    # Proper boolean usage 
    default = true 
} 

ないで、この:あなたはこれをしたいです。

1

を何かを使用する方法はありますテラフォーム。しかし、あなたは使用しようとすることができます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} 

の両方が動作します。

3

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_iddata.aws_route53_zone.public_zone.zone_idのいずれかpublic_zoneがtrueまたはfalseに設定されているかどうかによって定義されていません。