我们如何确保第一个模块“ frontend_1”在其余模块之前执行?
module "frontend_1" {
source = "/modules/frontend-app"
}
module "frontend_2" {
source = "/modules/frontend-app"
}
module "frontend_3" {
source = "/modules/frontend-app"
}
此外-有记录在外的Gitissues可以解决此问题,但是其中没有一个好的解决方法。首先-您可以选中此复选框,以便熟悉我的问题的本质-https://github.com/hashicorp/terraform/issues/10462
以及如何在执行模块之前构建模块资源的外部对象-如果依赖于从此类外部资源计算出的值,则可以计算“计数”? 例如-如果您需要在模块中的“计数”中使用新创建的VPC的ID,该模块将在该VPC中创建多个AWS安全组?
答案 0 :(得分:5)
模块不是捆绑在一起作为一个整体创建或销毁的资源,因此,没有哪个模块在另一个模块之前或之后运行是没有意义的。如果查看terraform graph的输出,您会看到模块内的各个资源在计划图中显示为执行引擎同时遍历的节点。这意味着只要计划图不包含循环,两个模块之间就完全可能具有双向依赖性(模块A从模块B的输出获取输入,还提供用于模块B的输入)。>
要使用Terraform观察的一件事是,通过查看哪些资源属性,变量,输入输出等依赖于其他哪些属性(通过插值)以及使用depends_on的任何显式声明的依赖项,来构造平面图。适用于模块)。对于上面的示例,这样做的结果是,如果没有插值引用将值从一个模块的输出链接到另一个模块的输入,则在平面图中将不会构造任何路径来指示资源之间的任何依存关系。
答案 1 :(得分:5)
如问题中所述,我能够使用depends on
变量为您提供解决方法。
在这里参考:https://www.terraform.io/intro/getting-started/dependencies.html
假设我们有2个模块,一个模块定义vpc和子网,第二个模块定义要在基础架构中使用的各种安全组。
由于我们具有依赖性,因此只有在VPC模块中成功创建vpc之后才能创建所有安全组,因此可以通过以下策略来满足它。
variable "vpc_arn" {
description = "The ARN of the VPC which is created in the VPC module"
}
resource "null_resource" "vpc_found" {
triggers = {
vpc_name = "${var.vpc_arn}"
}
}
resource "aws_security_group" "allow_all" {
depends_on = ["null_resource.vpc_found"]
name = "allow_all"
description = "Allow all inbound traffic"
vpc_id = "${var.vpc_arn}"
......
}
空资源:https://www.terraform.io/docs/provisioners/null_resource.html