Hemen bir örnek ile başlayacak olursak,
user modülünü kullanarak bir kullanıcı oluşturmak istediğimizde aşağıdaki yöntem ile kullanıcı oluşturabiliriz. Peki ya birden fazla işlem gerçekleştireceksek?
- name: Create users hosts: localhost tasks: -user: name=joe state=present
Bu şekilde liste uzayacak ve oluşturulacak her kullanıcı için yeni bir satır açılacak. Hiç zarif bir görüntü olmayacak,
- name: Create users hosts: localhost tasks: -user: name=joe state=present -user: name=george state=present -user: name=onur state=present -user: name=kemal state=present -user: name=nuri state=present -user: name=emaan state=present -user: name=ran state=present -user: name=mike state=present -user: name=shoeb state=present
Bu işlemi döngü içerisine sokmamız daha güzel olacaktır.
- name: Create users hosts: localhost tasks: - user: name= '{{ item }}' state=present loop: - joe - george - onur - kemal - nuri - emaan - ran - mike - shoeb
Loop, bir döngü talimatıdır. Aynı görevi yürüten birden çok kez çalıştırır. Her çalıştırıldığında her öğenin değerini depolar. Item adında bir değişkendeki döngüde kullanıcı adı değiştirilebilir. Bu durumda Joe, item değişkeni ile çift parantez içinde item olarak güncellenir. Bu durumda satırları tekrardan tekrarlamıyoruz, user modülü ve state durumu tekrar tekrar yazılmıyor.
Peki userid değerlerini de belirtmek istersem.
- name: Create users hosts: localhost tasks: - user: name= '{{ item.name }}' state=present uid='{{ item.uid }}' loop: - name: joe uid: 1010 - name: george uid: 1011 - name: onur uid: 1012 - name: kemal uid: 1013 - name: nuri uid: 1014 - name: emaan uid: 1015 - name: ran uid: 1016 - name: mike uid: 1017 - name: shoeb uid: 1018
With_* Directivinin kullanımına bakalım
With_*
- name: Create users hosts: localhost tasks: - user: name='{{item }}' state=present loop: - joe - george - ravi - mani
loop ile with_ örnegini ele aldığımızda ikisi arasında fark yok aslında, ikiside aynı çıktı verecekler.
- name: Create users hosts: localhost tasks: - user: name='{{item }}' state=present with_items: - joe - george - ravi - mani
with_items sadece bir liste üzerinde çalışır, vermiş olduğum uz liste üzerinden işlemlerini gerçekleştirir ancak başka direktiflerimizi de var. with_file gibi.
- name: view config files hosts: localhost tasks: - debug: var=item with_file: - "/etc/hosts" - "/etc/resolv.conf" - "/etc/ntp.conf"
with_url birden fazla URL’ye bağlanan,
- name: Get from multiple URLs hosts: localhost tasks: - debug: var=item with_url: - "https://site1.com/get-servers" - "https://site2.com/get-servers" - "https://site3.com/get-servers"
with_mongodb gibi birden fazla mongo db ye bağlanan
- name: Check multiple mongodbs hosts: localhost tasks: - debug: msg="DB={{ item.database}} PID= {{ item.pid}}" with_mongodb: - database: dev connection_string: "mongodb://dev.mongo/" - database: prod connection_string: "mongodb://prod.mongo/"
tabiki daha da fazlası var, buradan inceleyebilirsiniz,
https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html
Biraz da örnek yapalım,
Playbook şu anda bir meyve adını yazdırmak için bir echo komutu çalıştırıyor. Fruits değişkeninde tanımlanan tüm meyveleri yazdırmak için göreve bir döngü yönergesi (with_items) uygulayın.
Mevcut yapi
- name: 'Print list of fruits' hosts: localhost vars: fruits: - Apple - Banana - Grapes - Orange tasks: - command: 'echo "Apple"'
Çözüm,
- name: 'Print list of fruits' hosts: localhost vars: fruits: - Apple - Banana - Grapes - Orange tasks: - command: 'echo "{{ item }}"' with_items: '{{ fruits }}'
Diğer örneğimiz,
Daha gerçekçi bir kullanım durumu için yum modülünü kullanarak birden çok paket kurmaya çalışıyoruz. Mevcut playbook sadece tek bir paket kuruyor.
Mevcut playbook
- name: 'Install required packages' hosts: localhost vars: packages: - httpd - binutils - glibc - ksh - libaio - libXext - gcc - make - sysstat - unixODBC - mongodb - nodejs - grunt tasks: - yum: 'name=httpd state=present'
Çözüm,
- name: 'Install required packages' hosts: localhost vars: packages: - httpd - binutils - glibc - ksh - libaio - libXext - gcc - make - sysstat - unixODBC - mongodb - nodejs - grunt tasks: - yum: name: '{{ item }}' state: present with_items: '{{ packages }}'