首页 > 解决方案 > 如何在模块和提供者之间创建依赖关系(用于刷新)

问题描述

我无法让依赖关系在 terraform 中的模块之间正常工作。如果出现的问题似乎是由于对提供者的依赖关系没有正确评估引起的。

我有:

当一切都在同一个模块中时,这一切都很好。我只需要将计时器作为依赖项添加到将配置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) 正在返回而无需等待依赖项。

有什么想法吗?

标签: terraform

解决方案


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

Terraform 文档建议depends_on仅将其用作最后的手段(请参阅输出值页面的最后一段),而不是构建文件,以便 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模块输出的任何资源。


推荐阅读