Terraform子模块对调用资源的依赖关系

Terraform子模块对调用资源的依赖关系,terraform,terraform-modules,terraform0.14.7,Terraform,Terraform Modules,Terraform0.14.7,我试图在多个子模块之间创建依赖关系,这些子模块应该能够单独创建资源,如果它们相互依赖,也应该能够创建资源 基本上,我正在尝试创建多个VM,并根据作为输出返回的ip地址和vip ip地址,创建lbaas池和lbaas池成员 我一直保持项目结构如下 - Root_Folder - main.tf // create all the vm's - output.tf - variable.tf - calling_module.tf - modules

我试图在多个子模块之间创建依赖关系,这些子模块应该能够单独创建资源,如果它们相互依赖,也应该能够创建资源

基本上,我正在尝试创建多个VM,并根据作为输出返回的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
调用_module.tf包含对lbaas池模块和lbaas池成员的引用,因为这两个模块依赖于main.tf文件生成的资源的输出。 它给出了以下错误:

尚未声明托管资源。

由于资源尚未生成,并且在运行terraform plan and apply命令时,试图加载尚未创建的资源对象。不确定他的结构声明资源之间的模块隐式依赖关系,这样模块可以单独工作,也可以在需要时完成整个堆栈

预期行为:


main.tf输出参数应在terraform版本0.14中自动创建依赖项,但上述错误似乎并非如此。

假设您有一个将实例ID作为输入的模块,因此在
模块/lbaas池中
您在
variable.tf

variable "instance_id" {
   type = string
}
现在假设您在
main.tf
中定义了该实例资源:

resource "aws_instance" "my_instance" {
  ...
}
然后,要将该资源传递给调用_module.tf
中定义的任何模块(或与
main.tf
位于同一文件夹中的任何其他
.tf
文件),您可以这样做:

module "lbaas-pool" {
  src="modules/lbaas-pool"
  instance_id = aws_instance.my_instance.id
  ...
}

注意这里根本没有定义
输出。根级别的任何
output
都用于将输出公开给命令行控制台,而不是将内容发送给子模块


还要注意这里没有定义
数据
源代码。您并不是在编写将按特定顺序运行的脚本,而是在编写模板,告诉Terraform您希望最终的基础结构是什么样子。Terraform读取所有这些内容,创建一个依赖关系图,然后按照它确定的顺序部署所有内容。在运行
terraform plan
apply
时,通过
数据
源引用的任何内容都必须已经存在。Terraform不会在根模块中创建所有内容,然后加载子模块并在那里创建所有内容,它会根据依赖关系图以任何必要的顺序创建内容。

听起来好像您正试图直接引用模块内部的
main.tf
中定义的资源,而不是将该资源作为输入传递给这些模块。你真的需要显示你的代码,根据网站规则我不能添加完整的代码。但要了解更多详细信息,main.tf包含资源配置。它生成一个虚拟机。Output.tf包含创建vm后返回的资源参数。现在我想在lbaas-pool.tf文件中添加out变量。由于lbaas-pool.tf需要fqdn生成的输出作为main.tf资源的一部分。类似地,对于lbaas-pool-member.tf,需要池成员ipaddr作为main.tf资源的一部分生成。我的要求是,当我通过调用根模块生成vm时,它应该首先创建vm,vm的out参数可以用作lbaas pool和lbaas-pool-members的输入变量。调用_module.tf可以对子模块lbaas-pool.tf和lbaas-pool-members.tf进行模块调用。另外,为了创建模块之间的内部依赖关系,我尝试在lbaas-pool.tf中添加数据块。数据块名称是main.tf资源名称。并添加了与main.tf的输出变量相同的变量名。但当我尝试运行terraform plan时,这不起作用。由于问题中提到的错误,它失败了。我理解这一点。但我的问题陈述有点不同。我想在terraform中生成一个图,其中main.tf的计算值被添加到子模块lbaas池中。我从你上面的回答中了解到,我不能同意上面问题中提到的结构。如果我调用父模块,它应该首先从main.tf调用资源。一旦main.tf的执行完成,计算出的值就可以在lbaas-pool.tf模块中使用。一旦执行完成,它也会调用lbaas-pool-members.tf模块来创建池成员。您不断使用诸如“调用”和“执行”模块之类的术语,这听起来就像您将这些模块视为单独的可执行脚本,当它们不是时。对于数据源,我将其添加到lbaas-pool.tf文件中,并尝试创建对main.tf资源的引用。但数据源不知何故不起作用。我尝试为main.tf创建一个输出参数,并在数据源的lbaas-pool.tf中使用了相同的名称。这返回了一个错误。您不断使用诸如“调用”和“执行”模块之类的术语,使其听起来像是您将它们视为单独的可执行脚本,而实际上它们不是。您拒绝提供[mvce]。您的评论只是重申了您的问题,并不表示您已经阅读了我的答案。实际上,我正在尝试使资源能够单独工作,以及在需要的情况下按此顺序生成。为了保持复杂性。因为我不想让一切都保持在一个水平,并试图保持在小模块。