Environment variables 使用环境变量作为局部块中常用标记的映射
我在尝试在terraform中自动化标记过程时遇到了一个特定的问题。我已经设置了一个环境变量,它本质上是我们将用于apply中提供的所有资源的所有标记的列表。看起来像这样Environment variables 使用环境变量作为局部块中常用标记的映射,environment-variables,terraform,tagging,Environment Variables,Terraform,Tagging,我在尝试在terraform中自动化标记过程时遇到了一个特定的问题。我已经设置了一个环境变量,它本质上是我们将用于apply中提供的所有资源的所有标记的列表。看起来像这样 export TF_VAR_taglist='{JiraEpic=“ETOS-56”,“assignedresearchrpri”=“Isaac”,AssignedResearcherSec=“Matt”}' 在设置环境变量之后,我在variables.tf文件中添加了一个名为“taglist”的变量,该变量获取上述环境变量。
export TF_VAR_taglist='{JiraEpic=“ETOS-56”,“assignedresearchrpri”=“Isaac”,AssignedResearcherSec=“Matt”}'
在设置环境变量之后,我在variables.tf文件中添加了一个名为“taglist”的变量,该变量获取上述环境变量。看起来像这样
变量“标记列表”{}
最后,我有另一个locals.tf文件,我在其中设置了一个公共_tags变量。就像这样
locals{common_tags=“${var.taglist}”}
当我应用terraform时,构建在尝试正确映射标记时失败。这是我收到的错误
Error: Incorrect attribute value type
on kube_master_worker_nodes_ec2.tf line 9, in resource "aws_instance" "master":
9: tags = local.common_tags
|----------------
| local.common_tags is "{JiraEpic = \"ETOS-56\",AssignedResearcherPri = \"Isaac \",AssignedResearcherSec = \"Matt\"}"
Inappropriate value for attribute "tags": map of string required.
然后我决定在variables.tf文件中将变量的类型定义为map(string
),如下所示
变量“taglist”{type=map(string)}
我曾希望这将允许terraform将此变量识别为字符串映射,而不仅仅是字符串文字,但我错了,这些是我在应用该定义时遇到的错误
Error: Missing attribute separator
on <value for var.taglist> line 1:
(source code not available)
Expected a newline or comma to mark the beginning of the next attribute.
Error: No value for required variable
on variables.tf line 11:
11: variable "taglist"{
The root module input variable "taglist" is not set, and has no default value.
Use a -var or -var-file command line argument to provide a value for this
variable.
错误:缺少属性分隔符
第1行:
(源代码不可用)
需要换行符或逗号来标记下一个属性的开头。
错误:所需变量没有值
在variables.tf第11行:
11:变量“标记列表”{
根模块输入变量“taglist”未设置,并且没有默认值。
使用-var或-var file命令行参数为此提供一个值
变量
我真的被困在这个问题上了,我觉得我离这个问题很近了。有人能提供一些关于这个问题的见解,以及我应该如何解决它吗?Terraform使用变量的类型约束来决定如何解释其值的字符串表示形式。默认情况下,Terraform将假定该值需要一个基本类型,如字符串或numb呃,因为这是通过命令行或环境变量设置变量的最典型的情况 由于标记列表是一个列表,您需要Terraform将其解释为映射表达式而不是字符串。您可以通过告诉Terraform您期望的值类型来告诉Terraform:
variable "taglist" {
type = map(string)
}
您可以在Terraform文档部分中阅读更多关于此的信息
然后,您需要确保环境变量中的值是有效的,以避免语法错误。如果从shell命令行设置环境变量,则需要注意转义/引用,以确保Terraform将看到所有引号完整的值,并且没有任何额外的元字符
结果通常很难读清楚,这就是为什么Terraform文档建议使用.tfvars
文件来设置复杂类型的变量,而不是-var
命令行选项或环境变量。但是,由于您使用的是自动化,您可能会发现生成.tfvars.json
fi更容易le,它使用标准JSON格式,因此使用大多数编程语言中可用的JSON库更容易生成。以下是与您在问题中显示的值相当的.tfvars.JSON
:
{
"taglist": {
"JiraEpic": "ETOS-56",
"AssignedResearcherPri": "Isaac",
"AssignedResearcherSec": "Matt"
}
}
请注意,主观上我会发现,当一个变量实际需要一个映射时,如果它的名称以
列表
结尾,那就相当令人困惑了。这个变量更典型的名称就是标记
,不过如果提到它的类型以便将它与其他变量区分开来是有用的,那么我建议改为标记映射
,以减少混淆。Terraform使用变量的类型约束来决定如何解释其值的字符串表示形式。默认情况下,Terraform将假定该值需要字符串或数字等基本类型,因为这是通过命令行或环境变量设置的变量的最典型情况
由于标记列表是一个列表,您需要Terraform将其解释为映射表达式而不是字符串。您可以通过告诉Terraform您期望的值类型来告诉Terraform:
variable "taglist" {
type = map(string)
}
您可以在Terraform文档部分中阅读更多关于此的信息
然后,您需要确保环境变量中的值是有效的,以避免语法错误。如果从shell命令行设置环境变量,则需要注意转义/引用,以确保Terraform将看到所有引号完整的值,并且没有任何额外的元字符
结果通常很难读清楚,这就是为什么Terraform文档建议使用.tfvars
文件来设置复杂类型的变量,而不是-var
命令行选项或环境变量。但是,由于您使用的是自动化,您可能会发现生成.tfvars.json
fi更容易le,它使用标准JSON格式,因此使用大多数编程语言中可用的JSON库更容易生成。以下是与您在问题中显示的值相当的.tfvars.JSON
:
{
"taglist": {
"JiraEpic": "ETOS-56",
"AssignedResearcherPri": "Isaac",
"AssignedResearcherSec": "Matt"
}
}
请注意,主观上我会发现,当一个变量实际需要一个映射时,如果它的名称以
列表
结尾,那就相当令人困惑了。这个变量更典型的名称就是标记
,不过如果提到它的类型以便将它与其他变量区分开来是有用的,那么我建议改为标记映射
,以减少混淆。我首先要感谢Martin Atkins让我想到在我的环境变量中使用冒号而不是等号,因为这是唯一的问题。变量没有正确地表示为JSON对象,所以terraform将其解释为