如何获取名称基于另一个变量的变量的值?

时间:2020-05-10 18:16:06

标签: terraform

inside variables.tf

locals {
  env_name = lower(terraform.workspace)
}

在tfvars内部

hc-auth-demo-port= 8003

main.tf

port= ${var.hc-auth-"${local.env_name}"-port}"

获取错误:

该字符未在语言中使用。

基于一个较早的答案,我已经尝试过(它可以修复该错误,但不能解决我的实际问题):

port = "${var.hc-auth}-${local.env_name}-port"

这是说未声明hc.auth:

尚未声明名称为“ hc-auth”的输入变量。可以使用变量“ hc-auth” {}块声明该变量。

我已经在变量中声明了 hc-auth-default-port ,那么如何附加所有3个单词来构建该变量名并获取其值?

这是错误消息msg->这意味着它正在寻找变量hc.auth,但就我而言,我想要hc-auth-default-port插值

如何获取名称基于另一个变量的变量的值?

1 个答案:

答案 0 :(得分:3)

Terraform不支持​​从变量构建变量名,但是有一种解决方法:使用映射。

在terraform.tfvars中提供端口映射(请注意使用snake_case而不是skewer-case,因为snake_case是Terraform代码的首选代码样式)

hc_auth_ports = {
  demo = 8003
}

在main.tf或variables.tf中声明 map(int)变量 hc_auth_ports

variable "hc_auth_ports" {
  type = map(int)
}

更新main.tf以在 hc_auth_ports 中查找环境的端口:

port = var.hc_auth_ports[local.env_name]

现在,您应该获得想要的结果:

  1. 在tfvars中声明每个环境的端口
  2. 可以在main.tf中选择当前环境的端口

原始问题的原始答案

最初的问题实际上是:

为什么会出现错误“该语言未使用此字符”。尝试在字符串中附加变量时?

这是已更正错误的端口分配:

port = "${var.hc-auth}-${local.env_name}-port"

这种表达方式称为String Template

这是原始(残破)表达:

port = ${var.hc-auth-"${local.env_name}"-port}"

这是为什么它不起作用的原因:

  1. 缺少双引号(")来在${var.hc_auth之前启动字符串(可能是触发错误消息的原因,因为${在字符串模板之外是非法的)
  2. 缺少右括号(})以关闭 var.hc_auth
  3. 的变量插值
  4. "前的双引号(${local.env_name})不正确
  5. }之后的右大括号(-port

插值采用以下形式:

${hcl_expression}

它必须在字符串中。

$ {...}序列是一个插值,它计算标记之间给出的表达式,并在必要时将结果转换为字符串,然后将其插入最终字符串:

"Hello, ${var.name}!"

在上面的示例中,访问了已命名的对象var.name并将其值插入字符串中,从而产生类似“ Hello,Juan!”的结果。

来自Interpolation - String Templates - Configuration Syntax

相关问题