Ansible'da çok satırlı kabuk komut dosyası nasıl yapılır


125

Şu anda, birden çok satırda olsaydı çok daha okunabilir olacak bir yanıtlayıcıda bir kabuk komut dosyası kullanıyorum

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

Ansible kabuk modülünde çok satırlı komut dosyasına nasıl izin verileceğinden emin değilim


1
Ayrıca yanıtlanabilir 'komut dosyası' komutunu kullanmayı ve harici bir dosya kullanmayı düşünün
— Jason

Yanıtlar:


273

Ansible, oyun kitaplarında YAML sözdizimini kullanıyor. YAML'nin birkaç blok operatörü vardır:

  • >Bir katlama bloğu operatördür. Yani, birden çok satırı boşluklarla birleştirir. Aşağıdaki sözdizimi:

    key: >
      This text
      has multiple
      lines

    Değeri atamak istiyorum This text has multiple lines\niçin key.

  • |Karakteri değişmez blok operatörüdür. Muhtemelen çok satırlı kabuk komut dosyaları için istediğiniz şey budur. Aşağıdaki sözdizimi:

    key: |
      This text
      has multiple
      lines

    Değeri atamak istiyorum This text\nhas multiple\nlines\niçin key.

Bunu, aşağıdaki gibi çok satırlı kabuk komut dosyaları için kullanabilirsiniz:

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

Bir uyarı var: Ansible, shellkomuta argümanlar üzerinde biraz beceriksizce manipülasyon yapıyor , bu nedenle yukarıdakiler genellikle beklendiği gibi çalışsa da , aşağıdakiler olmayacak:

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

Ansible aslında bu metni EOFbaştaki boşluklarla çevirecektir, bu da kabuğun dizeyi asla satırın başında bulamayacağı anlamına gelir . Ansible'ın yardımcı olmayan buluşsal yöntemlerinden şu cmdparametreyi kullanarak kaçınabilirsiniz :

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

27
Harika cevap
— Bryan Hunt

18

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

YAML hattı devamlarından bahseder.

Örnek olarak (ansible 2.0.0.2 ile denendi):

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

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

Kabuk komutu, tek bir satıra daraltılır. ls --color /home


3
Evet ama kabuğun >çok özel bir anlamı var. Bunu denedim ve beklendiği gibi çalışmadı.
— Edgar Martinez

6
Bu yüzden sonraki satırlarda değil, sadece ilk satırda. Yazdığım gibi yanıtlanabilir 2.0 ile benim için iyi çalıştı, ancak yanıtlanabilir 1.9.4 ile tam ls çıktısını yazdırmadı. Ansible'ın hangi sürümünü kullandınız?
— Marcello Romani

Bağlantı kesildi.
— kenorb

2016'dan beri böyle şeyler oluyor.
— Marcello Romani

3

EOF sınırlayıcısından önce bir boşluk eklemek cmd'den kaçınmaya izin verir:

- shell: |
    cat <<' EOF'
    This is a test.
    EOF
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.