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_guzelcidden_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 ;

  1. 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;
      1.  [kapsar_gurup:childeren]
      2. testsunucular
      3. dbsuncular
  2. DNS / Hosts Dosyasi : sunucu1 dosyasi /etc/hosts dosyasinda olmali veya FQDN kullanin
  3. 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 -aecho 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 = {

Screen Shot 2016-01-18 at 12.04.59

}

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