是否可以在 terraform 中连接/连接变量?我正在努力寻找正确语法的引用。
我想做这样的事情:
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"
}
最佳答案
正如评论中提到的,您不能像在 Terraform 中那样插入变量,也不能执行诸如将变量默认为另一个变量之类的事情,您可以使用数据源实现既定目标。
在示例情况下,您可以执行以下操作:
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数据源。
关于Terraform - 连接/连接变量(动态插值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45278862/