Terraform - зависимость ресурсов от модуля - PullRequest
1 голос
/ 29 мая 2020

У меня есть модуль Terraform, который мы назовем parent , и дочерний модуль, используемый внутри него, который мы будем называть child . Цель состоит в том, чтобы дочерний модуль запускал инициатор до создания ресурса kubernetes_deployment. По сути, дочерний модуль создает и отправляет изображение Docker. Если образ еще не присутствует, kubernetes_deployment будет ждать и, в конечном итоге, истечет время ожидания, потому что для развертывания нет образа, который можно было бы использовать для создания подов. Я перепробовал все, что смог найти в Интернете, выходные переменные в дочернем модуле, с помощью depends_on в ресурсе kubernetes_deployment, et c и наткнулся на стену. Буду очень признателен за любую помощь!

parent.tf

module "child" {
  source       = ".\\child-module-path"
  ...
}


resource "kubernetes_deployment" "kub_deployment" {
  ...
}

child-module-path \ child.tf

data "external" "hash_folder" {
  program = ["powershell.exe", "${path.module}\\bin\\hash_folder.ps1"]
}

resource "null_resource" "build" {
  triggers = {
    md5 = data.external.hash_folder.result.md5
  }

  provisioner "local-exec" {
    command     = "${path.module}\\bin\\build.ps1 ${var.argument_example}"
    interpreter = ["powershell.exe"]
  }
}

Пример вывода ошибки Terraform:

module.parent.kubernetes_deployment.kub_deployment: Still creating... [10m0s elapsed]
 Error output: 
 Error: Waiting for rollout to finish: 0 of 1 updated replicas are available...

1 Ответ

2 голосов
/ 29 мая 2020

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

output "build_complete" {
  # The actual value here doesn't really matter,
  # as long as this output refers to the null_resource.
  value = null_resource.build.triggers.md5
}

Затем в своем «родительском» модуле вы можете использовать module.child.build_complete в выражении (если включение строки MD5 в развертывание где-то полезно), или вы можете просто объявить, что ресурс зависит от вывода.

resource "kubernetes_deployment" "example" {
  depends_on = [module.child.build_complete]

  ...
}

Потому что вывод зависит от null_resource а kubernetes_deployment зависит от вывода, транзитивно kubernetes_deployment теперь фактически зависит от null_resource, создавая желаемый порядок.

...