【问题标题】:Terraform: invalid characters in heredoc anchorTerraform:heredoc 锚点中的无效字符
【发布时间】:2016-10-19 14:21:19
【问题描述】:

我正在尝试在我的 terraform 脚本的 provisioner "remote-exec" 块中使用多行字符串。然而,每当我使用文档和各种示例中概述的EOT 语法时,我都会收到一个错误,抱怨有:invalid characters in heredoc anchor

以下是收到此错误的简单provisioner "remote-exec" 示例(两种类型的 EOT 在单独尝试时都会收到此错误):

provisioner "remote-exec" {
  inline = [
    << EOT 
    echo hi 
    EOT,

    << EOT 
    echo \
    hi 
    EOT,
  ]
}

更新:这是可行的解决方案,如果您遇到此问题,请仔细阅读,因为 terraform 在 EOF 方面非常挑剔:

provisioner "remote-exec" {
  inline = [<<EOF

   echo foo
   echo bar

  EOF
  ]
}

请注意,如果您想使用 EOF,则在 provisioner "remote-exec" 块中使用的所有命令都必须在 EOF 内。您不能同时拥有 EOF 和非 EOF 之一。

EOF 的第一行必须这样开始,并且在&lt;&lt;EOF 之后的这一行中不能有任何空格,否则它会抱怨有invalid characters in heredoc anchor

  inline = [<<EOF

然后,您的 EOF 必须以 EOF] 相同的缩进这样结束

  EOF
  ]

【问题讨论】:

  • 请接受答案

标签: terraform


【解决方案1】:

Terraform 中的Heredocs 对周围的空白特别有趣。

将您的示例更改为以下内容似乎可以消除heredoc 特定的错误:

provisioner "remote-exec" {
  inline = [<<EOF
echo hi
EOF,
<<EOF
echo \
hi
EOF
  ]
}

尽管内联数组是应在远程主机上运行的命令列表,但您根本不需要在此处使用多个 heredocs。使用带有多行命令的 heredoc 对您来说应该可以正常工作:

provisioner "remote-exec" {
  inline = [<<EOF
echo foo
echo bar
EOF
  ]
}

【讨论】:

  • 是的,效果很好。 terraform 中的 EOF 格式有多挑剔真的很烦人。如果我想使用 EOF 格式,那么我在 provisioner "remote-exec" 块中的所有命令都必须在 EOF 中。真正可怕的是,在实际提到 EOF 的一节中的 terraform 文档中没有解释这一点。就像如果你想让你的软件的一部分非常挑剔你至少应该在你的文档中给出一个例子来让人们意识到这一点。
  • 事实上,terraform 文档完全错误!他们提到使用EOT 格式(这不起作用)。工作格式是 EOF,因为 @ydaetskcoR 工作示例使用 EOF,文档中根本没有提到:terraform.io/docs/configuration/syntax.html
  • EOFEOT 格式之间的区别到底是什么?
  • 没有区别,你可以使用 FOOBAR,如果你愿意,问题是围绕着周围的空白。 EOF 只是一个更标准的heredoc 锚,所以这就是我使用的。
【解决方案2】:

here-document 结束分隔符的末尾有一个逗号 (,)。这是不允许的。

试试这个:

provisioner "remote-exec" {
  inline = [
    <<EOT 
    echo hi
EOT
    ,
    <<EOT 
    echo \
    hi 
EOT
    ,
  ]
}

我不知道该文件的语法要求,但此处文档的结束分隔符需要匹配其开头使用的单词。

另外,通常(在 shell 中),定界符需要排在第一位(前面没有空格)。

事实上,Terraform documentation 是这样说的:

多行字符串可以使用 shell 风格的“here doc”语法,使用 以 &lt;&lt;EOT 之类的标记开头的字符串,然后以字符串结尾 EOT 在自己的一行上。字符串的行和结尾 标记不得缩进。

【讨论】:

  • 不,在你说“通常(在 shell 中),分隔符需要排在第一位(前面没有空格)”之后,我试过了。所以那里没有运气。我什至尝试从 EOT 行中删除所有空格,除了 echo hi 之间的空格,没有任何变化。
  • @AlexCohen 我想知道这里的文档或周围的文档是否有问题?你仍然遇到同样的错误吗?
  • 不,没有 EOT 的东西它可以正常工作,有关详细示例,请参阅我在原始问题中的更新。
猜你喜欢
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 2021-09-02
  • 2013-07-29
  • 1970-01-01
  • 2017-02-02
  • 2021-07-22
  • 2013-03-07
相关资源
最近更新 更多