Ansible Ad-hoc Nedir?

Ansible ad hoc komutu , bir veya daha fazla yönetilen düğümde tek bir görevi otomatikleştirmek için /usr/bin/ansible komut satırı aracını kullanır. ad hoc komutlar hızlı ve kolaydır, ancak yeniden kullanılamazlar. Öyleyse neden önce geçici komutları öğrenelim diyebilirsiniz, ancak ad hoc komutlar, Ansible'ın basitliğini ve gücünü gösterir. Burada öğrendiğiniz kavramlar doğrudan playbook diline aktarılacaktır.
Ansible ad-hoc için resmi döküman sayfasına bakınız:
https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html
ansible ad-hoc kullanımı
Ansibleyi iki şekilde kullanabiliriz. ad-hoc ve playbook. Her işlemi yapmak için playbook yapmamıza gerek yoktur. Direk komut satırından işlemleri ad-hoc ile yapabiliriz. Ancak, uzun işlemler için playbook yazmamız gerekmektedir. İlk olarak ad-hoc komutları kullanalım. Biraz önce ansible envanter ihtiyacını karşılamış olduk. Şimdi tüm sunucularda bir ping işlemi başlatarak ufak bir test yapalım. Unutmayın bu bir modüldür. Normal ping işlemi yapmak yerine ssh bağlantınızı test edecektir. Bu kısımda dikkat etmeniz gereken bir önemli bir durum var. Komutları ansible dizinini içinde çalıştırıyorum. Aksi halde ansible varsayılan dosyaları okuyacaktır.
ansible all --key-file ~/.ssh/id_ed25519 -i inventory -m ping
- Yukarıdaki komut satırında sırasıyla bakarsak,
- neyi kullanacağı | ansible
- kim için | all | tüm sunucularda
- ne kullanarak | key-file | private key dosya yolu
- kullanacağın envanter | -i | envanter dosya yolu
- kullanacağın modül | -m | ping modülü

Biraz önce ping modülünü kullandık. Tabiki her seferinde böyle uzun komut satırlarını çalıştırmamıza gerek yoktur. Ansible çalışmadan önce varsayılan /etc/ansible/ansible.cfg konfig dosyasını okur ve bunun içindeki tanımları çalıştırır. Biz varsayılan konfig dosyası yerine kendi dizinimizde konfig dosyası oluşturalım ve komut satırını daha kullanışlı hale nasıl getirebileceğimize bakalım.
cd ~/ansible
vi ansible.cfg

Dosyamızı editör ile açtıktan sonra bir kaç değişken tanımlayalım. İlk olarak defaults tanımını yazarak, ansiblenin varsayılan konfigürasyon dosyası olarak oluşturduğumu dosyayı görmesini sağlıyorum. Görselde rahatlıkla anlaşılacağı gibi, envanter dosya adımı ve private key dosyamın yolunu belirtiyorum. Bu sayede komutları yazarken bu kısımları yazmamıza gerek kalmayacak.
[defaults]
inventory = inventory
private_key_file = ~/.ssh/id_ed25519

Dosyayı kayıt edip çıkalım.
:wq!
ansible ping modülü
Ansible dizini içindeyken, tanımladığım değişkenleri komut satırından çıkararak tekrar ping modülünü çalıştırıyorum. Sürekli ansible dizininde çalıştırmamızın sebebi, varsayılan yerine bizim konfigürasyon dosyamızı okumasını istediğimiz içindir.
ansible all -m ping

Çıktılar json formatında olduğu için bazen okuması zor olabiliyor. -o parametresi ile sonuçları daha okunaklı hale getirebiliriz.

tarih ve saat ayarları
Sürekli bir modül kullanmamıza gerek yoktur. İstersek komut çalıştırabiliriz. Yani bildiğimiz komut satırından kullandığımız komutlar. Tarih ve saat bizim için çok önemlidir. Yüzlerce sunucunuz olduğunu düşünün, bunlara tek tek girip bakmak veya düzeltmek hem yönetilemez hale gelir ve iş yükümüzü arttırır.
ansible all -m command -a "date" -i inventory

Yukarıdaki örnekte olduğu gibi, sunucunun bir tanesi Coordinated Universal Time (UTC) zamana ayarlı olduğu için Türkiye'nin 3 saat gerisinde kalmıştır. Şimdi timezone ayarlamak için timedatectl komutu kullanıyorum. Bu ayarları yaparken sadece apt grubunu seçiyorum ki diğer sunuculara komut satırı çalışmasın. Ek olarak timezone değiştirmek için yetki gerektiği için --become parametresini kullanmam gerekmektedir. Parola kısmına değişiklik yapacağımız sunucu parolasını girmemiz gerekmektedir. İlgili kullanıcının yetkili bir kullanıcı olması gerektiğini unutmayınız.
ansible apt -m command -a "timedatectl set-timezone Europe/Istanbul" -i inventory --become -K

yeniden başlatma ve kapatma
Sonuç olarak, bir konfigürasyon dosyası oluşturduk. Oluşturduğumuz konfigürasyon dosyasındaki değişkenleri ansible okudu ve çalıştırdı. Playbook'lara geçmeden önce kafamızda oturması adına bir kaç örnek daha yapalım. Şimdi ise apt grubundaki sunucuları yeniden başlatmayı deneyelim. Sunucuda yeniden başlatma yapacağım için, yine yetki almamız gerekmektedir.
İstediğiniz sunucuyu kapatmak için /sbin/shutdown komutunu kullanın.
ansible apt -a "/sbin/reboot" --become -K

uptime
Herhangi bir uzak sunucudan çalışma süresine bakalım. Unutmayın, belirli bir sunucu veya grup seçebilirsiniz.
ansible 10.106.250.71 -m command -a "uptime" -o

Paket Yükleme
Şimdi ise tüm sunucularda apt paket yöneticisini kullanarak bir uygulama yükleyelim. Apt paket yöneticisi tüm dağıtımlarda olmadığı için, diğer dağıtımlarda hata verecektir. Zaten amacımız hatayı görmekti, bu sayede envanter içinde gruplara ayırmanın faydasınıda görmüş olduk. Bu işlem ile var olan paket sürümünü yükseltmeyecektir.
ansible all -m apt -a name=htop --become -K

Çıktıları incelediğimiz zaman, uygulamanın yüklendiğini görebiliyoruz.

Komut çıktısını tekrar yürüttüğüm zaman, changed kısmında false yazdığını görebiliriz. Yani herhangi bir değişiklik yapılmadı.

Son olarak uzak sunucu üzerinde apt loglarınada bakalım. X kullanıcısı, başlama saati hangi paketin yüklendiğini görüp doğrulamış oluyoruz.
tail -5 /var/log/apt/history.log

Paket Yükseltme
Biraz önce apt ile paket yüklerken, paketin son sürüme yükseltilmeyeceğini söylemiştim. İlk olarak uzak sunucu üzerinde yükseltilecek bir paket varmı ona bakalım. Bu sefer grup yerine belirli bir sunucuyu seçiyorum.
aansible 10.106.250.71 -m command -a "apt list --upgradable" -o

Liste içini grep ile filtreleyebilirsiniz. İncelediğimiz zaman, rsync aracının yükseltilebileceğini gördük, ilk olarak yukarıdaki paket yükleme komutunu çalıştırıyorum. Bu komut satırını çalıştırdığımda sürümün yükselmediğini görüyorum.
ansible 10.106.250.71 -m apt -a name=rsync --become -K
Şimdi ise paketin en son sürümünü yüklemek için state=latest parametresi ekleyerek son sürümleri yükleyebilirsiniz.
ansible a10.106.250.71 -m apt -a "name=rsync state=latest" --become -K


tüm paketlerin güncellenmesi
Yine güzel özelliklerden bir tanesi olan tüm paketlerin tümünü nasıl güncelleyeceğimize bakalım. Eklediğiniz sunuculara göre bu işlemin uzun süreceğini unutmayın.
ansible all -m apt -a upgrade=dist --become -K

Artık örneklere bakarak ihtiyacınız olan işlemleri gerçekleştirebilirsiniz.