Terraform-12(AWS):使用for / for_each根据提供的输入变量创建子网

问题描述 投票:0回答:1

我想创建一个可以接受环境(开发,测试,生产)输入的模块,并使用适当的标签创建子网的数量(每个环境的“ app”和“ db”子网)。例如Name = dev-app随着输入变量的更新,该模块应该灵活地添加/删除子网。我的模板如下所示

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:如何为以下模块定义“网络”变量

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/

terraform terraform-provider-aws terraform0.12+
1个回答
0
投票

您指的博客文章是尚未完成的即将发布的功能的预览,因此它们并不是最终功能的最佳参考。相反,请参考the official documentation for resource for_each

该文档包括一个基于映射声明多个for_each资源实例的示例。我们可以修改该示例以使其与azurerm_resource_group一起使用,其中一个资源块描述“ app”子网,而另一个资源块描述“ db”子网:

var.environments

我不确定您的第二个问题与第一个问题的确切关系,但是这里是如何声明变量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

如果您想了解有关第二个示例的更多信息,我建议在Stack Overflow上就此问题开始一个新的单独问题。关于堆栈溢出的约定是针对每个主题有一个独立的问题,而不是一次提出多个问题。

© www.soinside.com 2019 - 2024. All rights reserved.