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
) 正在返回而无需等待依赖项。
有什么想法吗?
解决方案
听起来您想使用模块 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
模块输出的任何资源。
推荐阅读
- angular - Angular Directive - 重新关注第一个属性元素
- r - 根据高度向山脊线添加颜色渐变
- java - 将 jakarta.mail 1.6.5 更新到 2.0.1
- angular - 无法绑定到“formGroup”,因为它不是 Angular 11 上“form”的已知属性,并且 ReactiveFormsModule 已经导入
- java - Ejb @Schedule 在 elasticbeanstalk 上运行的 swarm 应用程序中不起作用
- c++ - 有没有办法使用 C++ 制作 IOS 应用程序?
- angular - Angular - 如何在 ng-select 中连接 bindLabel
- html - 重用组件(Angular)
- django - 如何从另一个评论模型中找到演出的平均评分?
- go - 从 pkg.go.dev 中删除旧版本