Category Archives: Ansible
Python six module 1.5.2 cause project creation Openstack with Ansible
Issue is : Getting an error when try to create project with ansible in Openstack
Error is : fatal: [localhost]: FAILED! => {“changed”: false, “failed”: true, “invocation”: {“module_name”: “os_project”}, “parsed”: false}
This is what version Ubuntu i have
noroot@acc:~/ansible$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.3 LTS
Release: 14.04
Codename: trusty
Solution is : remove six.py from /usr/lib/python2.7/dist-packages/ , download 1.10.0 from pypi and put the six.py
VM
Esitliklerle Ansible – Variables/Degerler Kontrol ve Moduller
Degiskenler , her yazilimi dilinde oldugu gibi playbook icersinde, Inentory icersinde birtakim degiskenler kullanma ihtiyacimiz olacaktir.
Ansible ile once dogru degisken nasil kullanilmali ona bakalim ;
- degisken1 –> olur
- degisken_1 –> olur
- 1234 –> olmaz, rakamla baslayamaz
- ahmet abi –> olmaz, bosluk yok
- en.guzel –> olmaz
- Birde python ile gelistirildiginden kullandiginiz key’ler python rezerve edilmis ozel anlamli seyler olmazin mesela –> islower , split , encode gibi gibi , aksi taktirde olasi bir degiskene erisimde eger “.” notasyonu kullaniyorsaniz problem yaratacaktir
Inventory ve Variables
Buna en guzel ornek gurupladigimiz hostlar olabilir , ornegin
noroot@ansible:~$ cat /etc/ansible/hosts
[testsunucular]
sunucu1 ansible_user=noroot
Mesela yukarida sunucu1 hostuna ansible_user degiskeni noroot olacak sekilde set edilmis
noroot@ansible:~$ cat /etc/ansible/hosts
[testsunucular]
sunucu1 ansible_user=noroot
sunucu2 ansible_user=noroot
[testsunucular:vars]
ntp_server_adresi=NTP1.ULAKBIM.GOV.TR
Yukarda ise tum testsunucular gurubuna uye olan sunucu1 ve sunucu2 icin ntp_server_adresi diye bir deger atadik bunu playbook’da kullanilabilir olacak.
Simdi bunu test etmenin kolay bir yolu var bir onceki makaledeki playbook a ufak bir eklenti yapalim , eklentiyi task altindaki ilgili name girdisinin altina ayni esitlikte koyalim, yani
—
– hosts: sunucu1
tasks:
– name: Apache kurulumuna baslayalim
apt: name=apache2 state=latest
become: yes
– debug: var=ntp_server_adresi
…
Cikti olarak asagidaki gibi gormeniz lazim
TASK [debug] *******************************************************************
ok: [sunucu1] => {
“ntp_server_adresi”: “NTP1.ULAKBIM.GOV.TR”
}
Playbook ve Variables
—
– hosts: sunucu1
vars:
cok_guzel: cidden_guzel
tasks:
– name: Apache kurulumuna baslayalim
apt: name=apache2 state=latest
become: yes
– debug: msg=”ilk deger ve ciktisi {{ntp_server_adresi}} sonrada ikinci deger ve ciktisi {{cok_guzel}}”
…
Yukarda cok_guzel diye bir degisken hazirladik , deger olarak cidden_guzel dedik yanliz burada Inventory de oldugu gibi esitlikle degil bir key/value cifti olarak girdik, vars key’i eger devam edilir ise bir array halinde birden fazla deger tutacak, ek olarak debug icinde farkli bir yazilim koyduk buraya, ekrana belirttigimiz mesaji donuyor.
Burada degiken illa cok_guzel: cidden_guzel seklinde degil, mesela dosya yolu ve kendisi olabilir ;
vars:
dosya_1: /etc/network-scripts/ifcfg-eth0
Degiskenler istenir ise disarida bir YAML dosyasi olarak yuklenebilir ;
- task disinda
- – hosts: sunucu1
- vars_files:
- – dosya_adi.yml
Burada dosya_adi.yml icersinde sadece asagidaki key/value degerini tutuyor olabilir
dosya_1: /etc/network-scripts/ifcfg-eth0
- task icinde
- include_vars: dosya_adi.yml
Istenir ise bir YAML dosyasi bir playbook’a include edilebilir , ornegin ;
– include : deneme.yml
Bu arada birde normalde programa dillerinde return ile bir fonksiyon veya class’in degerini nasil donebiliyorsaniz , buradada register ile ilgili komut ciktisini bir degiskene atayabilirsiniz, ornegin ;
-name Ben Kimim
command: whoami
register: ben_kimim_degiskeni
Bu arada calisan tum task icerindeki komutlar olumlu sonlayabilir bu durumda playbook durur , eger durmasini istemiyor iseniz ignore_errors: True degiskenini ilgili task altina koyabilirsiniz .
—
– hosts: sunucu1
tasks:
– name: Apache kurulumuna baslayalim
apt: name=apache2 state=latest
become: yes
ignore_error: True
– debug: var=ntp_server_adresi
…
Playbook interactive’de olabilir , disardan deger alabilir ve bunu size sorabilir ;
– name: Neyi kuralim usta ?
pause: prompt=”Paket Adi ne olacak ?”
register: paket_adi
Kontrol kismina gecmeden once “facts” olayindan basedelim , daha once yaptigimiz gibi komut satirina asagidaki gibi yazip calistirin.
noroot@ansible:~/playbooks$ ansible sunucu1 -m setup
veya
noroot@ansible:~/playbooks$ ansible sunucu1 -m setup -a ‘filter=ansible_distribution’
Size bir suru degisken ve degiskenlere karsilik degerler gelecek , iste bunlari playbook’da kullanabiliriz , mesela apache kurulumu yapacagiz ve ubuntu icin farkli centos icin farkli paket adlari mevcut bu durumda iste facts’leri kullanarak bu isi yapabiliriz mesela ;
- set_fact package_name=httpd
when: ansible_os_family == "Redhat"
- set_fact package_name=apache2
when: ansible_os_family == "Debian"
- name: Apache Kur Redhat
yum: name=httpd state=latest
when: ansible_os_family == "Redhat"
- name: Apache Kur Ubuntu
apt: name=apache2 state=latest
when: ansible_os_family == "Debian"
Not : Ubuntu -> Debian olarak gozukuyor ciktida
Bunla beraber istenir ise command prompt’da degerler set edilebilir , ornegin
noroot@ansible:~$ ansible/ansible-playbook localhost ……. –extra-vars “”package_name=apache2”
Ansible ile islem yaparken paralel islem yapabilirsiniz bunu icin -f 10 mesela ayni anda 10 islem yapilabilir , diyelim host dosyasina bir gurup altinda 10 sunucu koydunuz , calistirdginiz playbook 10 host da birden paralel calistirilabilir, varsayili deger 5
Ornek Birkac Modul Kullanimi ;
-
command: /sbin/shutdown -r now
-
raw: yum -y install vim-common
-
script: list_number_of_directories.sh /etc
-
shell: /bin/ls -l /tmp > /tmp/list
-
file: path=/etc/httpd/conf/httpd.conf owner=root group=root mode=0644
-
copy: src=test2.conf dest=/etc/test2.conf owner=root group=root mode=0644
-
git: repo=https://github.com/github/gitignore.git dest=/opt/gitignore
Tum Modullere http://docs.ansible.com/ansible/modules_by_category.html adresinden ulasabilirsiniz , inanilmaz.
Bu arada https://galaxy.ansible.com mutlaka ziyaret edin !
Ayni zamanda http://www.ansible.com/tower managed bu servisi kullanmak isteyenler icin
Esitliklerle Ansible – Playbook
Playbook = {
- Olayin kalbi
- Ansible’ye ne veya neleri calistiracagini soyluyor
- to-do list diyebiliriz
- her task bir module dedigimiz bir code tarafindan isleniyor
- module herhangi bir dille yazilmis olabilir
- YAML 🙂
- Birden fazla task olabilir ve bunlari ansible seri olarak calistirabilir
}
Konu gecmeden once YAML dogrulama icin http://yaml-online-parser.appspot.com bu link i kullanin
Ornek hosts
Burada hangi kullanici ile baglanabilecegini /etc/ansible/hosts dosyasinda belirttik
noroot@ansible:~/playbooks$ cat /etc/ansible/hosts
[testsunucular]
sunucu1 ansible_user=noroot
Yukarida daha oncesindan farkli olarak [testsunucukar] gurubuna uye olan sunucu1’e noroot kullanicisi ile baglanilacagini belirttik.
ansible_user disinda tanimlarda gorebilirsiniz bu ansible 2.0 sonrasi degisikliklerden biri.
Ornek Playbook
apache_kur.yml
—
#Ansible YAML file “—” ile baslar
– hosts: sunucu1
# – seviye gibi dusunebilirsiniz, – isaretinden sonra mutlaka bir bosluk verinki algilansin
# – xxx dediginiz anda bir list haline donusuyor tum YAML dosyasi ve – bir dictionary yaratmaya basliyor yani key and value cift araligi (bakiniz python dict ve list)
# Asagidaki satir hemen “hosts” un “h” harfinin seviyesinde baslamali aksi taktirde parse error ile karsilasabilirsiniz
# remote_user: noroot
#[testsunucular]
#sunucu1 ansible_user=noroot
#Normalde remote_user ile playbook’un hangi kullanici ile sisteme login olacak iken, host dosyasinda yapilacak bir degisiklikle buna gerek kalmiyor. Bakiniz ansible_user
tasks:
# Task icinde birden fazla islem yapacagiz burada yeni bir girdi ve dictinary yaratiyoruz
# Task name -> task hakkinda yardimci olabilecek aciklama
– name: Apache kurulumuna baslayalim
# apt module , mesela asagidaki komut apt-get install apache2 gibi
# Dikkat apt direk “name” in “n” harfinin hizasindan baslamali
apt: name=apache2 state=latest
# sudo:yes artik ansible 2.0 dan sonra become olarak kullanilmali
become: yes
# Bu arada ansible-playbook apache_kur.yml –list-hosts debug gibi :))
# Uc nokta ile biter
…
Aslinda asagidaki komut ilgili playbook’un hangi hostlarda calisacagini gosteriyor ama ben parse/hata check icin kullandim.
noroot@ansible:~/playbooks$ ansible-playbook apache_kur.yml –list-hosts
playbook: apache_kur.yml
play #1 (sunucu1): TAGS: []
pattern: [u’sunucu1′]
hosts (1):
sunucu1
Not : pattern deki u –> unicode oldugunu gosteriyor
noroot@ansible:~/playbooks$ ansible-playbook apache_kur.yml –ask-become-pass
SUDO password:
PLAY ***************************************************************************
TASK [setup] *******************************************************************
ok: [sunucu1]
TASK [Apache kurulumuna baslayalim] ********************************************
changed: [sunucu1]
PLAY RECAP *********************************************************************
sunucu1 : ok=2 changed=1 unreachable=0 failed=0
Not : –ask-become-pass bize sudo sifresini sormasini belirtiyor
Double Check
noroot@ansibleclient01ubuntu:~$ ps -fe | grep apache
root 2273 1 0 16:42 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 2276 2273 0 16:42 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 2277 2273 0 16:42 ? 00:00:00 /usr/sbin/apache2 -k start
noroot 2401 1231 0 16:47 pts/0 00:00:00 grep –color=auto apache
Ayni komutu tekrar calistirabilirsiniz , bu durumda dikkat ettiyseniz change=0 olacak yani degistirilecek birsey yok anlaminda.
Bu arada task’larin basit tutulmasi oneriliyor , KISS principle –> Keep It Simple Stupid
Playbook debug icin -v sayisini -vv artirmakta -vvv her zaman fayda var 🙂
Bir playbook icersindeki tasklari listeleyebilir
noroot@ansible:~/playbooks$ ansible-playbook apache_kur.yml –list-task
playbook: apache_kur.yml
play #1 (sunucu1): TAGS: []
tasks:
Apache kurulumuna baslayalim TAGS: []
Sonra start-at ile oradan baslatabilir
noroot@ansible:~/playbooks$ ansible-playbook apache_kur.yml –start-at=’Apache kurulumuna baslayalim’
veya –step parametresi ile (y/n) seklinde soru sordurulabiliriz
Bu arada akliniza playbook calisirken ya task’lardan birini calistirirken takilsa ? Ne oludur ? Vallaha cevap basit orada kalirdi ama devam ettirmek isterseniz bunu bir yolu var ;
VM
Esitliklerle Ansible – Giris
Ansible = orchestration engine
Ansible gelistirilmistir = python
Calisir = Windows / Mac / Unix-like
Baska toollarla beraber calisabilir mi = Ansible ile birseyler yonetip/kurarken ayni zamanda puppet ile konfigrasyon yonetimi yapabilirsiniz
Ansible = agentless / ajan yok = SSH var ise hersey tamam
Ansible = merkezi bir kurulum sunucusu yok
puppet/Chef = agent-based ama ayni zamanda Serverless Chef ve Masterless Puppet ile merkeziyetden uzakta calisabilirler.
Ansible varsayili olarak = push mode calisir / up to 500 makine diyorlar / merkezden yonetim sekli
Ansible ayni zamanda = pull mode‘da calisabilir playbook dedikleri (ki bu powershell kullaniyorsaniz oradada benzer deyim var) scriptler local’e cekilip oradan calistiriliyor
Ansible module = mesela ping
Install Ansible = GitHub source code / pip / system package manager (apt-get)
Ansible gerektirmez = database veya herhangi bir deamon calismasina gerek yok (Yoda tarzi dusuk cumle 🙂 )
Ornek Kurulum / Command Center veya Ansible Workstation = ilk kurulum yapacagimiz makineyi bu sekilde adlandiracagiz.
Ornek Kurulum / pip ile deneyelim = {
“Oncesinde” :
"sudo apt-get install build-essential autoconf libtool pkg-config python-opengl python-imaging python-pyrex python-pyside.qtopengl idle-python2.7 qt4-dev-tools qt4-designer libqtgui4 libqtcore4 libqt4-xml libqt4-test libqt4-script libqt4-network libqt4-dbus python-qt4 python-qt4-gl libgle3 python-dev"
anis “Sonrasinda” : [
“noroot@ansible:~$ sudo pip install ansible” ,
“
noroot@ansible:~$ sudo pip install markupsafe
” ]
Ref : http://python-packaging-user-guide.readthedocs.org/en/latest/pip_easy_install/
Belkide apt-get ile kurmak daha iyi 🙂
}
Kurulumu kontrol edelim = {
noroot@ansible:~$ ansible –version
ansible 2.0.0.2
config file =
configured module search path = Default w/o overrides
}
Test = Simdi ufak bir test zaman’i fakat bu islemi gerceklestiremeden once bilinmesi gereken birkac konu var ;
- Inventory Nerede : Oncelikle ansible ile hangi hostlari yonetiyor olacagimiz onemli , default inventory yolu /etc/ansible/hosts veya komut calistiriken -i ile belirtebilirsiniz .
- ansible testsunucular –inventory-file=/home/noroot/a -m ping -u noroot -vvvv
- Inventory asagidaki gibi olmali [arasina] gurup adi , altina sunucu bilgisi
[testsunucular]
sunucu1- Inventory’de alt alta FQDN , hostname veya IP adresi verebilirsiniz
- hostname[100:200] gibi hostname100 , hostname101,hostname199 anlaminda kullanabilirsiniz
- Gurup olayinda birde master group olayi var , bir tag acip altina diger guruplari eklediginizde is tamam;
- [kapsar_gurup:childeren]
- testsunucular
- dbsuncular
- DNS / Hosts Dosyasi : sunucu1 dosyasi /etc/hosts dosyasinda olmali veya FQDN kullanin
- SSH : Master node uzerinde ssh-keygen ile dosya olusuturup ilgili yonetilecek makine yayin (direkt login olabilsin command center / ansible workstation)noroot@ansible:~$ ssh-copy-id noroot@10.111.21.231
Simdi test edelim , ping module ile ve noroot kullanicisini kullanaraktan . Burada yaptigimiz sey su , uzaktaki makineye SSH baglan , pyhton kullanimini kontrol et ve geriye pong don!
noroot@ansible:~$ ansible testsunucular -m ping -u noroot
sunucu1 | SUCCESS => {
“changed”: false,
“ping”: “pong”
}
Uzaktan komut calistiralim = Burada onemli olan -a (argument) -m ile birsey set etmedik cunku default -m command geliyor yani aagidaki komutu soyle yazabilirdiniz –> ansible testsunucular -m command -a ‘echo gecen yaz ne yaptigini biliyorum‘{
noroot@ansible:~$ ansible testsunucular -a ‘echo gecen yaz ne yaptigini biliyorum‘
sunucu1 | SUCCESS | rc=0 >>
gecen yaz ne yaptigini biliyorum
}
ansible all = guzel komut , tum makinelerde calistirmak icin — > mesela;
noroot@ansible:~$ ansible all -a ‘echo vahric’
sunucu1 | SUCCESS | rc=0 >>
vahric
Double check yapalim , sunucu1 e baglanin ve syslog ciktisini kontrol edin = {
Jan 18 11:59:45 ansibleclient01ubuntu ansible-command: Invoked with warn=True executable=None chdir=None _raw_params=echo vahric removes=None creates=None _uses_shell=False
}
Kus bakisi Ansible = {
}
Playbook dedigimizde aklimiza = Plays
Play dedigimizde aklimiza = tasks
Task dedgimizde aklimiza = bir isi yaptirmak icin cagirdigimiz module ve argumanlar gelmeli
Uzaktaki sunucuda = python kurulu olmali , simplejson kutuphanesi olmali
Ad-Hoc Komutlar = Ad-hoc deyimi aslinda planlanmamis ama gerektiginde , sonradan ihtiyac olmayacak komutlara denir bu case icin meselaasagidaki komut bir ad-hoc komut olarak adlandirabiliriz ama devamli yapacagimiz ve playbook yaratacagimiz bir islem icin ad-hoc tanimini kullanmayiz
noroot@ansible:~$ ansible testsunucular -a ‘reboot’ -u noroot –sudo –ask-sudo-pass
veya
noroot@ansible:~/playbooks$ ansible localhost -m setup
SUDO password:
sunucu1 | SUCCESS | rc=0 >>
Tekrardan Playbook nedir dedigimizde = bir veya birden fazla task i calistiran , hatta bunu bir sarta baglayabilen , bildigimiz linux bash scripting aksine ansible script kullanan bir nevi script dosyasi diyebiliriz.
Ansible Script = YAML dosyasi , mesela cumulusnetworks switchleri icin yazmis
{
cumulus@wbench:~$ cat sample-playbook.yml --- - hosts: leaf1 vars: description: “this is a leaf switch” remote_user: root tasks: - name: write the quagga config file template: src=quagga.j2 dest=/etc/quagga/Quagga.conf notify: - restart quagga - name: ensure quagga is running service: name=quagga state=started handlers: - name: restart quagga service: name=quagga state=restarted
}
Ansible PlayBook ise = Chef -> Cookbook , Puppet -> Manifest
Ansible API destekler = Python Api http://docs.ansible.com/ansible/developing_api.html
Provisioning = Ansible makine yaratmak icinde kullanilabilir
ansible.cfg = Benim kurulumumda herhangi bir inventory veya ansible.cfg dosyasi olusmadi , onun icin ekstra birsey diyemiyorum ama environment variable olarak ANSIBLE_CONFIG , bulundugunuz dizindeki ansible.cfg veya kullanici home diznindeki .ansible.cfg veya /etc/ansible/ansible.cfg ki bunu apt-get kurulumu yaratiyor olmaliyimis nuda gorecegiz. Bu konfigrasyon dosyasi ;
- hostfile yolu
- kutuphane yolu
- Ayni anda parallel islem sayisi
- sudo kullanicisi
- ssh default portu
- timeout
- log yolunu gosteriyor
Bu arada belki sonda olmasi kotu oldu ama ansible kullanicilari gordugum kadariyla kendi home dizinleri altina gerekli hosts ve ansible.cfg yaratarak devem ediyorlar