[英]If else condtion using terrafrom modules
我想在我的代碼中創建一個 if else 條件。 假設我想提供一個服務器,我只想確定如果 (name = abc or name=xyz) & (type=pqr) 那么我的實例類型=jkl。
我無法在我的 variables.tf 文件中設置這樣的條件。 PS:我是 Terraform 的新手(2 小時前)。 謝謝
這是一個例子。 我希望 instance_type 自動獲取值“pqr”
testabc.tf
module "testabc" {
source ="/modules/xyz"
name = "abc"
hostname = "jdksnkfjsdn"
instance_type = "hfd"
}
您描述想要實現的目標的方式不可能以您嘗試實現的方式實現。 但是,通過一些額外的配置,可以做到這一點。 例如,如果你要為根模塊創建變量,那么你可以做你想做的。
variable "name" {
type = string
description = "Instance name."
}
variable "type" {
type = string
description = "Some type."
}
然后,在模塊調用中,您可以將代碼調整為以下幾行:
module "testabc" {
source = "/modules/xyz"
name = var.name
hostname = "jdksnkfjsdn"
instance_type = (var.name == "abc" || var.name == "xyz" ) && (var.type == "pqr") ? "jkl" : "some other instance type"
}
上面的例子是在 terraform 中使用條件表達式 [1] 。它類似於編程語言中的三元運算符,就好像表達式的第一部分的計算結果為true
,然后是?
之后的值。 將分配給instance_type
參數。 如果它的計算結果為false
, instance_type
將在:
之后分配一個值。
換句話說,如果
(var.name == "abc" || var.name == "xyz" ) && (var.type == "pqr")
計算結果為true
,然后是instance_type = "jkl"
。 如果上述表達式為假,則instance_type = "some other instance type"
。
[1] https://developer.hashicorp.com/terraform/language/expressions/conditionals
我希望你知道你想要實現這一目標的原因和原因。 添加多個條件將使您的 Terraform 腳本更加復雜(閱讀更多關於認知復雜性的信息),然后您可能會失去使用HCL等聲明性語言的優勢。 是的,您可以在許多情況下使用它,但通常您可能希望有一個可預測的 state,它由顯式 Terraform 腳本表示。
現在,您可能想要更多地使用聲明性語言進行練習,因此您可能會重新考慮您的邏輯以實現您想要的,而不是使用 Terraform 無法實現的“條件默認值”。
從您的其他問題( terraform modules if else condition ),我看到以下內容:
if (stack == dev | stack == staging ) & type = xyz):
instance_type =m5.large
else:
instance_type= anything_else
您可以使類似的事情變得更容易(在偽代碼中):
if (stack != "prod" && type == xyz):
instance_type =m5.large
else:
instance_type= anything_else
這將使您的模塊:
variable "name" {
type = string
description = "Instance name."
}
variable "environment" {
type = string
description = "Instance environment"
}
variable "type" {
type = string
description = "Some type."
}
module "testabc" {
source = "/modules/xyz"
name = "${var.environment}-${var.name}"
hostname = "jdksnkfjsdn"
instance_type = (var.environment != "prod" && var.type == "pqr") ? "jkl" : "some other instance type"
}
或者,您可以有多個*.tfvars
文件,您可以在其中設置變量的值,因此您的配置如下:
# dev.tfvars
name = "my dev instance name"
type = "my-dev-instance-type"
和
# prod.tfvars
name = "my production instance name"
type = "my-prod-instance-type"
然后你的模塊看起來像:
variable "name" {
type = string
description = "Instance name."
}
variable "type" {
type = string
description = "Some type."
}
module "testabc" {
source = "/modules/xyz"
name = var.name
hostname = "jdksnkfjsdn"
instance_type = var.type
}
並且在應用時傳遞-env-file
參數,例如:
terraform apply -var-file="dev.tfvars"
如果這些方法都不適合您,請參考上面@Marko E 的回答,因為default
參數中的值之前應該是已知的,並且它們不應該引用配置中的其他內容。
此外,您可以查看local values
,您可以在其中定義將 object 或表達式的結果分配給局部變量:
variable "name" {
type = string
description = "Instance name."
}
variable "type" {
type = string
description = "Some type."
}
locals {
isSomething = (var.name == "abc" || var.name == "xyz" ) && (var.type == "pqr")
}
module "testabc" {
source = "/modules/xyz"
name = var.name
hostname = "jdksnkfjsdn"
instance_type = local.isSomething ? "jkl" : "some other instance type"
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.