2016-06-17 2 views
5

Я пытаюсь использовать многострочную строку в блоке provisioner "remote-exec" моего скрипта terraform. Однако всякий раз, когда я использую синтаксис EOT, описанный в документации и различных примерах, я получаю сообщение об ошибке: invalid characters in heredoc anchor.Terraform: недопустимые символы в heredoc anchor

Вот пример простого provisioner "remote-exec", который получил эту ошибку (оба типа СРВ получить эту ошибку, когда попытался отдельно):

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

    << EOT 
    echo \ 
    hi 
    EOT, 
    ] 
} 

Update: Здесь рабочий раствор, внимательно прочитайте, если вы которые с этой проблемой, потому что Terraform очень разборчив, когда дело доходит до EOF:

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

    echo foo 
    echo bar 

    EOF 
    ] 
} 

Обратите внимание, что если вы хотите использовать ВФ все команды, которые вы используете в provisioner "remote-exec" блока должен б e внутри EOF. Вы не можете иметь как EOF, так и не EOF, тот или другой.

Первая строка EOF должна начинаться, как это, и вы не можете иметь какие-либо пробелы в этой строке после <<EOF или иначе он будет жаловаться о том, invalid characters in heredoc anchor: тогда

inline = [<<EOF 

Ваш EOF должен быть положен конец, как это с EOF в то же отступом как ]

EOF 
    ] 
+0

пожалуйста, примите ответ – holms

ответ

6

Heredocs в Terraform особенно забавны вокруг окружающих пробелов.

Изменение примера к следующему, кажется, избавиться от 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 
    ] 
} 
+0

Да, это сработало отлично. Его действительно раздражает, как придирчивый формат EOF находится в терраформе. Что, если я хочу использовать формат EOF, тогда все мои команды в блоке 'stander 'remote-exec' 'должны быть в EOF. Что действительно ужасно, как НИ ОДНО этого не объяснено в документации по terraform в той части, которая фактически упоминает EOF. Например, если у вас будет часть вашего программного обеспечения, вы будете крайне осторожны, вы должны хотя бы привести пример в своей документации, чтобы люди знали об этом. –

+0

На самом деле, как оказалось, документация терраформирования неверна! Они упоминают использование формата EOT (который не работает). Рабочий формат EOF, поскольку рабочий пример @ydaetskcoR использует 'EOF', который вообще не упоминается в документации: https://www.terraform.io/docs/configuration/syntax.html –

+0

heck - это различие между' EOF 'и' EOT'? – the0ther

1

здесь-документ конца разделитель имеет запятой (,) в конце. Это не разрешено.

Попробуйте вместо этого:

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

Я не знаю о требованиях синтаксиса файла, но здесь-документ конечных разделители должны соответствовать слову, используемому в его начале.

Кроме того, обычно (в оболочках) разделитель должен быть первым на линии (без пробелов впереди).

В самом деле, Terraform documentation говорит, что это:

Многократные строки могут использовать оболочку в стиль «здесь DOC» синтаксис, с строкой, начиная с маркером как <<EOT, а затем строками, заканчивающихся с EOT на собственной линией. Строки строки и конца маркера не должны иметь отступ.

+0

Нет, это дает мне ту же самую точную ошибку. –

+0

@AlexCohen Я обновил ответ, это работает? – Kusalananda

+0

Nah, я попробовал это после того, как вы сказали, что «обычно (в оболочках) разделитель должен быть первым на линии (без пробелов впереди)». Так что не повезло. Я даже попытался удалить все пробелы из строк EOT, за исключением пробела между «echo hi» без изменений. –

Смежные вопросы