Terraform-12 (AWS): создание подсетей в соответствии с предоставленными входными переменными с использованием for / for_each - PullRequest
0 голосов
/ 18 февраля 2020

Я хочу создать модуль, который может принимать входные данные для сред (dev, test, prod) и создавать количество подсетей («app» и «db» su bnet для каждой среды) с соответствующими тегами. Например, 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/

1 Ответ

0 голосов
/ 19 февраля 2020

Сообщения в блоге, на которые вы ссылаетесь, были предварительными версиями предстоящих функций, которые еще не завершены, поэтому они не являются лучшим справочным материалом для конечной функциональности, которая была поставлена. Вместо этого обратитесь к официальной документации для ресурса 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"
  }
}

I ' Я точно не знаю, как ваш второй вопрос относится к первому, но вот как объявить переменную networks, чтобы она принимала значение, подобное тому, которое вы показали во втором примере.

variable "networks" {
  type = map(object({
    network_number    = number
    availability_zone = string
  }))
}

Если Вы хотите узнать больше об этом втором примере, я бы предложил начать новый отдельный вопрос о переполнении стека об этом. Соглашение о переполнении стека состоит в том, чтобы иметь отдельный вопрос для каждой темы c, а не задавать несколько вопросов одновременно.

...