Ansible 101 - nasıl otomasyon yapabiliriz?
Ansible eğitimi içersinde aşağıdaki konular işlenecektir:
0. Ansible eğitimi
Bu eğitim ile aşağıdaki konularda bilgi alacaksınız
- Ansible otomasyon eğitimi
Konfigürasyon yönetim sistemleri, yöneticiler ve operasyon ekipleri için çok sayıda sunucuyu kontrol etme sürecini kolaylaştırmak üzere tasarlanmıştır. Tek bir merkezi konumdan otomatik bir şekilde birçok farklı sistemi kontrol etmenize olanak tanırlar.
Chef ve Puppet gibi Linux sistemleri için pek çok popüler yapılandırma yönetimi aracı bulunsa da, bunlar çoğu insanın istediğinden veya ihtiyaç duyduğundan genellikle daha karmaşıktır. Ansible, bu seçeneklere harika bir alternatiftir çünkü yönetilecek sunuculara özel bir yazılımın kurulmasını gerektirmeyen, otomasyon görevlerini yürütmek için SSH’yi ve provizyon ayrıntılarını tanımlamak için YAML dosyalarını kullanan bir mimari sunar.
Bu kılavuzda, Ansible’ın Alpine Linux sunucusuna nasıl kurulacağını göstereceğiz (Ubuntu için apt paket yöneticisi komutları kullanılır) ve bu yazılımın nasıl kullanılacağına dair bazı temel bilgileri gözden geçireceğiz. Konfigürasyon yönetim aracı olarak Ansible’a daha ileri konuları işlemek için internetteki farklı makaleleri kullanabilirsiniz. Eğitimimizin amacı temel bilgileri vermek ve sizin bir başlangıç yapmanızı sağlamaktır.
Ansible konfigürasyon yönetimi ile binlerce sunucuyu tek bir merkezden kolaylıkla yönetebilirsiniz. Sunucular üzerindeki paketlerin yönetilmesini ve senkron bir şekilde istediğiniz tüm oparasyonları yapabilirsiniz.
Örnek kullanımlar:
- Kullanıcı yönetimi ve SSH key yönetimi.
- Paket kullanımı ve yönetimi
- interaktif monitoring çözümleri ()
- Cloud sunucularını hazırlamak ve gerekli güvenlik sıkılaştırmalarını yapmak
Ortamınızda yüzlerce sunucu varsa mutlaka bir otomasyon çözümü kullanmalısınız, aksi taktirde aşağıdaki gibi komutlar yazmaya başlarsınız ve durum yönetilebilir olmaktan çıkar.
# ssh for s in server{1..4}.acikkaynakfikirler.com do ssh senol@${s} 'bash -s' < /home/senol/deneme.sh son
veya tmux ile paralel bağlantılar kurmaya başlarsınız. Otomasyon kullanmanız durumunda, yönetilebilir bir şekilde çalıştırdığınız komutları merkezi bir yerde tutabilirsiniz ve değişiklikleri kolaylıkla takip edebilirsiniz.
1. Ortamın tanıtılması
Sağ tarafta 2 tane temsili sunucumuz var
Bu sunucularımız sırasıyla aşağıdaki özelliklere sahip sunuculardır.
web sunucusu(üstteki)
(temsili) web hizmetleri çalışan sunucu
ansible ile sunucu üzerine apache ve php paketlerini kuracağız
otomasyon sunucumuz (alttaki)
yukarıdaki iki sunucuyu yöneteceğimiz ana sunucu
Ansible kurulumu için ihtiyacımız olan uygulamalar.
- ansible merkezi sunucusu (en altta duran sunucu)
- sunucuların üzerinde ssh servisi ile erişilebilirlik
- ssh keylerinin parolasız erişim için konfigüre edilmesi
2. Sunucuların hazırlanması
Web sunucusunun hazırlanması için aşağıdaki komutları çalıştırmalısınız (Üzerini tıklarsanız kurulum gerçekleşir)
!!! Aşağıdaki sunucuların kurulumlarını tek tek yapın lütfen, web sunucusunun kurulumu bittikten sonra dosya paylaşımı sunucusu sonra da otomasyon sunucusu kurulumunu yapın
1. Web sunucusu hazırlanıyor
şimdi ssh anahtarları oluşturalım ve host ismini ayarlayalım
ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa <<< y
bash
clear
Ansible (otomasyon) sunucusunun hazırlanması için aşağıdaki komutları çalıştırmalısınız (Üzerini tıklarsanız kurulum gerçekleşir)
2. Otomasyon için kullanacağımız sunucu hazırlanıyor
şimdi ssh anahtarları oluşturalım ve host ismini ayarlayalım
ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa <<< y
bash
clear
Normal şartlar altında yukarıda bahsettiğimiz işlemleri siz kendi ortamınızda farklı şekillerde gerçekleştirirsiniz. AWS üzerinden sunucular oluşturabilirsiniz, Vmware üzerinde veya KVM üzerinde yeni sunucu oluşturabilirsiniz. Bu sunuculara ip tanımlayıp sunucuların hostlarını tanımlamanız gerekmekte.
Varsaydığımız durum 3 tane sunucu üzerine ssh servisi çalışır durumda, bundan sonra ansible ile ilgili ayarlamaları yapacağız.
3. Ayarlamalar (Ansible konfigürasyonu)
Ansible kullanımının en büyük kolaylığı, yöneteceğiniz sunucular üzerine herhangi bir paket kurmanıza ihtiyaç olmamasıdır. Yani ansible kurulumu sadece otomasyon sunucusu üzerine yapılacaktır.
eğitim içerisinde ubuntu üzerindeki ansible paket kurulumunu işledik, bunun dışında çok kurulum şekilleri mevcuttur. pip ile kurulum veya repository üzerinden paket kurulumu gibi seçenekler de vardır.
apk add ansible
clear
a. Sunucuların IP adreslerini almak
web
sunucusunun ip adresini almak için aşağıdaki komutu çalıştırın
ip a|grep eth0
çıktı olarak aşağıdaki gibi bir satır gelecektir,
örn. inet 10.0.152.2/24 brd 10.0.152.255 scope global eth0
Çıkan sonuç içersindeki örn. 10.0.152.2 aradığımız ip adresidir.
şimdi bulduğumuz iki ip adresini otomasyon sunucusu üzerinde tanımlıyoruz.
mkdir /etc/ansible
cat << EOF >> /etc/ansible/hosts
##
web ansible_host=10.0.152.3
#dosya ansible_host=10.0.152.4
EOF
yukarıdaki komutu çalıştırıp "vi /etc/ansible/hosts" dosyası içinde gerçek ip bilgilerini güncelleyebilirsiniz.
ayrıca diğer bilgisayarları isimleri ile kullanabilmek için /etc/hosts
dosya`sı içersine de eklemeliyiz.
cat << EOF >> /etc/hosts
##
10.0.152.3 web
#10.0.152.4 dosya
EOF
b. Sunuculara SSH erişimi sağlamak
sunucuların üzerinde ssh keyler “ssh-keygen” komutu ile oluşturuldular. Bulunduğunuz home dizinin içersinde .ssh isminde bir klasörde id_rsa ve id_rsa.pub isminde iki tane dosya oluştu. Bu dosyalardan pub ile biten dosya bizim paylaşabileceğimiz key dosyasıdır, id_rsa dosyasının içinde ise kimseyle paylaşmamamız gereken anahtar bilgisi vardır.
Otomasyon sunucusu üzerindend diğer sunucuları yöneteceğimiz için otomasyon sunucumuzun public ssh anahtarını diğer sunucuların ~/.ssh/autherized_keys dosyası içine kopyalamamız gerekiyor.
Otomasyon sunucusu içinde ssh-keygen çalıştırarak id_rsa ve id_rsa.pub dosyaları oluşturulur. Daha sonra id_rsa.pub içeriği diğer bilgisayarlara (Dosya, Web) ~/.ssh/authorized_keys dosyası içersine bir satır olarak kopyalanır.
cat /root/.ssh/id_rsa.pub
yukarıda cat ile görüntülediğimiz paylaşılmış anahtar bilgisini diğer sunucularımıza kopyalıyoruz
Paylaşılan anahtar bilgisini web sunucusu üzerine kopyalayalım
echo "ssh-rsa AAAA......" >> ~/.ssh/authorized_keys
yukarıdaki komutu çalıştırıp vi ~/.ssh/authorized_keys yaparak dosyanın içindeki satıra doğru key bilgisini girebilirsiniz
şimdi otomasyon sunucumuz üzerinden diğer sunuculara ssh üzerinden erişmeye çalışalım
web sunucusunda hostname dosyasını görüntüleyelim (YUKARIDAKI TERMINALDEKI IP ADRESINI YAZIN)
ssh WEB-IP-ADRESI cat /etc/hostname
(ssh key known-hosts dosyasına eklenecektir y harfine basıp onaylayabilirsiniz)
(ssh key known-hosts dosyasına eklenecektir y harfine basıp onaylayabilirsiniz)
4. Sunucuların üzerinede komut çalıştırmak
a. sunuculara erişimi ansible üzerinden kontrol edelim
burada ansible sonrası yazılan all
komutu /etc/ansible/hosts dosyası içindeki tüm sunucularda komutu çalıştır anlamına gelmektedir. -m
modül tercihi anlamına gelir, burada ping modülü kullanılmış. -u root
ise, isminden de tahmin edilebileceği gibi komutları root kullanıcısı olarak çalıştır anlamına gelir.
ansible all -m ping -u root
gördüğünüz çıktı 1 sunucuya erişebildiğimizi erişemediğimizi gösteriyor. (erişemediğmiz sunucular olursa, sarı olarak çıktı gelmeyen sunucuların bilgisini görebilirsiniz).
b. sunucular üzerinde “df -h” komutunu çalıştıralım
-a
parametresi ad-hoc (özel amaçlı, tek kullanımlık) kullanmak içindir. Yani yazdığınız komut direkt olarak sunucularda çalışacaktır.
ansible all -a "df -h" -u root
c. Ansible playbook kullanımı
Bu konuyu anlayabilmemiz için imperative ve declarative komut çalıştırmanın ne olduğunu bilmemiz gerekiyor. Şimdiye kadar çalıştırdığımız komutlar imperative komutlardı, yani komut satırında yazdığımız komutlar içinde gerekli tercihleri yaparak komutları çalıştırdık. Declarative tanımlar ise dosyaların içine kaydedilmiş konfigürasyon tercihleri çalıştırılarak yapılır.
Ansible içersinde yaml veya json formatlı dosyalar kullanarak deklarasyon yapabilirsiniz. Ansible için çoğunlukla .yaml
dosya formatı ile tnaımlanmış configürasyon dosyaları kullanılır.
Aşağıda declarative configürasyon için web sunucusu için bir örnek görebilirsiniz.
cat <<EOL> web-ornek.yaml
---
- name: Ansible basit Playbook ornegi
gather_facts: True
hosts: web
tasks:
- name: Sunucular uzerindeki disk doluluk
shell: df -h
- name: ihtiyaca gore paket kurulumu web (apache)
apk:
name: ['apache2']
update_cache: true
state: present
EOL
ubuntu paketleri için apt paket yükleyicisini kullanın. Bu örnekte Alpine sunucu kullanılmıştır ve apk ile paket yülnemiştir.
burada gather_facts
, bağlanılan sunucu üzerindeki duruma ilişkin bilgilerin toplanmasını/toplanmamasını belirtir. hosts
hangi sunucularda bu playbook’un çalıştırılacağını belirtir. (üstteki)name
playbook açıklamasını belirtir. taks
, çalıştırılacak görevlerin listesini içerir, yine name
çalıştırılacak görevin açıklaması, sonraki kısımda ise shell
veya ping
gibi modüller kullanılacak modülleri belirtir. Örnek içersinde apk
modülü kullanılmıştır
buradaki dosyaları çalıştırmak ve komutları uygulamak için aşağıdaki şekilde komutları çalıştırabilirsiniz.
web sunucusu için
ansible-playbook web-ornek.yaml
Burada yazdığımız modül içerinsde apk
modülünü kullandık, bu modülü kullanmak yerine shell
modülünü kullanıp komut satırından yazacaklarımızı doğrudan playbook içersine yazabiliriz.
web-ornek.yaml dosyasına alternatif olarak aşağıdaki komut yazılabilir
cat <<EOL> web-ornek-komut-ile.yaml
---
- name: Ansible basit Playbook ornegi
gather_facts: True
hosts: web
tasks:
- name: ihtiyaca gore paket kurulumu web sunucusu (apache2)
shell: apk add apache2
EOL
web alternatif kurulum için
ansible-playbook web-ornek-komut-ile.yaml
gödüğünüz gibi komut satırı bilgisini shell
modülüne direkt verebiliyoruz, böylece sunucuya bağlanıp çalıştırmış oluyoruz. Burada apk
modülünü kullanmadığımız için, bize sağladığı olanaklardan (güvenlik, sonuç çevirme, hata ayıklama gibi) faydalanamıyoruz.
Farklı modül ve komutlar için daha güncel bir listeye buradan erişebilirsiniz.
ad-hoc Komutunun sunucularda nasıl çalıştığını gösterilmesi
Şöyle bir senaryo çalıştıralım, ilk iki sunucu içersinde bir dosyanın durumunu watch
ve cat
komutları ile sürekli gösterelim, ansible ile bu dosyaları değiştirdiğimizde otomasyon sisteminin çalışmasını daha net bir şekilde görmüş oluruz.
önce bu komutu web sunucusunda çalıştıralım
watch -n1 cat /tmp/DURUM
şimdi otomasyon sunucusu üzerinden web sunucusuna dosya oluşturma komutu gönderelim.
ansible all -a "touch /tmp/DURUM" -u root
şimdide içlerine istediğimiz şeyleri yazalım.
ansible all -a "cp /etc/hostname /tmp/DURUM" -u root
Bundan sonra öğrenmeye devam etmek, ve daha fazla konu işlemek isterseniz buradaki link üzerinden devam etmenizi tavsiye ederim.
Açık Kaynak Fikirler - Ana Sayfa
Konu tekrarı, kısa sınav
seçeneklerden doğru olanları seçtikten sonra Gönder butonuna basınız. Sonuçları doğru ve yanlış görebilirsiniz.
Aşağıdaki komutlardan hangisi ile ssh anahtarı oluşturabilirsiniz? (pub ve key dosyaları)
- (x) ssh-keygen
- ( ) ssh
- ( ) ssh » ~/.ssh/authorized_keys
- ( ) ssh-keygen > .ssh/id_rsa
Aşağıdaki hangi klasör ssh anahtarlarının varsayılan dizinidir?
- ( ) .ssh/
- (x) ~/./ssh
- ( ) /root/.ssh/
Yönetilen sunucuların ip bilgileri hangi dosya içersinde bulunur?
- ( ) /etc/hosts
- (x) /etc/ansible/hosts
- ( ) web-ornek.yaml
Aşağıdaki komutlardan hangisi declarative komutlara bir örnektir?
- ( ) ansible all -a “df -h” -u root
- ( ) ansible all -a “apt update&&apt install apache2 -y” -u root
- (x) ansible-playbook -i /etc/ansible/hosts web-uninstall.yaml
- ( ) ansible all -a “apt update&&apt remove apache2 -y” -u root