Juan Jimenez Asked: 2020-03-06 12:54:42 +0800 CST2020-03-06 12:54:42 +0800 CST 2020-03-06 12:54:42 +0800 CST “错误:循环”是什么意思。在 Terraform 中是什么意思? 772 由于某些奇怪的原因,Terraform 文档没有解释“错误:循环”的含义。我到处都看过,但官方文档中没有提到它。(事实证明这是一个众所周知的术语,一个循环依赖,显然有人改名认为这会让它们听起来很酷......) terraform 1 个回答 Voted Best Answer Martin Atkins 2020-03-06T17:09:57+08:002020-03-06T17:09:57+08:00 作为 Terraform 工作的一部分,它会分析您的resource块、data块和其他配置结构之间的依赖关系,以确定处理它们的合适顺序,以便获得必要的输入数据。 例如,考虑以下人为的简单配置: resource "null_resource" "foo" { } resource "null_resource" "bar" { triggers = { foo = null_resource.foo.id } } Terraform 会分析以上内容,注意到 的配置null_resource.bar包含对 的引用null_resource.foo,因此与 相关的操作null_resource.foo必须发生在之前null_resource.bar。我们可以将其可视化为一个图表,其中箭头表示“必须在之后发生”或“取决于”: for 的操作null_resource.bar 必须发生在for 的操作之后null_resource.foo。 现在考虑如果我们像这样修改该配置会发生什么: resource "null_resource" "foo" { triggers = { bar = null_resource.bar.id } } resource "null_resource" "bar" { triggers = { foo = null_resource.foo.id } } 现在null_resource.foo也指null_resource.bar。现在,此配置暗示了两个“必须在之后发生”关系: for 的操作null_resource.bar 必须发生在for 的操作之后null_resource.foo。 for 的操作null_resource.foo 必须发生在for 的操作之后null_resource.bar。 上述两种说法相互矛盾:null_resource.bar不能同时处理 before和after null_resource.foo。Terraform 将通过报告依赖循环来响应这种情况,使用您看到的错误消息: Cycle: null_resource.foo, null_resource.bar 当 Terraform 返回此错误时,解决方案是从配置中删除至少一个“必须在之后发生”箭头(依赖项),使其不再矛盾。在没有看到您的配置的情况下,我无法建议在您的情况下可能会实现哪些具体更改,但很可能在您的配置中的某个地方,您有两个像这样相互依赖的资源,或者可能是一个引用自身的资源。 如果您有视力,根据您的配置有多复杂,要求 Terraform 生成一个类似于我在此答案中包含的图表可能会有所帮助,但突出显示周期。为此,您可以使用命令terraform graph,如下所示: terraform graph -draw-cycles 此命令的输出是以Graphviz接受的格式对图形的描述。如果您的本地计算机上没有安装 Graphviz,您可以将输出复制粘贴到Graphviz Online中以生成图形图像。该-draw-cycles命令使 Terraform 使用红色标记与正在报告的循环相关的箭头。如果您无法从视觉上区分红色和黑色,您可能希望首先编辑生成的 Graphviz 代码以替换red为您可以区分的其他颜色。 配置的图形可视化对于非平凡的配置往往变得不可用,因为有太多的图形和边,所以如果你的配置有很多对象,最好通过配置本身来跟踪依赖关系。
作为 Terraform 工作的一部分,它会分析您的
resource
块、data
块和其他配置结构之间的依赖关系,以确定处理它们的合适顺序,以便获得必要的输入数据。例如,考虑以下人为的简单配置:
Terraform 会分析以上内容,注意到 的配置
null_resource.bar
包含对 的引用null_resource.foo
,因此与 相关的操作null_resource.foo
必须发生在之前null_resource.bar
。我们可以将其可视化为一个图表,其中箭头表示“必须在之后发生”或“取决于”:null_resource.bar
必须发生在for 的操作之后null_resource.foo
。现在考虑如果我们像这样修改该配置会发生什么:
现在
null_resource.foo
也指null_resource.bar
。现在,此配置暗示了两个“必须在之后发生”关系:null_resource.bar
必须发生在for 的操作之后null_resource.foo
。null_resource.foo
必须发生在for 的操作之后null_resource.bar
。上述两种说法相互矛盾:
null_resource.bar
不能同时处理 before和afternull_resource.foo
。Terraform 将通过报告依赖循环来响应这种情况,使用您看到的错误消息:当 Terraform 返回此错误时,解决方案是从配置中删除至少一个“必须在之后发生”箭头(依赖项),使其不再矛盾。在没有看到您的配置的情况下,我无法建议在您的情况下可能会实现哪些具体更改,但很可能在您的配置中的某个地方,您有两个像这样相互依赖的资源,或者可能是一个引用自身的资源。
如果您有视力,根据您的配置有多复杂,要求 Terraform 生成一个类似于我在此答案中包含的图表可能会有所帮助,但突出显示周期。为此,您可以使用命令
terraform graph
,如下所示:此命令的输出是以Graphviz接受的格式对图形的描述。如果您的本地计算机上没有安装 Graphviz,您可以将输出复制粘贴到Graphviz Online中以生成图形图像。该
-draw-cycles
命令使 Terraform 使用红色标记与正在报告的循环相关的箭头。如果您无法从视觉上区分红色和黑色,您可能希望首先编辑生成的 Graphviz 代码以替换red
为您可以区分的其他颜色。配置的图形可视化对于非平凡的配置往往变得不可用,因为有太多的图形和边,所以如果你的配置有很多对象,最好通过配置本身来跟踪依赖关系。