2017-07-24 72 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數據源。