Ansible Loops / Döngüler

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

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir