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'