Bir süredir Chef, Puppet gibi konfigürasyon yönetim sistemlerini biliyordum ama açıkçası, lazım olmadıkça kullanmamıştım. Niye ise dilleri bana çok sıcak gelmiyordu. Öğrenmesi bana göre oldukça zor. Halen okuyunca içim daralıyor 🙂  Belki vakti ile Python ile çokça haşır neşir olmamdan, Ansible ile alakalı birkaç şey okuyunca meraklandım. Özellikle konuyu basitleştime hedefi nedeni ile cazip bir seçenek gibi görünüyor. Okuduklarımı, tecrübe ettiklerimi burada paylaşacağım.

AnsibleLogo_transparent_web

Ansible, ssh üzerinden sunucularınızda, playbook denen iş dosyalarını koşarak, konfigürasyon yönetimini otomasyona döken bir yazılım çatısı. Yöneteceğiniz sunucuda herhangi bir istemciye ihtiyacınız yok. Ssh erişiminiz varsa, sunucuyu Ansible ile yönetebilirsiniz. Playbooklar basit ve temiz yaml dosyalarından başka birşey değil. Bu nedenle okuması kolay. Bilmeyen biri bile bu dosyaları okuyunca mevzu nedir anlayabiliyor.

Kurulum kısmı apt ve yum ile yapılabiliyor. Ama ben en son versiyonu takip edebilmek için python paket yöneticisi pip ile kuracağım. Bu yazı yazılırken pip deki son süürm 1.7.2 idi. Pip yoksa sisteminizde aşağıdaki şekilde kurabilirsiniz.

curl https://bootstrap.pypa.io/get-pip.py | python -

Sonrası tahmin edebileceğiniz gibi

pip install ansible

Ansible hostları hosts adlı bir ini konfig dosyasında tutar. Bu dosyada sunuculara erişim için gerekli bilgileri yazıyoruz. En basitinden ip adresi ya da fqdn yazmalı. Varsayılan olarak bu dosya /etc/ansible/hosts da bulunur. Örnek bir hosts dosyası şu şekilde olabilir.

mail.volkanoransoy.com

[webservers]
web1.volkanoransoy.com
192.168.1.10

[dbservers]
db.volkanoransoy.com

Ben localhost üzerinde işlem yapacağım için kendi sunucumun ip adresini yazdım. Şimdi ilk komutumuzu gönderelim.

[root@localhost ~]# ansible all -m ping -u root -k
SSH password:
192.168.147.35 | success >> {
"changed": false,
"ping": "pong"
}

Ansible iki modda çalışmakta. Birisi yukarıdaki komut ile yaptığımız gibi, koşacağımız modülü ve argümanlarını vererek tek satırda (Ad hoc) ya da playbook dediğimiz iş dosyaları ile. Ping adlı modül aradaki bağlantının olup olmadığını test etmemizi sağlıyor. All dediğimiz için inventory dosyamız olan hosts dosyamızdaki her host için çalıştırdı. Ben bir adet host yazdığım için çıktı bir tane. Ansible gücünü ping gibi modüllerden alır. Kendi dökümantasyonundan da görebileceğiniz gibi onlarca farklı iş için modülleri bulunmakta ve her versiyonda yenileri ekleniyor. İsterseniz kendi modülünüzü kendiniz da yazabilirsiniz. Şimdi sunucuda bir komut koşalım ve çıktısını alalım. Bu arada karşı sunucuya ssh keyimizi atarsak -k kullanmadan ve şifre girmeden işlem yapabiliriz. Bundan sonrasında ssh keyimi atarak devam edeceğim.

[root@localhost ~]# ansible all -m command -a "df -h" -u root
192.168.147.35 | success | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 50G 7.4G 43G 15% /
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 377M 3.5G 10% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/mapper/centos-home 198G 33M 198G 1% /home
/dev/sda1 497M 125M 373M 26% /boot

Modüller, yapacakları işe göre çalışırken ihtiyaçları olan argümanlara ihtiyaç duyarlar. Burada command modülüne -a ile ihtiyacı olan argümanı verdik. Şimdi bir paket kuralım sisteme.

[root@localhost ~]# ansible all -m yum --args "name=htop state=installed" -u root
192.168.147.35 | FAILED >> {
"changed": false,
"failed": true,
"msg": "No Package matching 'htop' found available, installed or updated",
"rc": 0,
"results": []
}

Htop kurmaya çalıştım ama patladı. Çünkü repoda paketi bulamadı. Failed çıktısı ve beraber gelen json çıktı ile komutun sonucuna ait her bilgiyi kolayca alabiliyoruz. O zaman başarılı bir paket kurulumu yapalım ve farkı görelim.

[root@localhost ~]# ansible all -m yum --args "name=mariadb state=installed" -u root
192.168.147.35 | success >> {
"changed": true,
"msg": "",
"rc": 0,
"results": [
"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: ftp.linux.org.tr\n * extras: ftp.linux.org.tr\n * updates: ftp.linux.org.tr\nResolving Dependencies\n--> Running transaction check\n---> Package mariadb.x86_64 1:5.5.37-1.el7_0 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package Arch Version Repository Size\n================================================================================\nInstalling:\n mariadb x86_64 1:5.5.37-1.el7_0 updates 8.9 M\n\nTransaction Summary\n================================================================================\nInstall 1 Package\n\nTotal download size: 8.9 M\nInstalled size: 49 M\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Installing : 1:mariadb-5.5.37-1.el7_0.x86_64 1/1 \n Verifying : 1:mariadb-5.5.37-1.el7_0.x86_64 1/1 \n\nInstalled:\n mariadb.x86_64 1:5.5.37-1.el7_0 \n\nComplete!\n"
]
}

Tek komut ile karşı sunucuda temiz bir şekilde işlem yapabiliyoruz artık. Dosya işlemleri, kullanıcı işlemleri, servis yönetimi, ağ işlemleri ve daha nicesini, Ansible modülleri ile bu şekilde yapabiliyoruz. Ad hoc komutlar bizim gündelik işlerimizi temiz bir dil ile standart bir yolla yapmamızı sağlar. Daha kompleks, birkaç adımda yapılması gereken işler için Ansible bize playbookları sunuyor. Playbook, ansible’a hangi işi, hangi argüman ve hangi sıra ile yapacağını belirten bir iş dosyasıdır. Anlatmanın en kolayı örnek bir playbook üzerinden gitmek. Aşağıdaki örnek Ansible dökümantasyonundan.

---
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running
    service: name=httpd state=started
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

Biraz dikkat edilirse aslında tamamen kendini anlatan bir yapısı var. Hosts direktifi ile playbook hangi hostlarda koşulacak, karar veriyoruz. Vars, tahmin edebileceğiniz gibi playbook içinde değişkenler tanımlıyor. Remote_user, karşıda hangi kullanıcı ile işlem yapılacağını belirtmekte. Tasks kısmında sırası ile yapılmasını istediğimiz işleri listeliyoruz. Burada Ansible modüllerini ve ihtiyaç dutdukları argümanları yazıyoruz. Örneğin template modülü, /srv/httpd.j2 olarak bulunan jinja template dosyasında, bir önce tanımladığımız değişkenler ile işleyerek /etc/httpd.conf dosyasını oluşturuyor.Bir modül çalışmasını bitirince yapılmasını istediğimiz işlemleri notify kısmında belirtiyoruz. Bu örnekte, handlers altında belirttiğimiz restart apache fonksiyonu kullanılıyor. Handlers kısmını bir fonksiyon gibi düşünebiliriz. Playbook çalışırken istediğimiz noktadan, istediğimiz kadar çağırabileceğimiz sıralı işlerdir. Jinja template kısmı, daha önce django kullanmış olanlara yabancı gelmez. Aslında oldukça basittir. Bu örnek için aşağıda jinja template örneği aşağıdaki gibi olabilir.

...

StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients {{ max_clients }}
MaxRequestsPerChild 0

...

Burada max_clients kısmı, bizim belirlediğimiz değişkenin içeriği ile değiştirilecektir. Bu playbook şu şekilde çağrılabiliyor.

[root@localhost ~]# ansible-playbook example.yml -u root

PLAY [webservers] *************************************************************

GATHERING FACTS ***************************************************************
ok: [192.168.147.35]

TASK: [ensure apache is at the latest version] ********************************
changed: [192.168.147.35]

TASK: [write the apache config file] ******************************************
changed: [192.168.147.35]

TASK: [ensure apache is running] **********************************************
changed: [192.168.147.35]

NOTIFIED: [restart apache] ****************************************************
changed: [192.168.147.35]

PLAY RECAP ********************************************************************
192.168.147.35 : ok=5 changed=4 unreachable=0 failed=0

Recap kısmında failed yoksa işlemimiz tamam demektir.

Playbook kısmına gelince, işin içine handlers, facts, variables, roles gibi farklı mavzular girdiği için işler karmaşıklaşıyor. Ancak bu kavramlar oturunca oldukça güçlü bir araç olduğunun farkına vardım. Sabırla dökümantasyon okumama sıkıntım, Ansible’ın kullanımındaki en büyük engel sanırım 🙂 Bunun haricinde, sıkça yapılan görevleri ansible’a devretmekte bir sakınca göremiyorum.

Kaynakça ve linkler:

Nedir bu Ansible?

One thought on “Nedir bu Ansible?

Leave a Reply

Your email address will not be published. Required fields are marked *