簡體   English   中英

If else 條件使用 terrafrom 模塊

[英]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參數。 如果它的計算結果為falseinstance_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM