Ansible – Conditionals / Koşullar

Elimizde iki farklı linux türevi var. Birisi CentOS diğeri Ubuntulardan oluşan sunucular. Ansible üzerinden bunlardan hepsine Nginx yüklemek istiyorum ancak tek playbook içerisinde. Bu durumda apt ve yum komutlarını kullanarak nginx kurulumunu gerçekleştireceğiz ancak Ubuntuya gidip yum kullanarak nginx yükle diyemeyiz. Onun için koşullarımızı belirterek işlemlerimizi uygulamamız gerekmekte.

---
- name: Install NGINX
  hosts: all
  tasks:
  - name: Install NGINX on Debian
    apt:
      name: nginx
      state: present
    when: ansible_os_family == "Debian" and ansible_distribution_version == "16.04"

   - name: Install NGINX on Redhat
     yum:
       name:nginx
       state: present
     when: ansible_os_family == "RedHat" or ansible_os_family == "SUSE"

Burada == kullanmış olduğumuz çift eşittir ilgili Os familye uyuyorsa kendi kurulum paketini kullanarak kurulumu yap demiş oluyoruz. OR operatorunu kullanarakta ekstra detay verebiliriz and ile şu koşulu da içeren diye ek bilgi tanımlayabiliriz.

Koşulu döngü ile tanımlarsak,

---
- name: Install softwares
  hosts: all
  vars:
     packages:
       - name: nginx
         required: True
       - name: mysql
         required: True
       - name: apache
         required: False

   tasks:
   - name: Install "{{item.name}}" on debian
     apt:
        name: "{{item.name}}" 
        state: present
      when: item.required == true
      loop: "{{ packages }}"

Arka planda loop işlemi aşağıdaki adımları nginx, mysql ve apache için tek tek yapacak.

- name: Install "{{ item.name }}" on Debian
  vars:
   item:
     name: nginx
     required: true
   apt:
     name: "{{ item.name}}
     state present

Register Koşulu

Ortamımızda sunucularda belirtilen servisin durumunu sorgulayıp eğer servis çalışmıyorsa mail atması için koşul yazalım.

- name: Check status of a service and email if its down
  hosts: localhost
  tasks:
     - command: service httpd status
       register: result

     - mail:
       to: admin@company.com
       subject: Service Alert
       body: Httpd service is down
       when: result.stdout.find('down') != -1

Örneklere bakalım,

Verilen Playbook, all_servers’da mysql hizmetini başlatmaya çalışır. Ana bilgisayar (ansible_host) veritabanı sunucusuysa, bu görevi çalıştırmak için when koşulunu kullanalım.

Mevcut:

# We have created a group for web servers. Similarly create a group for database servers named 'db_servers' and add db1 server to it
# --------------------------------
# Sample Inventory File

# Web Servers
web1 ansible_host=server1.company.com ansible_connection=ssh ansible_user=root ansible_ssh_pass=Password123!
web2 ansible_host=server2.company.com ansible_connection=ssh ansible_user=root ansible_ssh_pass=Password123!
web3 ansible_host=server3.company.com ansible_connection=ssh ansible_user=root ansible_ssh_pass=Password123!

# Database Servers
db1 ansible_host=server4.company.com ansible_connection=winrm ansible_user=administrator ansible_ssh_pass=Password123!

[web_servers]
web1
web2
web3

[db_servers]
db1
-
    name: 'Execute a script on all web server nodes'
    hosts: all_servers
    tasks:
        -
            service: 'name=mysql state=started'

Cevap:

# We have created a group for web servers. Similarly create a group for database servers named 'db_servers' and add db1 server to it
# --------------------------------
# Sample Inventory File

# Web Servers
web1 ansible_host=server1.company.com ansible_connection=ssh ansible_user=root ansible_ssh_pass=Password123!
web2 ansible_host=server2.company.com ansible_connection=ssh ansible_user=root ansible_ssh_pass=Password123!
web3 ansible_host=server3.company.com ansible_connection=ssh ansible_user=root ansible_ssh_pass=Password123!

# Database Servers
db1 ansible_host=server4.company.com ansible_connection=winrm ansible_user=administrator ansible_ssh_pass=Password123!

[web_servers]
web1
web2
web3

[db_servers]
db1
-
    name: 'Execute a script on all web server nodes'
    hosts: all_servers
    tasks:
        -
            service: 'name=mysql state=started'
            when: 'ansible_host=="server4.company.com"'

Playbookta tanımlanmış bir yaş değişkeni var. Ben bir çocğum veya bir Yetişkinim diye çıktı veriyor. 18 den büyüksem ve küçüksem şartını tanımlayarak işlemi gerçekleştirelim.

Mevcut;

-
    name: 'Am I an Adult or a Child?'
    hosts: localhost
    vars:
        age: 25
    tasks:
        -
            command: 'echo "I am a Child"'
        -
            command: 'echo "I am an Adult"'

İstenen sonuç,

-
    name: 'Am I an Adult or a Child?'
    hosts: localhost
    vars:
        age: 25
    tasks:
        -
            command: 'echo "I am a Child"'
            when: 'age < 18'
        -
            command: 'echo "I am an Adult"'
            when: 'age >= 18'

Verilen Playbookta, name sunucusu için /etc/resolv.conf dosyasına bir veri girişi eklemeye çalışır.

İlk olarak /etc/resolv.conf dosyasının içeriğini almak için shell modülünü kullanarak bir komut çalıştırıyoruz ve ardından dosyaya name server datasını içeren yeni bir satır ekliyoruz. Ancak, playbook birden çok kez çalıştırıldığında, resolv.conf dosyasına aynı satırın yeni girişlerini eklemeye devam eder.

İlk komutun çıktısını command_output değişkenine depolamak için bir kayıt yönergesi ekleyin

Ardından, çıktının zaten ad sunucusunu (10.0.250.10) içerip içermediğini kontrol etmek için ikinci komuta bir koşul ekleyin. command_output.stdout.find() == -1 kullanın

-
    name: 'Add name server entry if not already entered'
    hosts: localhost
    tasks:
        -
            shell: 'cat /etc/resolv.conf'
        -
            shell: 'echo "nameserver 10.0.250.10" >> /etc/resolv.conf'

İstenilen çıktımız,

-
    name: 'Add name server entry if not already entered'
    hosts: localhost
    tasks:
        -
            shell: 'cat /etc/resolv.conf'
            register: command_output
        -
            shell: 'echo "nameserver 10.0.250.10" >> /etc/resolv.conf'
            when: 'command_output.stdout.find("10.0.250.10") == -1'

Bir yanıt yazın

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