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 }}'