AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1005761
Accepted
Juan Jimenez
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 1 个回答
  • 45193 Views

1 个回答

  • Voted
  1. 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。我们可以将其可视化为一个图表,其中箭头表示“必须在之后发生”或“取决于”:

    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。现在,此配置暗示了两个“必须在之后发生”关系:

    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为您可以区分的其他颜色。

    配置的图形可视化对于非平凡的配置往往变得不可用,因为有太多的图形和边,所以如果你的配置有很多对象,最好通过配置本身来跟踪依赖关系。

    • 59

相关问题

  • 使用 Terraform 创建 GCE 实例,附加辅助磁盘时出错?

  • Terraform,在污点上出现“模块根目录没有资源”错误

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve