2016-06-17 23 views
5

Sto provando a utilizzare una stringa multilinea nel blocco provisioner "remote-exec" del mio script terraform. Tuttavia, ogni volta che uso la sintassi EOT come descritto nella documentazione e vari esempi, ottengo un errore che si lamenta di avere: invalid characters in heredoc anchor.Terraform: caratteri non validi nell'ancora heredoc

Ecco un esempio di un semplice provisioner "remote-exec" che ha ricevuto questo errore (entrambi i tipi di EOT ricevono questo errore quando tentato separatamente):

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

    << EOT 
    echo \ 
    hi 
    EOT, 
    ] 
} 

Aggiornamento: Ecco la soluzione di lavoro, leggere attentamente se si stanno avendo questo problema perché Terraform è molto esigente quando si tratta di EOF:

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

    echo foo 
    echo bar 

    EOF 
    ] 
} 

si noti che se si desidera utilizzare EOF tutti i comandi che si utilizzano in un blocco provisioner "remote-exec" deve b e all'interno dell'EOF. Non è possibile avere EOF e non EOF come uno o l'altro.

La prima linea di EOF deve iniziare in questo modo, e non si può avere qualsiasi spazi bianchi in questa linea dopo <<EOF altrimenti si lamenta di avere invalid characters in heredoc anchor:

inline = [<<EOF 

tuo EOF dovrà poi finire così con la EOF allo stesso rientro della ]

EOF 
    ] 
+0

si prega di accettare una risposta – holms

risposta

6

Heredocs in Terraform sono particolarmente divertenti per gli spazi bianchi circostanti.

Modifica il tuo esempio al seguente sembra di sbarazzarsi degli errori specifici heredoc:

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

Non dovrebbe essere necessario più heredocs in qui a tutti anche se, come la matrice in linea è una lista di comandi che dovrebbero essere eseguito sull'host remoto.Utilizzando un heredoc con i comandi su più linee dovrebbe funzionare bene per voi:

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

Sì, ha funzionato alla grande. È davvero fastidioso come il formato EOF schizzinoso sia in terraforma. Che se voglio usare il formato EOF, tutti i miei comandi nel blocco "execer" remote-exec "' devono essere in EOF. Cosa è veramente terribile di come NESSUNO di ciò sia spiegato sulla documentazione terraform in quella sezione che effettivamente menziona EOF. Ad esempio, se hai intenzione di far parte del tuo software ** estremamente ** schizzinoso, dovresti almeno dare un esempio nella tua documentazione per rendere le persone consapevoli di questo. –

+0

Attualmente la documentazione di terraform non è corretta! Citano usando il formato 'EOT' (che non funziona). Il formato di lavoro è EOF poiché l'esempio di lavoro @ydaetskcoR usa 'EOF' che non è affatto menzionato nella documentazione: https://www.terraform.io/docs/configuration/syntax.html –

+0

il diavolo è il diff tra' EOF 'e' EOT' formato? – the0ther

1

il qui-documento finale delimitatore ha una virgola (,) alla fine. Non è permesso.

Prova a modificare:

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

Sono a conoscenza dei requisiti di sintassi del file, ma un qui-document end-delimitatore deve corrispondere la parola usata al suo inizio.

Inoltre, in genere (nelle shell), il delimitatore deve venire prima sulla linea (senza spazi vuoti in primo piano).

Infatti, il Terraform documentation dice questo:

stringhe multilinea possono utilizzare shell-style "qui doc" della sintassi, con la stringa partendo con un pennarello come <<EOT e quindi la stringa termina con EOT su una linea a parte. Le linee della stringa e il marcatore finale non devono essere rientrati.

+0

No, che mi dà lo stesso errore esatto. –

+0

@AlexCohen Ho aggiornato la risposta, funziona? – Kusalananda

+0

Nah, l'ho provato dopo che hai detto che "di solito (nelle shell), il delimitatore deve venire prima sulla linea (senza spazi bianchi di fronte)." Quindi niente fortuna lì. Ho anche provato a rimuovere tutti gli spazi bianchi dalle linee EOT ad eccezione dello spazio tra "echo hi" senza modifiche. –