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

Jit*_*r S 5 terraform

内部变量.tf

locals {
  env_name = lower(terraform.workspace)
}

Run Code Online (Sandbox Code Playgroud)

tfvars 内部

hc-auth-demo-port= 8003

Run Code Online (Sandbox Code Playgroud)

主.tf

port= ${var.hc-auth-"${local.env_name}"-port}"
Run Code Online (Sandbox Code Playgroud)

出现错误:

该语言中不使用该字符。

根据之前的答案,我尝试过(它修复了该错误,但没有解决我的实际问题):

port = "${var.hc-auth}-${local.env_name}-port"
Run Code Online (Sandbox Code Playgroud)

据说 hc.auth 未声明:

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

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

这是错误消息 --> 这意味着它正在寻找变量 hc.auth 但在我的情况下我想要 hc-auth-default-port 插值

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

Ala*_*Dea 6

Terraform 不支持从变量构建变量名称,但有一个解决方法:使用地图。

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

hc_auth_ports = {
  demo = 8003
}
Run Code Online (Sandbox Code Playgroud)

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

variable "hc_auth_ports" {
  type = map(int)
}
Run Code Online (Sandbox Code Playgroud)

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

port = var.hc_auth_ports[local.env_name]
Run Code Online (Sandbox Code Playgroud)

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

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

原问题的原答案

原来的问题实际上是:

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

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

port = "${var.hc-auth}-${local.env_name}-port"
Run Code Online (Sandbox Code Playgroud)

这种表达式称为字符串模板

这是原始(损坏的)表达式:

port = ${var.hc-auth-"${local.env_name}"-port}"
Run Code Online (Sandbox Code Playgroud)

这就是它不起作用的原因:

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

插值采用以下形式:

${hcl_expression}
Run Code Online (Sandbox Code Playgroud)

它必须在字符串内。

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

"Hello, ${var.name}!"
Run Code Online (Sandbox Code Playgroud)

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

插值 - 字符串模板 - 配置语法