как ссылаться на объекты в терраформе - PullRequest
0 голосов
/ 03 июля 2019

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

Я пробовал ниже, но теперь она работает:

subnet_id = "${azurerm_virtual_network.virtual-network.subnet.ServersSubnet.id}"

resource "azurerm_virtual_network" "virtual-network" {
    name                = "${var.ClientShortName}-az-network"
    address_space       = ["${local.AzureInfraNetwork}"]
    location            = "${var.resource-location}"
    resource_group_name =  "${azurerm_resource_group.test-resource-group.name}"

subnet {
    name           = "ServersSubnet"
    address_prefix = "${local.ServersSubnet}"
}

subnet {
    name           = "GatewaySubnet"
    address_prefix = "${local.GatewaySubnet}"
} 
}

Ошибка: невозможно индексировать установленное значение

на главной.Строка 120, в ресурсе "azurerm_network_interface" "DCNIC": 120: subnet_id = "$ {azurerm_virtual_network.virtual-network.subnet.ServersSubnet.id}"

Тип блока "подсеть" представлен набором изобъекты и элементы набора не имеют адресуемых ключей.Чтобы найти элементы, соответствующие определенным критериям, используйте выражение «for» с предложением «if».

1 Ответ

1 голос
/ 03 июля 2019

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

foo = azurerm_virtual_network.virtual-network.subnet[0].id
bar = azurerm_virtual_network.virtual-network.subnet[1].id

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

Я не верю, что это ваш случай, поэтому вы можете подумать о создании своих подсетей как отдельных ресурсов, например:

resource "azurerm_virtual_network" "main" {
    name                = "${var.ClientShortName}-az-network"
    address_space       = [local.AzureInfraNetwork]
    location            = var.resource-location
    resource_group_name = azurerm_resource_group.test-resource-group.name
}

resource "azurerm_subnet" "server" {
    virtual_network_name  = azurerm_virtual_network.main.name
    name                  = "ServersSubnet"
    address_prefix        = local.ServersSubnet
}

resource "azurerm_subnet" "gateway" {
    virtual_network_name  = azurerm_virtual_network.main.name
    name                  = "GatewaySubnet"
    address_prefix        = local.ServersSubnet
}

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

foo = azurerm_subnet.server.id

Также обратите внимание, что я использую синтаксис terraform => 0.12, поэтому я могу написать foo.bar вместо "${foo.bar}", когда мне не нужна интерполяция строк.

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