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'