У меня есть модуль, который отвечает за создание частных конечных точек Azure. Для одного ресурса я хотел бы создать две частные точки, поэтому я использую цикл terraform forech
следующим образом:
module "azure_private_endpoint" {
source = "../azure-private-endpoint"
for_each = { for k, v in var.endpoints : k => merge(v, { index = index(keys(var.endpoints), k) + 1 }) }
name = "testpe_${each.key}_${each.value.type}"
location = var.resource_location
resource-group-name = "MyResourceGroup"
subnet-key = each.value.subnet
....
}
Моя проблема сейчас в том, что частные конечные точки не должны создаваться параллельно. Они должны создаваться друг за другом.
Как я могу реализовать это требование за один вызов модуля?
Зависимость между предметами для создания одного за другим в terraform
Спасибо Лоренцо Феллетти за ваш ценный вклад в достижение требования не создавать ресурсы одновременно, а создавать их один за другим.
В конфигурации, которой вы поделились при создании частной точки, не зависело друг от друга, хотя мы используем метааргумент dependent_on , он не работает, потому что depend_on работает со статическими входными данными, чего невозможно достичь при использовании foreach как он предоставляет динамические ссылки.
Как упоминалось в комментариях, я попробовал использовать нулевую конфигурацию ресурсов и смог достичь того требования, которое вы ищете.
Конфигурация:
provider "azurerm" {
features {}
}
variable "resource_group_name" {
description = "Name of the resource group."
type = string
}
variable "vnet_name" {
description = "Name of the virtual network."
type = string
}
variable "endpoints" {
description = "List of private endpoints with their configurations."
type = list(object({
name = string
subnet = string
private_connection_resource_id = string
group_ids = list(string)
connection_name = string
}))
}
resource "null_resource" "set_initial_state" {
provisioner "local-exec" {
interpreter = ["pwsh", "-c"]
command = "Set-Content -Path current_state.txt -Value '0'"
}
}
resource "null_resource" "sequential_resources" {
count = length(var.endpoints)
provisioner "local-exec" {
interpreter = ["pwsh", "-c"]
command = <<EOT
while ((Get-Content current_state.txt) -ne "${count.index}") {
Write-Host "${count.index} is waiting..."
Start-Sleep -Seconds 5
}
EOT
}
provisioner "local-exec" {
interpreter = ["pwsh", "-c"]
command = <<EOT
az network private-endpoint create `
--name ${var.endpoints[count.index].name} `
--resource-group ${var.resource_group_name} `
--vnet-name ${var.vnet_name} `
--subnet ${var.endpoints[count.index].subnet} `
--private-connection-resource-id ${var.endpoints[count.index].private_connection_resource_id} `
--group-ids ${join(" ", var.endpoints[count.index].group_ids)} `
--connection-name ${var.endpoints[count.index].connection_name}
EOT
}
provisioner "local-exec" {
interpreter = ["pwsh", "-c"]
command = "Set-Content -Path current_state.txt -Value '${count.index + 1}'"
}
depends_on = [null_resource.set_initial_state]
}
Развертывание:
Когда я запускал команды terraform, журналы состояния подготовки выглядели примерно так
это означает, что при создании pe1 остальные два находились в состоянии ожидания.
Ссылаться:
https://developer.hashicorp.com/terraform/language/resources/provisioners/local-exec
Уверен, что нет ничего, кроме хакерских способов (см. здесь ) или вообще нежелательного способа использования
terraform apply -parallelism=1
(см. здесь)