Terraform: недопустимые символы в привязке heredoc
Я пытаюсь использовать многострочную строку в 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 должна начинаться так, и после этой строки не должно быть пробелов <<EOF
или же он будет жаловаться на наличие invalid characters in heredoc anchor
:
inline = [<<EOF
Ваш EOF должен закончиться вот так EOF
в том же отступе, что и ]
EOF
]
2 ответа
Heredocs в Terraform особенно забавны по поводу окружающего пробела.
Изменение вашего примера на следующее, кажется, избавляет от специфических ошибок 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
]
}
Конечный разделитель здесь-документа имеет запятую (,
) в конце. Это не разрешено
Попробуйте это вместо этого:
provisioner "remote-exec" {
inline = [
<<EOT
echo hi
EOT
,
<<EOT
echo \
hi
EOT
,
]
}
Мне неизвестны синтаксические требования к файлу, но конечный разделитель документа должен соответствовать слову, используемому в начале.
Кроме того, обычно (в оболочках) разделитель должен стоять первым в строке (без пробелов впереди).
Фактически, документация Terraform говорит об этом:
Многострочные строки могут использовать синтаксис "here doc" в стиле оболочки, причем строка начинается с маркера, например
<<EOT
а затем строка, заканчивающаясяEOT
на собственной линии. Строки строки и маркер конца не должны иметь отступ.