Terraform-12 (AWS):使用 for/for_each 根据提供的输入变量创建子网
Terraform-12 (AWS): Create Subnets according to provided input variables using for/for_each
我想创建一个可以接受环境(开发、测试、生产)输入的模块,并使用适当的标签创建一定数量的子网(每个环境的 "app" 和 "db" 子网) .例如 Name=dev-app
随着输入变量的更新,该模块应灵活适用于 add/delete 个子网。
我的模板如下所示
variable "environments" {
type = map(object({
app_subnet_cidr = string
db_subnet_cidr = string
}))
default = {
dev = {
app_subnet_cidr = "192.168.219.0/24"
db_subnet_cidr = "192.168.218.0/24"
}
test = {
app_subnet_cidr = "192.168.118.0/24"
db_subnet_cidr = "192.168.119.0/24"
}
}
}
resource "aws_subnet" "this" {
for_each = var.environments
vpc_id = var.vpc_id
cidr_block = {Don't know what to use here}
tags {
Name = {Don't know what to use here}
}
}
我指的是以下文章。
https://www.hashicorp.com/blog/terraform-0-12-rich-value-types/
问题 2:如何为以下模块定义 "networks" 变量
module "subnets" {
source = "./subnets"
parent_vpc_id = "vpc-abcd1234"
networks = {
production_a = {
network_number = 1
availability_zone = "us-east-1a"
}
production_b = {
network_number = 2
availability_zone = "us-east-1b"
}
staging_a = {
network_number = 1
availability_zone = "us-east-1a"
}
}
}
https://www.hashicorp.com/blog/hashicorp-terraform-0-12-preview-for-and-for-each/
您提到的博文是即将推出的尚未完成的功能的预览,因此它们不是最终发布的功能的最佳参考。相反,请参考 the official documentation for resource for_each
.
该文档包含一个基于地图声明多个 azurerm_resource_group
资源实例的示例。我们可以调整该示例以与您的 var.environments
一起使用,其中一个资源块描述 "app" 个子网,另一个资源块描述 "db" 个子网:
resource "aws_subnet" "app" {
for_each = var.environments
vpc_id = var.vpc_id
cidr_block = each.value.app_subnet_cidr
tags = {
Name = "${each.key}-app"
}
}
resource "aws_subnet" "db" {
for_each = var.environments
vpc_id = var.vpc_id
cidr_block = each.value.db_subnet_cidr
tags = {
Name = "${each.key}-db"
}
}
我不确定你的第二个问题与第一个问题有什么关系,但这里介绍了如何声明变量 networks
以便它接受你在第二个示例中显示的值。
variable "networks" {
type = map(object({
network_number = number
availability_zone = string
}))
}
如果您想了解有关第二个示例的更多信息,我建议您在 Stack Overflow 上开始一个新的单独问题。 Stack Overflow 的惯例是对每个主题单独提问,而不是一次问多个问题。
我想创建一个可以接受环境(开发、测试、生产)输入的模块,并使用适当的标签创建一定数量的子网(每个环境的 "app" 和 "db" 子网) .例如 Name=dev-app 随着输入变量的更新,该模块应灵活适用于 add/delete 个子网。 我的模板如下所示
variable "environments" {
type = map(object({
app_subnet_cidr = string
db_subnet_cidr = string
}))
default = {
dev = {
app_subnet_cidr = "192.168.219.0/24"
db_subnet_cidr = "192.168.218.0/24"
}
test = {
app_subnet_cidr = "192.168.118.0/24"
db_subnet_cidr = "192.168.119.0/24"
}
}
}
resource "aws_subnet" "this" {
for_each = var.environments
vpc_id = var.vpc_id
cidr_block = {Don't know what to use here}
tags {
Name = {Don't know what to use here}
}
}
我指的是以下文章。 https://www.hashicorp.com/blog/terraform-0-12-rich-value-types/ 问题 2:如何为以下模块定义 "networks" 变量
module "subnets" {
source = "./subnets"
parent_vpc_id = "vpc-abcd1234"
networks = {
production_a = {
network_number = 1
availability_zone = "us-east-1a"
}
production_b = {
network_number = 2
availability_zone = "us-east-1b"
}
staging_a = {
network_number = 1
availability_zone = "us-east-1a"
}
}
}
https://www.hashicorp.com/blog/hashicorp-terraform-0-12-preview-for-and-for-each/
您提到的博文是即将推出的尚未完成的功能的预览,因此它们不是最终发布的功能的最佳参考。相反,请参考 the official documentation for resource for_each
.
该文档包含一个基于地图声明多个 azurerm_resource_group
资源实例的示例。我们可以调整该示例以与您的 var.environments
一起使用,其中一个资源块描述 "app" 个子网,另一个资源块描述 "db" 个子网:
resource "aws_subnet" "app" {
for_each = var.environments
vpc_id = var.vpc_id
cidr_block = each.value.app_subnet_cidr
tags = {
Name = "${each.key}-app"
}
}
resource "aws_subnet" "db" {
for_each = var.environments
vpc_id = var.vpc_id
cidr_block = each.value.db_subnet_cidr
tags = {
Name = "${each.key}-db"
}
}
我不确定你的第二个问题与第一个问题有什么关系,但这里介绍了如何声明变量 networks
以便它接受你在第二个示例中显示的值。
variable "networks" {
type = map(object({
network_number = number
availability_zone = string
}))
}
如果您想了解有关第二个示例的更多信息,我建议您在 Stack Overflow 上开始一个新的单独问题。 Stack Overflow 的惯例是对每个主题单独提问,而不是一次问多个问题。