терраформ применить из не сгенерированного ресурса - PullRequest
0 голосов
/ 02 февраля 2020

Я пытаюсь создать список карт из моего списка имен su bnet, поэтому я создал следующее:

  1. создал переменную с именем subnet_names списка типов строк
  2. создал нулевой блок ресурсов для создания списка карт из этого списка, например:
resource "null_resource" "subnet_mapping" {
   count = "${length(var.subnet_names)}"

   triggers = {
    name   = "${element(var.subnet_names, count.index)}"
    number = "${count.index}"
  }
}

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

resource "azurerm_virtual_network" "virtual_network" {
  address_space = "${var.cidr_network_range}"
  location = "${var.location}"
  name = "${var.virtual_network_resource_name}"
  resource_group_name = "${var.resource_group_name}"
  count = "${length(var.subnet_names)}"

  dynamic "subnet"{
    for_each = [for s in null_resource.subnet_mapping: {
      name = s.name
      prefix = cidrsubnet(element(var.cidr_network_range, 0),8 ,s.number)
    }]

    content {
      name = subnet.value.name
      address_prefix = subnet.value.prefix
    }
  }

  depends_on = [null_resource.subnet_mapping]
}

resource "null_resource" "subnet_mapping" {
  count = "${length(var.subnet_names)}"

  triggers = {
    name   = "${element(var.subnet_names, count.index)}"
    number = "${count.index}"
  }
}


resource "azurerm_resource_group" "virtual_network_group" {
  location = "${var.location}"
  name = "${var.resource_group_name}"
}

он должен быть действительным, но у меня все еще нет вывода null_resource, поэтому он не работает

dynamic "subnet"{
    for_each = [for s in null_resource.subnet_mapping: {
      name = s.name
      prefix = cidrsubnet(element(var.cidr_network_range, 0),8 ,s.number)
    }]

    content {
      name = subnet.value.name
      address_prefix = subnet.value.prefix
    }
  }

  depends_on = [null_resource.subnet_mapping]
}

мое сообщение об ошибке:

Error: Unsupported attribute

  on main.tf line 10, in resource "azurerm_virtual_network" "virtual_network":
  10:       name = s.name

This object does not have an attribute named "name".


Error: Unsupported attribute

  on main.tf line 10, in resource "azurerm_virtual_network" "virtual_network":
  10:       name = s.name

This object does not have an attribute named "name".


Error: Unsupported attribute

  on main.tf line 10, in resource "azurerm_virtual_network" "virtual_network":
  10:       name = s.name

This object does not have an attribute named "name".


Error: Unsupported attribute

  on main.tf line 10, in resource "azurerm_virtual_network" "virtual_network":
  10:       name = s.name

This object does not have an attribute named "name".


Error: Unsupported attribute

  on main.tf line 11, in resource "azurerm_virtual_network" "virtual_network":
  11:       prefix = cidrsubnet(element(var.cidr_network_range, 0),8 ,s.number)

This object does not have an attribute named "number".


Error: Unsupported attribute

  on main.tf line 11, in resource "azurerm_virtual_network" "virtual_network":
  11:       prefix = cidrsubnet(element(var.cidr_network_range, 0),8 ,s.number)

This object does not have an attribute named "number".


Error: Unsupported attribute

  on main.tf line 11, in resource "azurerm_virtual_network" "virtual_network":
  11:       prefix = cidrsubnet(element(var.cidr_network_range, 0),8 ,s.number)

This object does not have an attribute named "number".


Error: Unsupported attribute

  on main.tf line 11, in resource "azurerm_virtual_network" "virtual_network":
  11:       prefix = cidrsubnet(element(var.cidr_network_range, 0),8 ,s.number)

This object does not have an attribute named "number".

Ответы [ 2 ]

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

Я решил таким образом, я создал переменную с именем

variable "subnets" {
  type = list(map(string))
  description = "A list of maps of names and network addresses bits for subnets that will be created inside this network (this is parallel to subnet_prefixes array)."
}
resource "azurerm_virtual_network" "virtual_network" {
  address_space = var.cidr_network_range
  location = var.location
  name = var.virtual_network_resource_name
  resource_group_name = var.resource_group_name

  dynamic "subnet"{
    for_each = [for subnet in var.subnets: {
      name = subnet.name
      prefix = cidrsubnet(element(var.cidr_network_range, 0),8 ,subnet.number)
    }]
    content {
      name = subnet.value.name
      address_prefix = subnet.value.prefix
    }
  }
}

resource "azurerm_resource_group" "virtual_network_group" {
  location = var.location
  name = var.resource_group_name
}

Таким образом, я уже создал карту, я хотел бы создать ее автоматически, как я писал ранее, но кажется не очень часто встречается в виде терраформ.

В примере Charles Xu отображение будет создано на основе последовательности (1,2,3), и я хотел бы использовать ее всегда в по-разному, например (21, 24, 26). Поэтому единственное решение, которое я смог найти, это заставить карту раньше.

В любом случае, спасибо всем

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

Из сообщения мне не ясно, сколько Vnets вы хотите создать, потому что ваш код немного сбивает с толку. Для вашей проблемы с null_resource я не думаю, что это хороший выбор, я рекомендую locals.

Здесь я предполагаю, что вы хотите создать только одну Vnet с последовательными подсетями и использовать список для хранения имен подсетей, затем приведенный ниже пример кода ядра:

locals {
  subnets = [for sname in var.subnet_names: {
    name = sname
    # the index begin from 0, so you need to add 1
    number = index(var.subnet_names, sname) + 1
  }]
}

resource "azurerm_virtual_network" "virtual_network" {
  address_space = "${var.cidr_network_range}"
  location = "${var.location}"
  name = "${var.virtual_network_resource_name}"
  resource_group_name = "${var.resource_group_name}"


  dynamic "subnet"{
    for_each = [for s in local.subnets: {
      name = s.name
      prefix = cidrsubnet(var.cidr_network_range, 8 , s.number)
    }]

    content {
      name = subnet.value.name
      address_prefix = subnet.value.prefix
    }
  }
}
...