В большинстве случаев необходимые зависимости просто появляются автоматически в результате ваших ссылок. Если конфигурация для одного ресурса прямо или косвенно ссылается на другой, 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]
}
Если ваши отношения могут быть выражены путем передачи фактических значений , например, с помощью вывода, содержащего идентификатор, я бы рекомендовал предпочесть такой подход, поскольку он приводит к конфигурации, которой легче следовать,Но в редких случаях, когда существуют отношения между ресурсами, которые не могут быть смоделированы как поток данных, вы можете использовать выходные данные и переменные для распространения явных зависимостей также между модулями.