如何使用Consul中定义的默认值在Terraform中定义可选变量

Mak*_*das 5 consul terraform

我有一个Terraform脚本,其中有一些从Consul填充的变量。我想在两种不同的情况下使用此脚本:

  • 方案1.使用Consul的默认值,一切正常。
  • 方案2。我需要重写一些变量。

我检查了Terraform文档后发现,不能将Consul中定义的变量用作其他变量的默认值。所以我最终得到以下解决方法:

## vars.tf
## emulating undefined value using "null" string
variable "my_optional_variable" { default = "null" } 

## main.tf
my_optional_variable = "${var.my_optional_variable == "null" ? data.consul_keys.my_optional_variable : var.my_optional_variable}"
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我一种更好的方法吗?如何避免“空”字符串被黑客入侵?

谢谢

KCD*_*KCD 5

另一个选择是coalesce使用空字符串,因此比您的"null"字符串稍好。

给定您的方案或具有两个变量/数据源的类似情况

variable "my_default_value" {
  default = "CentOS 7"
}
variable "my_optional_variable" {
  default = ""
}
Run Code Online (Sandbox Code Playgroud)

您可以采用“给定参数中的第一个非空值。必须至少提供两个参数。”

data "openstack_images_image_v2" "bastion_image" {
  name = "${coalesce(var.my_optional_variable, var.my_default_value)}"
}
Run Code Online (Sandbox Code Playgroud)


Seb*_*ian 5

如果您的可选变量需要来自外部或来自声明的资源,您可以使用count和 三元组来完成此操作。

variable "my_variable_id" {
    type = string
    default = ""
}

resource "cloud_resource" "my_resource" {
    count = var.my_variable == "" ? 1 : 0
    other_params = {...}
}

resource "dependent_cloud_resource" "my_other_resource" {
    other_resource_id = var.my_variable_id == "" ? cloud_resrouce.my_resource[0].id : var.my_variable_id
}


Run Code Online (Sandbox Code Playgroud)


Bra*_*ler 3

您可以使用覆盖文件。所以,如果你有vars.tf包含:

variable "my_optional_variable" {
  default = "null"
}
Run Code Online (Sandbox Code Playgroud)

其中override.tf包含:

variable "my_optional_variable" {
  default = "not null"
}
Run Code Online (Sandbox Code Playgroud)

那么${var.my_optional_variable}应该等于not null. 覆盖文件最后加载并合并到您的配置中。.tf而不是像目录中的其他文件一样附加在一起。