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 на собственной линии. Строки строки и маркер конца не должны иметь отступ.

Другие вопросы по тегам