2016-02-18 57 views
4

在Terraform中,我试图创建一个包含带有可变关键字的地图的模块。我不确定这是否可行,但我已经尝试了以下方法,但未取得成功。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}" 
    } 
} 

这:

tags { 
    Name = "${var.role} ${var_env}" 
} 
tags."${var.role}" = "${var.env}" 

任何想法? Terraform目前不可能做到这一点吗?

+0

如果支持此功能,我将非常惊讶。 –

+2

如果我理解正确,我不认为有可能将变量设置为键。 [映射](https://www.terraform.io/docs/configuration/interpolation.html#lookup_map_key_)与变量是可能的,虽然。另一个例子是[这里](https://www.terraform.io/intro/getting-started/variables.html)。 –

回答

8

我知道它已经有一段时间,因为你张贴的,但我最近需要类似的东西,所以我在这里张贴的解决方案,在它两端万一别人绊倒。

有(现在)在terraform插语法支持lookup function,它允许你在地图上查找动态密钥。

利用这一点,我现在可以做的东西,如:

output "image_bucket_name" { 
    value = "${lookup(var.image_bucket_names, var.environment, "No way this should happen")}" 
} 

,其中:

variable "image_bucket_names" { 
    type = "map" 

    default = { 
    development = "bucket-dev" 
    staging = "bucket-for-staging" 
    preprod = "bucket-name-for-preprod" 
    production = "bucket-for-production" 
    } 

} 

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

1

此功能尚未支持。

+1

“不支持”*是*有效答案。尽管可能的话,为了达到这个目的,最好备份一些文档。 – Leigh

1

我最近需要设置标签键动态也和管理使用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)}" 
} 

这是一个有点笨拙,但它的作品。