我在使依赖关系无法在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
)。
有什么想法吗?
答案 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
模块将其输出为止。