Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Terraform 地形图中的可变关键点_Terraform - Fatal编程技术网

Terraform 地形图中的可变关键点

Terraform 地形图中的可变关键点,terraform,Terraform,在Terraform中,我试图创建一个模块,其中包含一个带有可变键的映射。我不确定这是否可行,但我已经尝试了以下方法,但没有成功 资源“aws\u实例”“web”{ ami=“${var.base\u ami}” 可用性\u区域=“${var.region\u a}” instance_type=“${var.ec2_instance_size}” 安全组=[“sec1”] count=“${var.ec2_实例_计数}” 标签{ Name=“${var.role}${var_env}” rol

在Terraform中,我试图创建一个模块,其中包含一个带有可变键的映射。我不确定这是否可行,但我已经尝试了以下方法,但没有成功

资源“aws\u实例”“web”{
ami=“${var.base\u ami}”
可用性\u区域=“${var.region\u a}”
instance_type=“${var.ec2_instance_size}”
安全组=[“sec1”]
count=“${var.ec2_实例_计数}”
标签{
Name=“${var.role}${var_env}”
role=“${var.app_role}”
${var.app_role}=“${var_env}”
}
}
这是:

标签{
Name=“${var.role}${var_env}”
}
标记“${var.role}”=“${var.env}”
有什么想法吗?这在Terraform当前是不可能的吗?

Terraform插值语法(现在)支持一种允许您在地图中查找动态关键点的方法

使用此功能,我现在可以执行以下操作:

output“image\u bucket\u name”{
value=“${lookup(var.image\u bucket\u names,var.environment,“不可能发生这种情况”)}
}
其中:

变量“image\u bucket\u names”{
type=“映射”
默认值={
development=“bucket dev”
staging=“用于暂存的存储桶”
prepod=“prepod的存储桶名称”
生产=“用于生产的铲斗”
}
}

environment
是一个简单的字符串变量。

我最近也需要动态设置标记键,并使用
zipmap
实现了这一点:

locals {
  ec2_tag_keys = ["some/prefix/${var.some_var}", "another_tag"]
  ec2_tag_vals = ["some value", "another value"]
}

resource "aws_instance", "foo" {
  ...
  tags = "${zipmap(local.ec2_tag_keys, local.ec2_tag_vals)}"
}

它有点笨重,但它可以工作。

我不确定它是什么时候添加的,但至少从0.11.7版开始,Terraform支持使用变量作为映射键。下面是我当前如何使用它来选择AWS实例类型的示例:

.tf
文件中:

变量“环境”{}
...
变量“实例\类型\ Web服务器”{
type=“映射”
默认值={
测试=“t2.小”
qa=“t2.中等”
staging=“t2.xlarge”
production=“t2.xlarge”
}
}
...
资源“aws\u opsworks\u实例”“验证”{
stack_id=“${aws_opsworks_stack.verification.id}”
layer_id=[“${aws_opsworks_custom_layer.verification.id}”]
instance_type=“${var.instance_types_webserver[“${var.environment}”]}”
state=“正在运行”
计数=1
}
.tfvars
文件中:

。。。
环境=“测试”
...

以下内容适用于terraform版本0.11.7。此解决方案使用

更新 公认的答案描述了如何在现有地图中进行动态查找。在HCL2(0.12)中,要使用动态关键帧构建贴图,可以在关键帧中使用带引号的插值表达式:

资源“aws\u实例”“web”{
count=“${var.ec2_实例_计数}”
ami=“${var.base\u ami}”
可用性\u区域=“${var.region\u a}”
instance_type=“${var.ec2_instance_size}”
安全组=[“sec1”]
标签={
Name=“${var.role}${var.env}”
role=“${var.app_role}”
“${var.app_role}”=“${var.env}”#“${var.env}”
}
)
}
或者,您可以使用在一次拍摄中构建它:

本地人{
标签=zipmap(
[
“姓名”,
“角色”,
变量app_角色
],
[
“${var.role}${var.env}”,
变量app_角色,
环境变量
]
)
}
然后,您可以在资源中使用此映射:

资源“aws\u实例”“web”{
count=“${var.ec2_实例_计数}”
ami=“${var.base\u ami}”
可用性\u区域=“${var.region\u a}”
instance_type=“${var.ec2_instance_size}”
安全组=[“sec1”]
tags=local.tags//或在此处内联上述内容
}

一个警告是,如果
var.app\u role
等于
“Name”
“role”
,那么它将覆盖您的静态值。您可以通过交换
merge
中的参数或对
zipmap
中的列表重新排序来避免这种情况,但这种冲突更可能是一种配置错误,应该在应用之前捕获并修复。

如果支持此功能,我会非常惊讶。如果我理解正确,我认为不可能将变量设置为键。不过,使用变量是可能的。另一个例子是,@Joey应该接受这个答案,而不是这有助于在数据块中动态设置映射键。非常感谢。将此投票为terraform 12弃用地图()
resource "aws_instance" "web" {
  ...
  tags = "${map(
    "Name", "${var.role} ${var_env}",
    "role", "${var.app_role}",
    "${var.app_role}", "${var_env}"
  )}"
}