Terraform-对模块的资源依赖性

时间:2020-05-29 00:01:52

标签: terraform

我有一个Terraform模块,我们将其称为 parent ,并将其内部使用的子模块称为 child 。目标是在创建kubernetes_deployment资源之前,让子模块运行预配器。基本上,子模块构建并推送Docker映像。如果尚不存在该映像,则kubernetes_deployment将等待并最终超时,因为该部署没有可用的映像来创建Pod。我已经尝试了所有可以在线找到的内容,在子模块中输出了变量,使用了kubernetes_deployment资源中的depends_on,等等,并且碰壁了。我将不胜感激!

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 个答案:

答案 0 :(得分:2)

在您的子模块中,声明一个输出值,该值取决于与预配器相关联的空资源:

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,从而创建了所需的顺序。