【发布时间】:2021-07-09 15:48:10
【问题描述】:
我正在尝试在多个子模块之间创建依赖关系,这些子模块应该能够单独创建资源,并且应该能够在它们相互依赖时创建资源。
基本上我正在尝试创建多个虚拟机,并基于作为输出返回的 ip 地址和 vip ip 地址,我想创建 lbaas 池和 lbaas 池成员。
我将项目结构保持如下
- Root_Folder
- main.tf // create all the vm's
- output.tf
- variable.tf
- calling_module.tf
- modules
- lbaas-pool
- lbaas-pool.tf // create lbaas pool
- variable.tf
- output.tf
- lbaas-pool-members
- lbaas-pool-members.tf // create lbaas pool member
- variable.tf
- output.tf
calling_module.tf 包含对 lbaas-pool 模块和 lbaas-pool-members 的引用,因为这两个模块依赖于 main.tf 文件生成的资源的输出。 它给出了以下错误:
未声明托管资源。
由于资源尚未生成,在运行 terraform plan 和 apply 命令时试图加载尚未创建的资源对象。不确定他的结构是否声明了资源之间的模块隐式依赖关系,以便模块可以单独工作以及在需要完整堆栈时工作。
预期行为:
main.tf 输出参数应该在 terraform 版本 0.14 中自动创建依赖项,但从上述错误看来情况并非如此。
【问题讨论】:
-
听起来您正试图直接引用模块内
main.tf中定义的资源,而不是将该资源作为输入传递给这些模块。您确实需要根据站点规则显示您的代码minimal reproducible example -
我无法添加完整的代码。但更多细节 main.tf 包含资源配置。它生成一个虚拟机。 Output.tf 包含创建 vm 后返回的资源参数。现在我想在 lbaas-pool.tf 文件中添加输出变量。由于 lbaas-pool.tf 需要 fqdn 生成的输出作为 main.tf 资源的一部分。同样对于 lbaas-pool-member.tf 需要池成员 ipaddr 作为 main.tf 资源的一部分生成。我的要求是调用根模块生成vm时,首先要创建vm,vm的out参数可以作为lbaas-pool和lbaas-pool-members的输入变量。
-
Calling_module.tf 有对子模块 lbaas-pool.tf 和 lbaas-pool-members.tf 的模块调用。此外,为了创建模块之间的内部依赖关系,我尝试在 lbaas-pool.tf 中添加数据块。数据块名称为 main.tf 资源名称。并添加了一个与 main.tf 的输出变量相同的变量名。但这在我尝试运行 terraform 计划时不起作用。它因问题中提到的错误而失败。
标签: terraform terraform-modules terraform0.14.7