2016-10-25 19 views
42

teraz używam skrypt w ansibla że byłoby dużo bardziej czytelne, czy to na wielu liniachJak zrobić multilinii skrypt w ansibl

- name: iterate user groups 
    shell: groupmod -o -g {{ item['guid'] }} {{ item['username'] }} ....more stuff to do 
    with_items: "{{ users }}" 

Po prostu nie wiem, jak pozwalają multilinii skrypt ansibl moduł powłoki

+0

również rozważyć użycie polecenia ansibl „script” i używać zewnętrznego pliku – Jason

Odpowiedz

83

ansibl wykorzystuje składni YAML w jej playbooks. YAML ma pewną liczbę sterowników do bloku:

  • > jest składany operatora bloku. Oznacza to, że łączy wiele linii razem spacjami. Następującą składnię:

    key: > 
        This text 
        has multiple 
        lines 
    

    przypisze wartość This text has multiple lines\n do key.

  • Znak | jest literalnym operatorem blokowym. Jest to prawdopodobnie to, czego oczekujesz od skryptów powłoki wieloliniowej. Następującą składnię:

    key: | 
        This text 
        has multiple 
        lines 
    

    przypisze wartość This text\nhas multiple\nlines\n do key.

Można to wykorzystać do multilinii skryptów powłoki tak:

- name: iterate user groups 
    shell: | 
    groupmod -o -g {{ item['guid'] }} {{ item['username'] }} 
    do_some_stuff_here 
    and_some_other_stuff 
    with_items: "{{ users }}" 

Jest jedno zastrzeżenie: ansibl robi jakąś Janky manipulację argumenty do komendy shell, więc podczas wyżej generalnie będzie działał jako Oczekuje się, co następuje nie będzie:

- shell: | 
    cat <<EOF 
    This is a test. 
    EOF 

ansibl rzeczywiście czynią ten tekst z czołowych miejsc, co oznacza powłokę nie znajdzie ciąg EOF na początku linii. Można uniknąć nieprzydatnych heurystyki ansibl za pomocą parametru cmd tak:

- shell: 
    cmd: | 
     cat <<EOF 
     This is a test. 
     EOF 
+4

Fantastyczna odpowiedź –

8

https://support.ansible.com/hc/en-us/articles/201957837-How-do-I-split-an-action-into-a-multi-line-format-

wymienia kontynuacje linii YAML.

przykładu (Próbowano ansibl 2.0.0.2)

--- 
- hosts: all 
    tasks: 
    - name: multiline shell command 
     shell: > 
     ls --color 
     /home 
     register: stdout 

    - name: debug output 
     debug: msg={{ stdout }} 

Polecenie powłoka jest złożona w jednej linii, w ls --color /home

+2

Tak, ale w powłoce '>' ma bardzo konkretne znaczenie. Próbowałem tego i nie działało zgodnie z oczekiwaniami. –

+3

Dlatego właśnie znajduje się w pierwszej linii, a nie w kolejnych. Dla mnie działało dobrze z ansible 2.0, jakkolwiek napisałem, chociaż nie wydrukował pełnego wyjścia ls z ansible 1.9.4. Jakiej wersji Ansible używasz? –