variables - Terraform 将 2 个变量合并为一个新变量

标签 variables terraform

我想在具有大量端口组的环境中自动部署 Vmware 虚拟机。为了能够选择正确的端口组,最好输入租户和环境这两个变量。这两个变量用于 CMDB 注册和部署目的。

对于部署,需要将变量合并为 1 个新变量以选择正确的端口组。由于插值语法,似乎不可能在查找中使用 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}"
}

最佳答案

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

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 function创建一个包含租户和环境变量的字符串。

最后一个看起来有点滑稽,但它是有效的 HCL。如果可能的话,我可能会避免使用该语法。

关于variables - Terraform 将 2 个变量合并为一个新变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50316302/

相关文章:

jquery - 如何在 jQuery .html() 函数中打印 javascript 变量?

javascript - PHP 解析 heredoc 中的 JavaScript 内容

amazon-web-services - terraform 强制销毁/ad ASG,而不是依赖项更改进行更改

Terraform:如何删除从数组/列表创建的用户资源?

azure - 通过 terraform 创建 azuread_application_password 时无法输出 client_secret

docker - docker 容器-缺少属性

heroku - 使用 terraform 更新 heroku 上的现有基础设施

ruby-on-rails - Ruby 中的符号和变量有什​​么区别?

node.js - Node JS 变量范围

javascript - javascript中函数内部的变量传递给另一个函数