Terraform, можно ли передать ресурс как переменную в модуль? - PullRequest
0 голосов
/ 07 июня 2018

Я только начинаю осваивать Terraform (поэтому извиняюсь, если это глупый вопрос).

Я настраиваю Azure vnet с набором подсетей, каждая подсеть имеет таблицу маршрутизации, котораяотправляет трафик через брандмауэр.

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

По договоренности я бы хотел создать подсеть и таблицу маршрутов в одной группе ресурсов.и location как родительский vnet.

Если я предоставлю все значения, необходимые в модуле, как отдельные значения, модуль будет работать нормально:)

Я бы предпочел эффективно передать ресурскоторый представляет родительский vnet в модуль как «параметр», и модуль читает такие вещи, как имя группы ресурсов, расположение и имя vnet непосредственно из ресурса vnet, так что: - Я печатаю меньше (я создаю экземпляр модуля с помощьюvnet, а не отдельные значения для имени vnet, имени группы ресурсов и местоположения) - это устраняет возможность ошибки при установке местоположения и имен групп ресурсов в таблице маршрутизации и подсети (если я читаю значения из родительского vnet вмодуль, то значения будут такими же, как родительский vnet)

В настоящее время мпеременные модуля определены как

variable "parent-vnet-name" {}

variable "parent-vnet-resource-group-name" {}

variable "parent-vnet-location" {}

variable "subnet-name" {
  type = "string"
}

variable "subnet-address-prefix" {}

variable "firewall-ip-private" {}

, а модуль - как

resource "azurerm_route_table" "rg-mgt-network__testtesttest" {
   name                = "${var.subnet-name}"
  location            = "${var.parent-vnet-location}"
  resource_group_name = "${var.parent-vnet-resource-group-name}"

  route {
    name                   = "Default"
    address_prefix         = "0.0.0.0/0"
    next_hop_type          = "VirtualAppliance"
    next_hop_in_ip_address = "${var.firewall-ip-private}"
  }
}

На самом деле то, что я хотел бы сделать, больше похоже на переменные:

variable "parent-vnet" {}

variable "subnet-name" {
  type = "string"
}

variable "subnet-address-prefix" {}

variable "firewall-ip-private" {}

с модулем, выполняющим что-то вроде:

resource "azurerm_route_table" "rg-mgt-network__testtesttest" {
  name                = "${var.subnet-name}"
  location            = "${var.parent-vnet.location}"
  resource_group_name = "${var.parent-vnet.resource-group-name}"

  route {
    name                   = "Default"
    address_prefix         = "0.0.0.0/0"
    next_hop_type          = "VirtualAppliance"
    next_hop_in_ip_address = "${var.firewall-ip-private}"
  }
}

Я поиграл с различными вещами (например, попытка передать vnet без указания имени атрибута (ошибка проверки) или использование источника данных для извлеченияобратно в vnet (источники данных не имеют информации о группе ресурсов)), но нигде нет, поэтому мне интересно, что я что-то пропустил?

Приветствия, Энди

1 Ответ

0 голосов
/ 07 июня 2018

В настоящее время это невозможно - согласно странице создания модулей Terraform , входные переменные модуля могут быть только стандартными типами переменных: string, list и map.

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

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