我正在尝试在我的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
]
}
请注意,如果要使用在provisioner "remote-exec"
块中使用的所有命令,则必须在EOF内部。您不能同时具有eof和non eof。
EOF的第一行必须像这样开始,并且在<<EOF
之后您不能在此行中有任何空格,否则它会抱怨拥有invalid characters in heredoc anchor
:
inline = [<<EOF
您的EOF必须以与]
EOF
这样的结尾 EOF
]
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
]
}
此处的文档末端 - 末端具有逗号(,
)。这是不允许的。
而是尝试一下:
provisioner "remote-exec" {
inline = [
<<EOT
echo hi
EOT
,
<<EOT
echo
hi
EOT
,
]
}
我不知道文件的语法要求,但是此处的文档末端示威者需要匹配其开始时使用的单词。
通常(通常在外壳中),定界符需要先到第一位(前面没有空格)。
实际上,Terraform文档说:
多行字符串可以使用shell风格的" there doc"语法,并带有 字符串以诸如
<<EOT
之类的标记开始,然后是字符串结束 使用EOT
在其自己的线上。字符串和末端的线 标记不得缩进。