将两个变量组合成一个新变量的Terraform操作

7
我希望自动化部署Vmware VM的过程,但是在有大量端口组的情况下,为了选择正确的端口组,最好输入2个变量租户和环境。这两个变量用于CMDB注册和部署目的。
在部署过程中,需要将这两个变量合并成一个新变量以选择正确的端口组。由于插值语法,似乎不可能在查找中使用2个合并的变量。
如何在Terraform中将2个变量合并成1个?
我还尝试创建一个具有正确字符串的本地文件,但需要在脚本启动之前存在该文件,terraform plan会提示文件不存在的错误消息。
variable "tenant" {
  description = "tenant: T1 or T2"
}

variable "environment" {
  description = "environment: PROD or TEST"
}

variable "vm_network" {
  description = "network the VM will be provisioned with"
  type = "map"
  default = {
    T1_PROD = "T1-PROD-network"
    T2_PROD = "T2-PROD-network"
    T1_TEST = "T1-TEST-network"
    T2_TEST = "T2-TEST-network"
  }
}

data "vsphere_network" "network" {
  name          = "${lookup(var.vm_network, tenant_environment)}"
  datacenter_id = "${data.vsphere_datacenter.dc.id}"
}
1个回答

9

我能够想到三种不同的方法来合并变量以用作查找键:

variable "tenant" {}
variable "environment" {}

variable "vm_network" {
  default = {
    T1_PROD = "T1-PROD-network"
    T2_PROD = "T2-PROD-network"
    T1_TEST = "T1-TEST-network"
    T2_TEST = "T2-TEST-network"
  }
}

locals {
  tenant_environment = "${var.tenant}_${var.environment}"
}

output "local_network" {
  value = "${lookup(var.vm_network, local.tenant_environment)}"
}

output "format_network" {
  value = "${lookup(var.vm_network, format("%s_%s", var.tenant, var.environment))}"
}

output "lookup_network" {
  value = "${lookup(var.vm_network, "${var.tenant}_${var.environment}")}"
}

第一个选项使用locals创建一个已经插值的变量,可以在多个地方轻松重用,这是在Terraform/HCL中直接使用变量无法做到的。通常这是在Terraform的较新版本中进行变量组合/插值的最佳方式(它们是在Terraform 0.10.3中引入的)。
第二个选项使用format函数创建一个包含租户和环境变量的字符串。
最后一个选项看起来有点奇怪,但是它是有效的HCL。如果可能的话,我可能会避免使用那种语法。

谢谢您提供这些例子。我今晚会尝试它们! - Dennis
下一个编程会议得等到周三了。但是 locals 选项正是我所需要的。谢谢。 - Dennis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接