2017-07-24 123 views
3

是否有可能在terraform中concatonate/join变量?我正在努力寻找正确语法的参考。Terraform - Concatonate /加入变量(动态插值)

我愿做这样的事情:

variable "env" { 
    default = "production" 
} 

variable "vpc_name" { 
    default = "cloudy" 
} 

resource "aws_subnet" "${var.env}_${var.vpc_name}_pub1" { 
    vpc_id = "${aws_vpc.${var.vpc_name}.id}" 
    cidr_block = "10.0.1.0/24" 
    availability_zone = "us-east-1a" 
} 

这将有效地实现这样的:

resource "aws_subnet" "production_cloudy_pub1" { 
    vpc_id = "${aws_vpc.cloudy.id}" 
    cidr_block = "10.0.1.0/24" 
    availability_zone = "us-east-1a" 
} 

由于提前, 亚历

+2

我不认为Terraform支持这种动态插值,因为它需要知道如何处理所有依赖项之前的完整图。你可能会详细说明你想要做什么,因为可能有更好的方法来处理它? – Fermin

+2

TF不支持像Fermin这样的资源名称中的替换 –

+0

这可能就是为什么我找不出一种方法来实现它。 –

回答

2

正如评论提到你不能像Terraform那样内插变量或者像默认变量那样使用另一个变量,你可以使用数据源实现你陈述的目标ES。

在这个例子情况下,你可以这样做以下:

variable "env" { 
    default = "production" 
} 

variable "vpc_name" { 
    default = "cloudy" 
} 

data "aws_vpc" "selected" { 
    tags { 
    Name = "${var.vpc_name}" 
    } 
} 

resource "aws_subnet" "pub1" { 
    vpc_id = "${data.aws_vpc.selected.id}" 
    cidr_block = "10.0.1.0/24" 
    availability_zone = "us-east-1a" 
} 

这会自动创建在“阴天” VPC子网。

这也使得不仅仅是VPC ID拉动更多的信息反馈,所以你可以做这样的事情,而不是:

variable "env" { 
    default = "production" 
} 

variable "vpc_name" { 
    default = "cloudy" 
} 

data "aws_vpc" "selected" { 
    tags { 
    Name = "${var.vpc_name}" 
    } 
} 

resource "aws_subnet" "public" { 
    vpc_id = "${data.aws_vpc.selected.id}" 
    cidr_block = "${cidrsubnet(data.aws_vpc.selected.cidr_block, 8, 1)}" 
    availability_zone = "us-east-1a" 
} 

cidrsubnet function计算从一个给定的范围CIDR子网。在这种情况下,如果您的VPC是10.0.0.0/16,则返回10.0.1.0/24

上面的例子解决了你的主要问题,但它不允许动态命名的Terraform资源。在你的小例子似乎没有成为一个需要它,但如果你想要的东西,然后,动态,你也可以用一些结合这就像一个计数的资源:

variable "env" { 
    default = "production" 
} 

variable "vpc_name" { 
    default = "cloudy" 
} 

data "aws_vpc" "selected" { 
    tags { 
    Name = "${var.vpc_name}" 
    } 
} 

data "aws_availability_zones" "all" {} 

resource "aws_subnet" "public" { 
    count = "${length(data.aws_availability_zones.all.names)}" 
    vpc_id = "${data.aws_vpc.selected.id}" 
    cidr_block = "${cidrsubnet(data.aws_vpc.selected.cidr_block, 8, count.index)}" 
    availability_zone = "${data.aws_availability_zones.all.names[count.index]}" 
} 

这现在动态地创建子网VPC的区域中的每个可用区域。显然你可以把这个很好,我建议你阅读data sources以及所有的AWS specific数据源。