Bagaimana melakukan skrip shell multiline di Ansible

125

sekarang saya menggunakan skrip shell di ansible yang akan jauh lebih mudah dibaca jika ada di beberapa baris

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

Hanya tidak yakin bagaimana mengizinkan skrip multiline dalam modul shell Ansible

Edgar Martinez
sumber
1
Juga pertimbangkan untuk menggunakan perintah 'script' yang mungkin dan gunakan file eksternal
Jason

Jawaban:

273

Ansible menggunakan sintaks YAML dalam buku pedomannya. YAML memiliki sejumlah operator blok:

  • Ini >adalah operator blok lipat. Artinya, ini menggabungkan beberapa baris bersama-sama oleh spasi. Sintaks berikut:

    key: >
      This text
      has multiple
      lines

    Akan menetapkan nilai This text has multiple lines\nuntuk key.

  • The |karakter adalah operator blok literal. Ini mungkin yang Anda inginkan untuk skrip shell multi-baris. Sintaks berikut:

    key: |
      This text
      has multiple
      lines

    Akan menetapkan nilai This text\nhas multiple\nlines\nuntuk key.

Anda dapat menggunakan ini untuk skrip shell multiline seperti ini:

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

Ada satu peringatan: Ansible melakukan manipulasi argumen yang tersendat-sendat pada shellperintah, jadi meskipun cara di atas umumnya akan berfungsi seperti yang diharapkan, berikut ini tidak akan:

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

Ansible sebenarnya akan membuat teks itu dengan spasi di depan, yang berarti shell tidak akan pernah menemukan string EOFdi awal baris. Anda dapat menghindari heuristik Ansible yang tidak membantu dengan menggunakan cmdparameter seperti ini:

- shell:
    cmd: |
      cat <<EOF
      This is a test.
      EOF
larsks
sumber
27
Jawaban fantastis
perburuan Bryan
18

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

menyebutkan kelanjutan baris YAML.

Sebagai contoh (dicoba dengan 2.0.0.2):

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

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

Perintah shell diciutkan menjadi satu baris, seperti pada ls --color /home

Marcello Romani
sumber
3
Ya tapi di cangkang >memiliki arti yang sangat spesifik. Saya mencoba ini dan tidak berhasil seperti yang diharapkan.
Edgar Martinez
6
Itulah mengapa itu hanya di baris pertama, bukan di baris berikutnya. Ini bekerja dengan baik untuk saya dengan kemungkinan 2.0 seperti yang saya tulis, meskipun tidak mencetak output ls penuh dengan 1.9.4 yang mungkin. Versi Ansible apa yang Anda gunakan?
Marcello Romani
Tautannya sudah mati.
kenorb
Ini dari 2016, hal-hal ini terjadi.
Marcello Romani
3

Menambahkan spasi sebelum pembatas EOF memungkinkan untuk menghindari cmd:

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