Environment variables 使用环境变量作为局部块中常用标记的映射

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”的变量,该变量获取上述环境变量。

我在尝试在terraform中自动化标记过程时遇到了一个特定的问题。我已经设置了一个环境变量,它本质上是我们将用于apply中提供的所有资源的所有标记的列表。看起来像这样

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将其解释为