2016-06-17 12 views
5

私のterraformスクリプトのprovisioner "remote-exec"ブロックに複数行の文字列を使用しようとしています。しかし、私がEOTの文法をドキュメントやさまざまな例に記載されているように使用するときはいつでも、私には:invalid characters in heredoc anchorという文句を言うエラーが出ます。ここでterraform:heredocアンカーの無効な文字

は(別途しようとしたときEOTの両方のタイプは、このエラーが発生した)このエラーを受け取った簡単なprovisioner "remote-exec"の例である:

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

    << EOT 
    echo \ 
    hi 
    EOT, 
    ] 
} 

アップデート:ここでは実用的なソリューションで、あなたの場合は、慎重に読んでそれがEOFになるとテラフォームは非常にうるさいですので、この問題を持っている:あなたはEOFあなたがprovisioner "remote-exec"ブロック内で使用するすべてのコマンドを使用したい場合はbでなければならないこと

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

    echo foo 
    echo bar 

    EOF 
    ] 
} 

注意eをEOFの内側に配置します。 EOFと非EOFの両方を持つことはできません。 EOFの最初の行は次のように開始しなければならない、とあなたは<<EOF後にこの行の空白を持つことができないか、そうでなければinvalid characters in heredoc anchorを持っていることについて文句を言うでしょう

inline = [<<EOF 

あなたのEOFはその後で、次のように終了する必要があります]

+0

答えを受け入れるようにしてください。 – holms

答えて

6

TerraformのHeredocsは、周囲の空白について特に面白いです。以下に、あなたの例を変更

はヒアドキュメント固有のエラーを取り除くようだ:

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

インライン配列は、そのすべきコマンドのリストであるとして、あなたはかかわらず、すべてここで複数のヒアドキュメントを必要はありませんリモートホスト上で実行されます。

provisioner "remote-exec" { 
    inline = [<<EOF 
echo foo 
echo bar 
EOF 
    ] 
} 
+0

すごくうまくいった。その本当に面倒なEOFフォーマットは、テラフォームにいかにありますか?もし私がEOFフォーマットを使いたいなら、 'provisioner" remote-exec "ブロック内のすべてのコマンドはEOFになければなりません。実際にEOFを言及している1つのセクションのテラフォーム文書で、これのどれも説明されていないのは本当にひどいです。あなたがあなたのソフトウェアの一部を**極度のもの**にするつもりなら、少なくともあなたのドキュメントに例を挙げて、人々にこれを知らせるべきです。 –

+0

実際、テラフォームのドキュメントは間違っています。彼らは 'EOT'フォーマットを使って言います(これはうまくいかない)。作業形式は@ydaetskcoRのようにEOFです。作業例では 'EOF'を使用しています。これはドキュメントには何も記述されていません。https://www.terraform.io/docs/configuration/syntax.html –

+0

heckは' EOF 'と' EOT'形式? – the0ther

1
EOF 
    ] 

ここで、原稿端デリミタと同じインデントでEOFは終わりにコンマ(,)を有しています。それは許可されていません。

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

は、私は、ファイルの構文要件を知らないんだけど、ここでは、文書の終わりの区切り文字は、その開始時に使用される単語と一致する必要があります:

代わりにこれを試してみてください。

また、通常は(シェルで)、デリミタは最初に行頭に来る必要があります(前に空白がない)。実際に

Terraform documentationは、この意見:

複数行の文字列が<<EOTのようなマーカーで始まる 文字列で、「ここではドキュメント」構文をシェルスタイルを使用し、その後にEOTと を終了する文字列をすることができますそれ自身の行。文字列の行と末尾の マーカーをインデントしてはいけません。

+0

いいえ、それで私はまったく同じエラーになります。 –

+0

@AlexCohen私は答えを更新しました、それは動作しますか? – Kusalananda

+0

Nah、あなたが「通常(シェルで)」と言った後で、デリミタが最初に行頭に来る必要があります(前に空白がない)。だからそこには運がない。私はEOTの行からすべての空白を削除しようとしましたが、 'echo hi'の間のスペースは変更されません。 –