2016-06-17 7 views
5

Ich versuche, eine mehrzeilige Zeichenfolge in der provisioner "remote-exec" Block meines Terraform-Skript verwenden. Aber immer wenn ich die EOT Syntax verwende, die in der Dokumentation und in den verschiedenen Beispielen beschrieben wird, bekomme ich einen Fehler, der sich beschwert über: invalid characters in heredoc anchor.Terraform: ungültige Zeichen in Heredoc-Anker

Hier ist ein Beispiel für eine einfache provisioner "remote-exec", die diesen Fehler empfangen (beide Arten von EOT diesen Fehler erhalten, wenn sie getrennt versucht):

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

    << EOT 
    echo \ 
    hi 
    EOT, 
    ] 
} 

Update: Hier die Arbeitslösung, lesen Sie sorgfältig, wenn haben dieses Problem, weil Terraforming sehr wählerisch, wenn es um EOF kommt:

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

    echo foo 
    echo bar 

    EOF 
    ] 
} 

Hinweis

dass, wenn Sie EOF alle Befehle, die Sie in einem provisioner "remote-exec" Block verwenden verwenden wollen, müssen b e innerhalb des EOF. Sie können nicht beide EOF und nicht EOF haben die eine oder andere.

Die erste Zeile der EOF muss wie folgt beginnen, und Sie können keine Leerzeichen in dieser Linie haben nach <<EOF sonst wird es beklagen invalid characters in heredoc anchor darüber, dass:

inline = [<<EOF 

Ihr EOF muss dann wie folgt mit dem Ende EOF zur gleichen Vertiefung als ]

EOF 
    ] 
+0

akzeptieren Sie bitte eine Antwort – holms

Antwort

6

Heredocs in Terraform sind besonders lustig über die umgebenden Whitespace.

Ändern Beispiel auf die folgende scheint der heredoc spezifische Fehler loszuwerden:

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

Sie nicht mehrere Heredocs hier überhaupt obwohl benötigen, sollten als die Inline-Array eine Liste von Befehlen, das sollte auf dem Remote-Host ausgeführt werden.eine heredoc mit Befehlen über mehrere Zeilen verwenden, sollten Sie gut funktionieren:

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

Ja, das hat super funktioniert. Es ist wirklich nervig, wie wählerisch EOF-Format in Terraform ist. Wenn ich das EOF-Format benutzen will, müssen alle meine Befehle im 'provisioner" remote-exec "' Block in EOF sein. Was wirklich schrecklich ist, wie NONE davon in der Terraform-Dokumentation in dem einen Abschnitt erklärt wird, der tatsächlich EOF erwähnt. Wenn Sie beispielsweise einen Teil Ihrer Software als sehr wählerisch bezeichnen möchten, sollten Sie in Ihrer Dokumentation zumindest ein Beispiel geben, um die Leute darauf aufmerksam zu machen. –

+0

Eigentlich stellt sich heraus, dass die Terraform-Dokumentation völlig falsch ist! Sie erwähnen das 'EOT' Format (was nicht funktioniert). Das Arbeitsformat ist EOF, da @ydaetskcoR Arbeitsbeispiel 'EOF' verwendet, das überhaupt nicht in der Dokumentation erwähnt wird: https://www.terraform.io/docs/configuration/syntax.html –

+0

der Teufel ist der Unterschied zwischen' EOF 'und' EOT' Format? – the0ther

1

Das hier-Dokument End-Trennzeichen hat ein Komma (,) am Ende. Das ist nicht erlaubt.

Versuchen Sie stattdessen:

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

Ich bin nicht bewusst der Syntax Anforderungen der Datei, sondern ein Hier-Dokument End-Trennzeichen muss das Wort an ihrem Anfang verwendet anzupassen.

In der Regel (in Shells) muss das Trennzeichen zuerst an der Zeile stehen (kein Leerzeichen vor).

In der Tat, sagt die Terraform documentation dies:

mehrzeilige Strings kann Shell-style "hier doc" Syntax, mit dem String beginnend mit einem Marker wie <<EOT und dann der Zeichenfolge endet mit EOT verwenden auf eine eigene Linie. Die Zeilen des Strings und das Ende Marker dürfen nicht eingerückt werden.

+0

Nein, die mir genau den gleichen Fehler gibt. –

+0

@AlexCohen Ich habe die Antwort aktualisiert, funktioniert das? – Kusalananda

+0

Nein, ich habe es versucht, nachdem du gesagt hast: "Normalerweise (in Shells) muss der Delimiter zuerst auf der Zeile stehen (kein Leerzeichen davor)." Also kein Glück dort. Ich habe sogar versucht, alle Leerzeichen aus den EOT-Zeilen zu entfernen, mit Ausnahme des Abstands zwischen echo hallo ohne Änderungen. –