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插值
如何获取名称基于另一个变量的变量的值?
答案 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]
现在,您应该获得想要的结果:
最初的问题实际上是:
为什么会出现错误“该语言未使用此字符”。尝试在字符串中附加变量时?
这是已更正错误的端口分配:
port = "${var.hc-auth}-${local.env_name}-port"
这种表达方式称为String Template。
这是原始(残破)表达:
port = ${var.hc-auth-"${local.env_name}"-port}"
这是为什么它不起作用的原因:
"
)来在${var.hc_auth
之前启动字符串(可能是触发错误消息的原因,因为${
在字符串模板之外是非法的)}
)以关闭 var.hc_auth "
前的双引号(${local.env_name}
)不正确}
之后的右大括号(-port
)插值采用以下形式:
${hcl_expression}
它必须在字符串中。
$ {...}序列是一个插值,它计算标记之间给出的表达式,并在必要时将结果转换为字符串,然后将其插入最终字符串:
"Hello, ${var.name}!"
在上面的示例中,访问了已命名的对象var.name并将其值插入字符串中,从而产生类似“ Hello,Juan!”的结果。