Terraform на Azure - развертывание нескольких подсетей - PullRequest
1 голос
/ 10 января 2020

Я пытаюсь реализовать скрипт Terraform для создания нескольких подсетей.

resource "azurerm_subnet" "test_subnet" {
    name = "testSUBNET"
    resource_group_name = "${local.resource_group_name}"
    virtual_network_name = "${azurerm_virtual_network.lab_vnet.name}"
    address_prefix = "10.0.1.0/24"
}

Есть ли способ сделать для каждой переменную al или oop для создания их в в то же время?

С наилучшими пожеланиями!

Ответы [ 3 ]

2 голосов
/ 10 января 2020

Этого можно добиться, используя переменную и индекс числа следующим образом:

variable "subnet_prefix" {
  type = "list"
  default = [
    {
      ip      = "10.0.1.0/24"
      name     = "subnet-1"
    },
    {
      ip      = "10.0.2.0/24"
      name     = "subnet-2"
    }
   ]
}

resource "azurerm_subnet" "test_subnet" {
    name = "${lookup(element(var.subnet_prefix, count.index), "name")}"
    count = "${length(var.subnet_prefix)}"
    resource_group_name = "${local.resource_group_name}"
    virtual_network_name = "${azurerm_virtual_network.lab_vnet.name}"
    address_prefix = "${lookup(element(var.subnet_prefix, count.index), "ip")}"
}

Также доступна функция предварительного просмотра для каждого в новой версии

1 голос
/ 14 января 2020

Если вы используете Terraform 12, этого можно достичь с помощью для каждого или счетчика

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

for-each следует использовать для создания нескольких экземпляров на основе другой карты или набора значений.

Использование списка строк и функции toset() для преобразования - это отличный способ добиться этого

variable "subnet_ids" {
  type = list(string)
}

resource "aws_instance" "server" {
  for_each = toset(var.subnet_ids)

  ami           = "ami-a1b2c3d4"
  instance_type = "t2.micro"
  subnet_id     = each.key # note: each.key and each.value are the same for a set

  tags = {
    Name = "Server ${each.key}"
  }
}

Или вы можете добиться этого, используя что-то вроде следующего:

resource "azurerm_resource_group" "rg" {
  for_each = {
    a_group = "eastus"
    another_group = "westus2"
  }
  name     = each.key
  location = each.value
}

Если вы хотите достичь этого с помощью Terraform 11, возможности count и variable являются единственным способом, отличным от дублирования кода. (Раджат Арора упомянул)

Я бы настоятельно рекомендовал использовать Terraform 12, так как провайдеры для Terraform 11 не будут поддерживаться в ближайшем будущем, и если вы можете спасти себя от рефакторинга сейчас, вам следует!

0 голосов
/ 31 марта 2020

Я пытаюсь выполнить sh нечто подобное.

variable "custom_role_list" {

  type        = list(object ({ service_principal_id = string, role = string }) )

} 

Когда я пытаюсь установить его из модуля ресурсов

resource "azurerm_role_assignment" "ad_sp_role_assignment" {

  scope                = azurerm_container_registry.acr.id
  for_each = var.custom_role_list
  role_definition_name           = each.value.role
  principal_id = each.value.service_principal_id

}

По сути, я пытаюсь установить azure Реестр контейнеров для работы с несколькими субъектами-службами с указанными c ролями доступа.

Ниже приведено определение var.

custom_role_list = [
    {
        service_principal_id = aserviceprincipal.id
        role = "Contributor"
    },

    {
        service_principal_id = bserviceprincipal.id
        role = "Contributor"
    }


]

При выполнении я получаю следующую ошибку.

Error: Invalid for_each argument

  on ../modules/az-acr/main.tf line 46, in resource "azurerm_role_assignment" "ad_sp_role_assignment":
  46:   for_each = var.custom_role_list

The given "for_each" argument value is unsuitable: the "for_each" argument
must be a map, or set of strings, and you have provided a value of type list
of object.

Пожалуйста, если кто-то может помочь, будет очень полезен. спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...