如何在模块和提供程序之间创建依赖关系(用于刷新)

时间:2020-10-21 22:53:55

标签: terraform

我在使依赖关系无法在terraform的模块之间正常工作时遇到麻烦。如果出现问题,似乎是由于未对提供程序正确评估依赖项引起的。

我有:

  • 用于在docker中设置Rabbitmq的Docker容器资源
  • 一个依赖Rabbitmq容器的计时器资源,以确保其正常运行
  • 一些rabbitmq资源来设置交换,队列,用户等。

当所有内容都在同一模块中时,这一切工作正常。我只需要添加计时器作为一切的依赖项即可配置Rabbitmq。

我现在想将配置docker容器和将rabbitmq配置到不同的模块中,以便该配置块可在其他地方重用。我似乎无法让一个模块等待另一个模块。似乎总是在刷新时失败。

我试图根据睡眠计时器来生成输出(部署容器的模块):

output "remote_host" {
  value = "localhost"
  depends_on = [time_sleep.rabbitmq_ready]
}

然后我将该输出用作模块的参数:

module "rabbitmq" {
  source = "./modules/rabbitmq"
  api_url = "http://${module.container.remote_host}:15672"
  username = "admin"
  password = module.container.admin_password
}

从理论上讲,这应该意味着Rabbitmq提供程序直到容器完全启动并运行(直到睡眠完成)才知道如何连接。

但是我明白了,容器根本没有启动:

module.rabbitmq.rabbitmq_queue.data_export: Refreshing state... [id=sites.data_export@/]

Error: Get "http://127.0.0.1:15672/api/queues/%2F/sites.data_export": dial tcp 127.0.0.1:15672: connect: connection refused

这表明,depends_on = [time_sleep.rabbitmq_ready]在刷新步骤中已被忽略,并且在不等待依赖关系的情况下返回了值(localhost)。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

听起来您想将模块A的输出用作模块B的参数,因此您希望模块B等待模块A。

Terraform文档建议仅将depends_on用作最后的手段(请参见Output Values page的最后一段),而应对文件进行结构化,以使Terraform可以自己找出依赖性。

例如,具有以下文件结构:

.
+-- main.tf
+-- _vpc
|   +-- main.tf
|   +-- variables.tf
|   +-- outputs.tf
+-- _rds
|   +-- main.tf
|   +-- variables.tf

以及./main.tf中包含的以下内容:

module "vpc" {
  source = "./vpc"
}

module "rds" {
  source = "./rds"
  vpc_id = module.vpc.vpc_id
  subnet_ids = [ module.vpc.subnet_a_id , module.vpc.subnet_b_id, module.vpc.subnet_c_id ]
}

...模块rds中使用var.vpc_id var.subnet_ids的任何资源都将等待,直到vpc模块将其输出为止。