Как наследовать / передавать переменные в terraform - PullRequest
0 голосов
/ 30 октября 2018

Я довольно новичок в Terraform и у меня есть некоторые проблемы с передачей переменных между модулями / дочерними каталогами.

У меня есть такая структура:

.
|-- main.tf
|-- variables.tf
|-- terraform.tfvars
|-- data.tf
|-- compute
      |-- main.tf
      |-- variables.tf
      |-- terraform.tfvars
|-- network
      |-- main.tf
      |-- variables.tf
      |-- terraform.tfvars

Мой main.tf в корневом каталоге выглядит так:

provider "azurerm" {
}


resource "azurerm_resource_group" "test" {
  name     = "${var.resourcegroup}"
  location = "${var.location}"

  tags {
    costcenter  = "costcenter_nr"
    environment = "test"
  }
}

resource "azurerm_virtual_network" "test" {
  name                = "${var.vnet}"
  location            = "${var.location}"
  resource_group_name = "${var.resourcegroup}"
  address_space       = ["10.102.2.0/23"]

  subnet {
    name           = "${var.subnet_agw}"
    address_prefix = "10.102.3.128/28"
  }
  depends_on = ["azurerm_resource_group.test"]
}

module "compute" {
  source = "./compute"
}

module "network" {
  source = "./network"
}

В сетевом каталоге я хочу создать сетевые интерфейсы для виртуальных машин. Таким образом, сетевые интерфейсы зависят от идентификатора подсети. Значения виртуальных машин (которые я хочу создать с помощью шаблонов для вычислений) зависят от идентификатора сетевого интерфейса.

В data.tf в корневом каталоге я вывожу идентификатор подсети:

data "azurerm_subnet" "agw" {
  name                 = "${var.subnet_agw}"
  virtual_network_name = "${var.vnet}"
  resource_group_name  = "${var.resourcegroup}"

  depends_on           = ["azurerm_virtual_network.test"]
}

output "subnet_ag" {
  value = "${data.azurerm_subnet.agw.id}"
} 

Как мне использовать этот вывод / переменную в network / main.tf, чтобы я мог подготовить сетевой интерфейс?

network / main.tf будет выглядеть так:

resource "azurerm_network_interface" "sql_server" {
  name                = "${var.sql_server}"
  location            = "${var.location}"
  resource_group_name = "${var.resourcegroup}"

  ip_configuration {
    name                          = "${var.sql_server}"
    subnet_id                     = "${????????}"
    private_ip_address_allocation = "dynamic"
  }
    depends_on = ["azurerm_resource_group.test"]
}

Кроме того, будет ли работать эта зависимость, поскольку она создается main.tf?!

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Посмотрите на косвенные и прямые зависимости зависимости . В вашем коде вы можете использовать для создания косвенной зависимости, как это resource_group_name = "${azurerm_resource_group.test.id}". Тогда вам не нужно явно определять его.

resource "azurerm_virtual_network" "test" {
  name                = "${var.vnet}"
  location            = "${var.location}"
  resource_group_name = "${var.resourcegroup}"

Terraform изначально не поддерживает зависимости между модулями, поэтому он не будет работать. Вы можете либо переместить этот код в main, который будет чище, либо посмотреть на обходной путь, подобный этому Зависимости модуля .

Другим вариантом может быть создание всех ваших сетевых ресурсов в одном модуле, вывод подсети или идентификатора сетевой карты. Затем передайте это в вычислительный модуль как переменную?

надеюсь, это поможет

0 голосов
/ 30 октября 2018

В вашем main.tf на корневом уровне добавьте:

module "network" {
  source = "./network"
  subnet_id = "{data.azurerm_subnet.agw.id}"
}

Добавьте ссылку на переменную в свой сетевой модуль. Также не забудьте объявить переменную:

resource "azurerm_network_interface" "sql_server" {
  name                = "${var.sql_server}"
  location            = "${var.location}"
  resource_group_name = "${var.resourcegroup}"

  ip_configuration {
    name                          = "${var.sql_server}"
    subnet_id                     = "${var.subnet_id}"
    private_ip_address_allocation = "dynamic"
  }

  depends_on = ["azurerm_resource_group.test"]
}
...