我正在尝试在我的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,
]
}
更新:这是工作解决方案,如果您遇到此问题,请仔细阅读,因为在EOF方面,terraform非常挑剔:
provisioner "remote-exec" {
inline = [<<EOF
echo foo
echo bar
EOF
]
}
请注意,如果要使用EOF,则provisioner "remote-exec"
块中使用的所有命令都必须位于EOF内。你不能同时拥有EOF和非EOF。
EOF的第一行必须以这样的方式开始,并且<<EOF
之后你不能在这一行中有任何空格,否则它会抱怨invalid characters in heredoc anchor
:
inline = [<<EOF
您的EOF必须以EOF
与]
EOF
]
答案 0 :(得分:7)
Terraform中的Heredocs对周围的空白特别有趣。
将您的示例更改为以下内容似乎摆脱了heredoc特定错误:
provisioner "remote-exec" {
inline = [<<EOF
echo hi
EOF,
<<EOF
echo \
hi
EOF
]
}
这里根本不需要多个heredoc,因为内联数组是应该在远程主机上运行的命令列表。使用带有多行命令的heredoc应该可以正常工作:
provisioner "remote-exec" {
inline = [<<EOF
echo foo
echo bar
EOF
]
}
答案 1 :(得分:1)
here-document end-delimiter末尾有一个逗号(,
)。这是不允许的。
请改为尝试:
provisioner "remote-exec" {
inline = [
<<EOT
echo hi
EOT
,
<<EOT
echo \
hi
EOT
,
]
}
我不知道该文件的语法要求,但是here-document end-delimiter需要匹配其开头使用的单词。
此外,通常(在shell中),分隔符需要首先出现在行上(前面没有空格)。
事实上,Terraform documentation说明了这一点:
多行字符串可以使用shell样式&#34;这里doc&#34;语法,用 字符串以
<<EOT
之类的标记开头,然后是字符串结尾 与EOT
在一条线上。字符串和结尾的行 标记不得缩进。