2016-06-17 11 views
5

Próbuję użyć ciągu wielowierszowego w bloku provisioner "remote-exec" mojego skryptu terraform. Jednak zawsze, gdy używam składni EOT, jak opisano w dokumentacji i różnych przykładach, pojawia się błąd, który narzeka na posiadanie: invalid characters in heredoc anchor.Terraform: nieprawidłowe znaki w kotwicy heredoc

Oto przykład prostego provisioner "remote-exec" która otrzymała ten błąd (oba rodzaje EOT otrzymać ten błąd przy próbie oddzielnie):

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

    << EOT 
    echo \ 
    hi 
    EOT, 
    ] 
} 

Aktualizacja: Oto roztwór roboczy, przeczytaj uważnie, jeśli mają ten problem, ponieważ terraform jest bardzo wybredna, jeśli chodzi o EOF:

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

    echo foo 
    echo bar 

    EOF 
    ] 
} 

Pamiętaj, że jeśli chcesz używać EOF wszystkie polecenia użyć w provisioner "remote-exec" bloku musi b e wewnątrz EOF. Nie możesz mieć jednocześnie EOF i non EOF.

Pierwsza linia EOF należy rozpocząć tak, i nie można mieć żadnych spacji w tej linii po <<EOF albo będzie narzekać mając invalid characters in heredoc anchor:

inline = [<<EOF 

Twój EOF musi tak skończyć z EOF w tym samym nacięciu jako ]

EOF 
    ] 
+0

proszę przyjąć odpowiedź – holms

Odpowiedz

6

Heredocs w Terraform są szczególnie zabawni w otaczających odstępach.

Zmiana przykład do następujących wydaje się pozbyć konkretnych błędów heredoc:

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

Nie należy korzystać z wielu heredocs tu w ogóle choć jak tablica inline jest lista poleceń, które powinny być uruchomione na zdalnym hoście.Korzystanie z heredoc z poleceń na wielu liniach powinien działać dobrze dla ciebie:

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

Tak, to działało świetnie. To naprawdę denerwujące, jak wybredny jest format EOF w wersji terraform. Że jeśli chcę używać formatu EOF, wszystkie moje polecenia w bloku 'remote 'exec'' provisioner 'muszą być w EOF. Co naprawdę strasznego jest, że NIE podano tego w dokumentacji terraform w jednej sekcji, która faktycznie wspomina EOF. Tak jak w przypadku, gdy część oprogramowania ma być ** wyjątkowo ** wybredna, powinieneś przynajmniej podać przykład w swojej dokumentacji, aby uświadomić to ludziom. –

+0

W rzeczywistości okazuje się, że dokumentacja terraformowa jest błędna! Wspominają o używaniu formatu 'EOT' (który nie działa). Formatem roboczym jest EOF, ponieważ przykładowy dokument @ydaetskcoR używa 'EOF', którego w ogóle nie wymieniono w dokumentacji: https://www.terraform.io/docs/configuration/syntax.html –

+0

heck jest różnicą między' EOF format 'i' EOT'? – the0ther

1

tu-dokument końcowy ogranicznik ma przecinek (,) na końcu. To nie jest dozwolone.

Spróbuj to zamiast:

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

Jestem świadoma wymogów Składnia pliku, ale tutaj-dokument końcowy ogranicznik musi dopasować słowo używane na jego początku.

Ponadto, zwykle (w muszli), ogranicznik musi znajdować się najpierw na linii (bez spacji na wierzchu).

W rzeczywistości Terraform documentation mówi tak:

wielowierszowe łańcuchy mogą używać powłoki stylu „tutaj doc” składnię, z ciągiem wychodząc z markerem jak <<EOT a następnie ciąg kończący z EOT na linia sama w sobie. Linie ciąg i koniec znacznika nie mogą być wcięte.

+0

Nie, że daje mi dokładnie taki sam błąd. –

+0

@AlexCohen Zaktualizowałem odpowiedź, czy to działa? – Kusalananda

+0

Nie, próbowałem, po tym, jak powiedziałeś, że "zwykle (w muszli), ogranicznik musi być pierwszy na linii (bez spacji na wierzchu)." Więc nie ma szczęścia. Próbowałem nawet usunąć wszystkie białe spacje z linii EOT, z wyjątkiem spacji pomiędzy 'echo hi' bez żadnych zmian. –

Powiązane problemy