Terraform зависит от модулей - PullRequest
       15

Terraform зависит от модулей

0 голосов
/ 07 октября 2019

Я новичок в terraform и создал собственные политики Azure для структуры модуля. каждая политика представляет пользовательский модуль. Один из созданных мной модулей - включение журналов диагностики для любого нового созданного ресурса Azure. но мне нужна учетная запись для хранения. (перед включением настроек диагностики, как я могу реализовать "depen_on"? или любыми другими способами? Я хочу сначала создать учетную запись хранения, а затем модуль настроек диагностики. на main.tf (где вызов всехдругие модули) или внутри ресурса (модуля)?

Спасибо за помощь !! :)

этот код ниже представляет файл main.tf:

//calling the create storage account name

module "createstorageaccount" {

source = "./modules/module_create_storage_account"
    depends_on = [
    "module_enable_diagnostics_logs"
  ]

}

этот представляет модуль создания учетной записи хранения

resource "azurerm_resource_group" "management" {


  name     = "management-rg"
  location = "West Europe"
}

resource "azurerm_storage_account" "test" {
  name                     = "diagnostics${azurerm_resource_group.management.name}"
  resource_group_name      = "${azurerm_resource_group.management.name}"
  location                 = "${azurerm_resource_group.management.location}"
  account_tier             = "Standard"
  account_replication_type = "LRS"

  tags = {
    environment = "diagnostics"
  }
}

    depends_on = [
    "module_enable_diagnostics_logs"
  ]

1 Ответ

0 голосов
/ 08 октября 2019

В большинстве случаев необходимые зависимости просто появляются автоматически в результате ваших ссылок. Если конфигурация для одного ресурса прямо или косвенно ссылается на другой, Terraform автоматически определяет зависимость между ними без необходимости явного depends_on.

. Это работает, потому что переменные модуля и выходные данные также являются узлами в графе зависимостей:если ресурс дочернего модуля ссылается на var.foo, то это косвенно зависит от чего-либо, от чего зависит значение этой переменной.

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

variable "storage_account_depends_on" {
  # the value doesn't matter; we're just using this variable
  # to propagate dependencies.
  type    = any
  default = []
}

resource "azurerm_storage_account" "test" {
  name                     = "diagnostics${azurerm_resource_group.management.name}"
  resource_group_name      = "${azurerm_resource_group.management.name}"
  location                 = "${azurerm_resource_group.management.location}"
  account_tier             = "Standard"
  account_replication_type = "LRS"

  tags = {
    environment = "diagnostics"
  }

  # This resource depends on whatever the variable
  # depends on, indirectly. This is the same
  # as using var.storage_account_depends_on in
  # an expression above, but for situations where
  # we don't actually need the value.
  depends_on = [var.storage_account_depends_on]
}

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

module "diagnostic_logs" {
  source = "./modules/diagnostic_logs"
}

module "storage_account" {
  source = "./modules/storage_account"

  storage_account_depends_on = [module.diagnostic_logs.logging]
}

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

output "logging" {
  # Again, the value is not important because we're just
  # using this for its dependencies.
  value = {}

  # Anything that refers to this output must wait until
  # the actions for azurerm_monitor_diagnostic_setting.example
  # to have completed first.
  depends_on = [azurerm_monitor_diagnostic_setting.example]
}

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

...