在Terraform中,我正在尝试创建一个包含带有可变键的地图的模块.我不确定这是否可行,但我尝试了以下但没有成功.
resource "aws_instance" "web" {
ami = "${var.base_ami}"
availability_zone = "${var.region_a}"
instance_type = "${var.ec2_instance_size}"
security_groups = ["sec1"]
count = "${var.ec2_instance_count}"
tags {
Name = "${var.role} ${var_env}"
role = "${var.app_role}"
${var.app_role} = "${var_env}"
}
}
Run Code Online (Sandbox Code Playgroud)
还有这个:
tags {
Name = "${var.role} ${var_env}"
}
tags."${var.role}" = "${var.env}"
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?Terraform目前无法做到这一点吗?
gsa*_*lis 22
我知道你发布已经有一段时间,但我最近需要类似的东西,所以我在这里发布解决方案,万一其他人偶然发现它.
(现在)在terraform插值语法中支持一个lookup函数,它允许您在地图中查找动态键.
使用这个,我现在可以做类似的事情:
output "image_bucket_name" {
value = "${lookup(var.image_bucket_names, var.environment, "No way this should happen")}"
}
Run Code Online (Sandbox Code Playgroud)
哪里:
variable "image_bucket_names" {
type = "map"
default = {
development = "bucket-dev"
staging = "bucket-for-staging"
preprod = "bucket-name-for-preprod"
production = "bucket-for-production"
}
}
Run Code Online (Sandbox Code Playgroud)
并且environment是一个简单的字符串变量.
tav*_*nab 13
接受的答案描述了如何在现有地图中进行动态查找。要使用动态键构造映射,在 HCL2 (0.12) 中,您可以在键中使用带引号的插值表达式:
resource "aws_instance" "web" {
count = "${var.ec2_instance_count}"
ami = "${var.base_ami}"
availability_zone = "${var.region_a}"
instance_type = "${var.ec2_instance_size}"
security_groups = ["sec1"]
tags = {
Name = "${var.role} ${var.env}"
role = "${var.app_role}"
"${var.app_role}" = "${var.env}" # <------ like this
}
}
Run Code Online (Sandbox Code Playgroud)
一旦issue #21566修复,您可以替换"${var.app_role}"为(var.app_role),这是文档中描述的方法。
(与下面相同的警告也适用于此:如果var.app_role包含这些文字键之一作为其值,则它将替换它。)
接受的答案描述了如何在现有地图中进行动态查找。要使用动态键构造映射,在 HCL2 (0.12) 中,您有两种方法:
merge您可以使用for 表达式从一个或多个键的变量动态构建映射,然后将其与merge函数结合使用以构建具有静态和动态键混合的新映射:
variable "app_role" {
type = string
}
locals {
tags = merge(
{
Name = "${var.role} ${var.env}"
role = "${var.app_role}"
},
{
for k in [var.app_role]: k => "${var.env}"
}
)
}
Run Code Online (Sandbox Code Playgroud)
zipmap或者,您可以使用zipmap一次性构建它:
locals {
tags = zipmap(
[
"Name",
"role",
var.app_role
],
[
"${var.role} ${var.env}",
var.app_role,
var.env
]
)
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以在资源中使用此映射:
resource "aws_instance" "web" {
count = "${var.ec2_instance_count}"
ami = "${var.base_ami}"
availability_zone = "${var.region_a}"
instance_type = "${var.ec2_instance_size}"
security_groups = ["sec1"]
tags = local.tags // or inline the above here
}
Run Code Online (Sandbox Code Playgroud)
一个警告是,如果var.app_role等于"Name"或等于"role",那么它将覆盖您的静态值。您可以通过交换 中的参数merge或重新排序 中的列表来避免这种情况zipmap,尽管这种冲突更可能是一个配置错误,应该在应用之前捕获并修复。
小智 6
我最近也需要动态设置标签键,并设法使用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)}"
}
Run Code Online (Sandbox Code Playgroud)
它有点笨重,但它有效。
小智 6
以下适用于terraform版本0.11.7。此解决方案使用map函数。
resource "aws_instance" "web" {
...
tags = "${map(
"Name", "${var.role} ${var_env}",
"role", "${var.app_role}",
"${var.app_role}", "${var_env}"
)}"
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29791 次 |
| 最近记录: |