由于某种奇怪的原因,Terraform 文档没有解释“错误:循环”的含义。我到处找,但官方文档中没有提到它。
Mar*_*ins 28
作为 Terraform 工作的一部分,它分析您的resource
块、data
块和其他配置结构之间的依赖关系,以确定处理它们的合适顺序,以便提供必要的输入数据。
例如,考虑以下人为的简单配置:
resource "null_resource" "foo" {
}
resource "null_resource" "bar" {
triggers = {
foo = null_resource.foo.id
}
}
Run Code Online (Sandbox Code Playgroud)
Terraform 会分析以上内容,注意到 的配置null_resource.bar
包含对 的引用null_resource.foo
,因此相关的操作null_resource.foo
必须发生在 之前null_resource.bar
。我们可以将其形象化为一个图形,其中箭头表示“必须发生在之后”或“取决于”:
null_resource.bar
必须发生在操作之后null_resource.foo
。现在考虑如果我们像这样修改配置会发生什么:
resource "null_resource" "foo" {
triggers = {
bar = null_resource.bar.id
}
}
resource "null_resource" "bar" {
triggers = {
foo = null_resource.foo.id
}
}
Run Code Online (Sandbox Code Playgroud)
现在null_resource.foo
也指null_resource.bar
。此配置隐含了两个“必须发生在之后”的关系:
null_resource.bar
必须发生在操作之后null_resource.foo
。null_resource.foo
必须发生在操作之后null_resource.bar
。上面的两个语句相互矛盾:null_resource.bar
不能在 before和after 中处理null_resource.foo
。Terraform 将通过报告依赖循环来响应这种情况,使用您看到的错误消息:
Cycle: null_resource.foo, null_resource.bar
Run Code Online (Sandbox Code Playgroud)
当 Terraform 返回此错误时,解决方案是从配置中删除至少一个“必须发生在”之后的箭头(依赖项),使其不再矛盾。在没有看到您的配置的情况下,我无法建议在您的情况下可以实现哪些特定更改,但很可能在您的配置中的某个地方,您有两个这样的相互依赖的资源,或者可能是一个引用自身的资源。
如果您有视力,根据您的配置的复杂程度,要求 Terraform 生成一个类似于我上面在此答案中包含的图形可能会有所帮助,但要突出显示周期。要做到这一点,你可以使用的terraform graph
命令,如下所示:
terraform graph -draw-cycles
Run Code Online (Sandbox Code Playgroud)
此命令的输出是以Graphviz接受的格式对图形的描述。如果您的本地计算机上没有安装 Graphviz,您可以将输出复制粘贴到Graphviz Online 中以生成图形图像。该-draw-cycles
命令使 Terraform 使用红色标记与报告的循环相关的箭头。如果您无法在视觉上区分红色和黑色,您可能希望首先编辑生成的 Graphviz 代码以替换red
为您可以区分的其他颜色。
配置的图形可视化往往无法用于非平凡的配置,因为有太多的图形和边,所以如果您的配置有很多对象,最好通过配置本身跟踪依赖关系。
归档时间: |
|
查看次数: |
19561 次 |
最近记录: |