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

Terraform 如何获取名称基于另一个变量的变量的值?,terraform,Terraform,内部变量.tf locals { env_name = lower(terraform.workspace) } 内部TFVAR hc-auth-demo-port= 8003 main.tf port= ${var.hc-auth-"${local.env_name}"-port}" 获取错误: 此字符不在语言中使用 根据前面的回答,我尝试过(这修复了错误,但没有解决我的实际问题): 这是说hc.auth未声明: 尚未声明名为“hc auth”的输入变量。可以使用变量“hc au

内部变量.tf

locals {
  env_name = lower(terraform.workspace)
}

内部TFVAR

hc-auth-demo-port= 8003

main.tf

port= ${var.hc-auth-"${local.env_name}"-port}"
获取错误:

此字符不在语言中使用

根据前面的回答,我尝试过(这修复了错误,但没有解决我的实际问题):

这是说hc.auth未声明:

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

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

这是错误消息-->这意味着它正在寻找一个变量hc.auth,但在我的例子中,我需要hc auth默认端口插值


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

Terraform不支持从变量生成变量名称,但有一个解决方法:使用映射

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

在main.tf或variables.tf中声明映射(int)变量hc\u auth\u端口

variable "hc_auth_ports" {
  type = map(int)
}
更新main.tf以在hc\u auth\u端口中查找环境端口:

port = var.hc_auth_ports[local.env_name]
现在,你应该得到你想要的结果:

  • 在TFVAR中声明每个环境的端口
  • 能够在main.tf中为当前环境选择端口
  • 原始问题的原始答案 原来的问题实际上是:

    在尝试将变量追加到字符串中时,为什么会出现错误“此字符未在语言中使用”

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

    port = "${var.hc-auth}-${local.env_name}-port"
    
    这种表达式称为a

    以下是原始(断开的)表达式:

    port = ${var.hc-auth-"${local.env_name}"-port}"
    
    以下是它不起作用的原因:

  • ${var.hc\u auth
    之前缺少双引号(
    )来启动字符串(可能是触发错误消息的原因,因为
    ${
    在字符串模板之外是非法的)
  • 缺少右大括号(
    }
    )来关闭var.hc\u auth的变量插值
  • ${local.env_name}
  • -port
  • 插值采用以下形式:

    ${hcl_expression}
    
    它一定在一根绳子里面

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

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


    From

    Terraform不支持从变量生成变量名,但有一个解决方法:使用地图

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

    在main.tf或variables.tf中声明映射(int)
    变量hc\u auth\u端口

    variable "hc_auth_ports" {
      type = map(int)
    }
    
    更新main.tf以在hc\u auth\u端口中查找环境端口:

    port = var.hc_auth_ports[local.env_name]
    
    现在,你应该得到你想要的结果:

  • 在TFVAR中声明每个环境的端口
  • 能够在main.tf中为当前环境选择端口
  • 原始问题的原始答案 原来的问题实际上是:

    在尝试将变量追加到字符串中时,为什么会出现错误“此字符未在语言中使用”

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

    port = "${var.hc-auth}-${local.env_name}-port"
    
    这种表达式称为a

    以下是原始(断开的)表达式:

    port = ${var.hc-auth-"${local.env_name}"-port}"
    
    以下是它不起作用的原因:

  • ${var.hc\u auth
    之前缺少双引号(
    )来启动字符串(可能是触发错误消息的原因,因为
    ${
    在字符串模板之外是非法的)
  • 缺少右大括号(
    }
    )来关闭var.hc\u auth的变量插值
  • ${local.env_name}
  • -port
  • 插值采用以下形式:

    ${hcl_expression}
    
    它一定在一根绳子里面

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

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


    port=“${var.hc-auth}-${local.env_name}-port”给出此选项时,表示未声明hc.auth?请参阅hc auth default port是在变量中分配的完整字符串,因此如何将它们全部附加到3个字?这是错误消息“尚未声明名为“hc auth”的输入变量。可以使用变量“hc auth”{}block”声明此变量-->这意味着它正在寻找一个变量hc.auth,但在我的例子中,我希望hc auth default port interpolations直到没有得到!像这样尝试,但得到的是字符串而不是值>``${{var.hc-auth-${local.env_name}-path}```${var.hc-auth-default-path}}``不能以这种方式构建变量名。我已经更新了你的问题,以反映我们的故障排除,并将尝试回答它。谢谢阿兰!您将大约45行代码保存到一行!你是个英雄!port=“${var.hc-auth}-${local.env_name}-port”当给出此选项时,表示未声明hc.auth?请参阅hc auth default port是在变量中分配的完整字符串,那么如何将它们全部附加到3个字?这是错误消息“输入变量带有