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.