Selama menjalankan tugas di Playbook yang memungkinkan , Anda mungkin menemukan beberapa tugas yang sifatnya berulang. Ini adalah tugas yang mengharuskan Anda membuat banyak permainan, sesuatu yang bisa sangat membosankan. Seperti halnya bahasa pemrograman apa pun, loop di Ansible menyediakan cara yang lebih mudah untuk menjalankan tugas berulang menggunakan lebih sedikit baris kode dalam buku pedoman.
Saat membuat loop, Ansible memberikan dua arahan berikut:loop dan dengan_* kata kunci.
Kata kunci loop baru-baru ini ditambahkan ke Ansible 2.5 . Kata kunci loop biasanya digunakan untuk membuat loop sederhana dan standar yang berulang melalui beberapa item.
dengan_* kata kunci digunakan dengan sejumlah plugin pencarian saat melakukan iterasi melalui nilai. Plugin pencarian memungkinkan Ansible untuk mengakses informasi dari sumber eksternal seperti penyimpanan data eksternal, sistem file, dll. The with_* pencarian masih sangat banyak digunakan dan belum ditinggalkan.
Sekarang mari kita lihat bagaimana Anda dapat mengimplementasikan Loops di Ansible.
Mengulang loop sederhana
Pertimbangkan Playbook yang menambahkan pengguna baru pada sistem target menggunakan modul pengguna seperti yang ditunjukkan:
---- host:ubuntu_webserver tugas: - nama:Buat pengguna baru john pengguna: nama:john status:sekarang
Ini terlihat baik-baik saja. Tetapi bagaimana jika kita memiliki banyak pengguna untuk ditambahkan ke sistem target? Bagaimana kita melakukannya? Salah satu caranya adalah dengan menduplikasi tugas seperti yang ditunjukkan pada contoh di bawah ini di mana kami menambahkan 3 pengguna.
---- hosts:ubuntu_webserver tugas: - nama:Buat pengguna baru john pengguna: nama:john status:sekarang - nama:Buat pengguna baru mike pengguna: nama:mike nama pengguna:sekarang : nama:andrew status:sekarang
Seperti yang Anda lihat, ini membutuhkan banyak duplikasi dan pengulangan.
Untuk mempermudah, buku pedoman yang sama dapat ditulis menggunakan direktif loop. Arahan loop menjalankan tugas yang sama beberapa kali. Ini menyimpan nilai setiap item dalam variabel yang disebut item .Jadi, daripada menentukan nama pengguna yang akan ditambahkan, cukup tentukan variabel yang disebut item yang diapit di antara kurung kurawal ganda seperti yang ditunjukkan.
nama:'{{ item }}'
Oleh karena itu, setiap item dalam loop akan direferensikan oleh variabel.
Seperti yang Anda lihat, buku pedoman kami sekarang jauh lebih teratur dengan duplikasi/pengulangan yang tidak perlu.
$ vi create_users.yaml---- hosts:ubuntu_webserver tasks: - name:Create new users user: name:'{{ item }}' state:present loop: - john
Selain itu, Anda dapat menggunakan with_items direktif alih-alih direktif loop. Keduanya akan memberikan hasil yang sama.
---- hosts:ubuntu_webserver menjadi:yes tugas: - name:Create new users user: name:'{{ item }}' state:present with_items: - john >Anda sekarang dapat menjalankan playbook untuk membuat pengguna menggunakan ansible-playbook perintah seperti yang ditunjukkan di bawah ini:
$ ansible-playbook -i inventory.txt create_users.yaml
Mengulang daftar Kamus
Pada contoh pertama, kita melihat loop standar sederhana di mana array adalah daftar nilai string yang mewakili pengguna untuk ditambahkan ke target jarak jauh.
Tetapi bagaimana jika kita perlu menambahkan uid ke loop sehingga setiap item sekarang memiliki dua nilai:nama pengguna dan uid . Bagaimana Anda melewatkan 2 nilai dalam sebuah array?
Dalam skenario ini, Anda harus melewati larik kamus, masing-masing dengan 2 pasangan nilai kunci seperti yang ditunjukkan. Kuncinya adalah nama dan uid sedangkan nilainya adalah nama pengguna dan ID setiap pengguna.
Di bawah 'tugas ', Anda tidak dapat lagi mendefinisikan item variabel seperti sebelumnya. Karena kami memiliki 2 nilai, ini akan diterjemahkan menjadi dua variabel:item.name &item.uid .
Playbook lengkapnya ditunjukkan di bawah ini:
$ vi create_users.yaml---- hosts:ubuntu_webserver menjadi:yes tasks: - name:Create new users user: name:'{{ item.name }}' uid:'{{ item.uid }}' state:present loop: - name:john uid:1020 - name:mike uid:1030 - name:andrew uid:1040
Array kamus juga dapat direpresentasikan dalam format JSON.
loop: - { name:john , uid:1020 } - { name:mike , uid:1030 } - { name:andrew , uid:1040}Saat dijalankan, Anda akan mendapatkan output berikut:
$ ansible-playbook -i inventory.txt create_users.yaml
Loop yang Dimungkinkan dengan indeks
Terkadang, Anda mungkin ingin melacak nilai indeks dalam larik item Anda. Untuk ini, gunakan 'dengan indexed_items ' menengadah. Nilai indeks dimulai dari 0 sementara Indeks loop dimulai dari item.0 dan nilai dari item.1
Perhatikan pedoman di bawah ini:
$ vi indexes.yaml---- hosts:ubuntu_webserver tasks: - name:Indexes with Ansible loop debug: msg:"The car at {{ item.0 }} is {{ item.1 }}" with_indexed_items:- "Nissan" - "Mercedes" - "Toyota" - "Mazda" - "BMW"
Saat dijalankan, buku pedoman menampilkan nilai indeks setiap item dalam daftar larik.
$ ansible-playbook -i inventory.txt indexes.yaml
Kondisi dalam Perulangan yang Mungkin
Dalam perulangan Ansible, Anda dapat menggunakan pernyataan kondisional kapan harus mengontrol perulangan berdasarkan sifat variabel atau fakta sistem. Pertimbangkan buku pedoman di bawah ini di mana kami memiliki daftar paket yang perlu diinstal.
Kami telah menetapkan larik yang disebut ‘paket ' yang berisi daftar paket yang perlu diinstal. Setiap item pada larik berisi nama paket yang akan diinstal dan properti yang disebut ‘wajib ‘ yang disetel ke ‘Benar ‘ untuk 2 paket dan ‘Salah ' untuk satu paket.
$ vi install-packages.yaml---- name:Install software menjadi:yes hosts:all vars: package: - name:neofetch diperlukan:True - name:cpu-checker diperlukan:True - name:screenfetch Salah tugas: - nama:Instal "{{ item.name }}" di Ubuntu apt: name:"{{ item.name }}" state:present when: - item.required ==Benar [' ansible_facts] ="Ubuntu" loop:"{{ paket }}"
'kapan ' pernyataan bersyarat berusaha untuk menginstal paket perangkat lunak dengan properti 'diperlukan ' disetel ke 'Benar ' pada sistem target yang merupakan distro Ubuntu. Di bawah ini adalah output dari playbook saat dijalankan.
Output verbose dengan jelas menunjukkan paket yang sedang diinstal dan paket yang diabaikan berdasarkan pernyataan kondisional.
Dan ini membawa kita ke akhir topik ini. Kami berharap Anda memiliki pemahaman yang baik tentang Loops in Ansible playbooks. Jangan ragu untuk menghubungi kami untuk klarifikasi apa pun.
Baca Juga :Cara Menggunakan Template Jinja2 di Ansible Playbook
Cara Memutar dan Mengompresi File Log di Linux dengan Logrotate Cara Mengonfigurasi Volume Persisten berbasis NFS di KubernetesLinux