【问题标题】:Terraform-12 (AWS): Create Subnets according to provided input variables using for/for_eachTerraform-12 (AWS):根据提供的输入变量使用 for/for_each 创建子网
【发布时间】:2020-06-02 05:55:32
【问题描述】:

我想创建一个可以接受环境输入的模块(dev、test、prod)并使用适当的标签创建子网的数量(每个环境的“app”和“db”子网)。例如名称=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】:

    您所指的博客文章是尚未完成的即将推出的功能的预览,因此它们不是最终发布功能的最佳参考。相反,请参阅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 的惯例是为每个主题设置一个单独的问题,而不是一次提出多个问题。

    【讨论】:

    • 谢谢,马丁。我按照你的回答stackoverflow.com/questions/57570505/…。如图所示,通过对当地人使用“扁平化”,这可以完美地工作。但是,我必须更改变量定义,如下所示。变量“环境” { 默认 = { 开发 = [ { app_subnet_cidr = “10.0.101.0/24” inside_subnet_cidr = “192.168.218.0/24”} ],测试 = [ { app_subnet_cidr = “10.0.102.0/24” inside_subnet_cidr = “192.168” .119.0/24" } ] } }
    • 早期变量定义出错。错误:function.tf 第 77 行不支持的属性,在本地:77:app_subnet_cidr = subnet.app_subnet_cidr 此值没有任何属性。
    • @Martin Atkins:在我有资源作为您的评论之后。我该如何应用它们。我的意思是我可以使用资源:terraform plan -target=module.module_name。运行特定模块。但我不知道如何使用资源运行它。提前致谢!
    猜你喜欢
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2020-11-19
    • 2020-05-20
    • 2020-06-28
    • 1970-01-01
    相关资源
    最近更新 更多