Ansible Module Development
0

Ansible ssh, winrm, API gibi bağlantı yöntemleri ile remote sunucularda veya lokal sunucumuzda standalone scriptler çalıştırır. Bu standalone scriptlere modül ismi verilir. Ansible built-in olarak binlerce modüle sahiptir ve her yeni versiyon ile bunlara yenileri ekleniyor. Ayrıca çok geniş bir communitye sahip olduğu için community tarafından geliştirilen çok fazla sayıda modül bulunmaktadır. Eğer bu modüller arasında ihtiyacınızı karşılayacak modül bulunmuyorsa kendi modülünüzü geliştirebilirsiniz. Bir çok dilde modül yazılabilir ama en kolay ve native yolu Python ile yazılmasıdır. Built-in olarak gelen modüller de Python ile yazılmıştır.

Custom modüller genel olarak built-in modüller ile çözülemeyen veya playbook’unuzu okunması zor hale getiren karmaşık regex işlemlerinde, text processing veya curl kullanarak yaptığımız api call’larında kullanılmaktadır. Ansible modülleri ANSIBLE_LIBRARY path’inde veya –module-path parametresi ile arar. Bunların yanında playbookun çalıştığı dizindeki ./library dizinin altındaki modülleri de import eder. Benim tavsiyem custom modüllerin ./library dizinin içinde geliştirilmesidir.

En temel modül örneği aşağıdaki gibidir.

def main():

module = AnsibleModule(

argument_spec = dict(

input = dict(required=True),

),

supports_check_mode = false

)

my_local_input_var = module.params['input']

module.exit_json(changed=True)

from ansible.module_utils.basic import *

main()

 

Örnekte input parametresi girilmesi zorunlu parametre olarak belirtilmiştir. Parametrelerde farklı seçenekler mevcuttur. Bir kaç tane örnek verirsek no_log=True şifreleri gizlemek için kullanılır. choises(param1, param2) olarak 2 farklı parametre seçimi yapılması istenebilir. type=’bool’ ile de parametrenin belirli bir tipte olması belirtilebilir. Parametreleri module.params[] ile scriptimiz içinde kullanabiliriz.

Bir diğer zorunlulukta stdout’un JSON formatında olmasıdır. Eğer script başarılı tamamlanmışsa exit_json() veya başarısız olarak tamamlanmışsa fail_json() ile sonuç ekrana basılabilir.

Custom modül örneği

Aşağıdaki örnekte ise Ansible playleri ile array ve regex işlemlerini kullanarak playbookumu karmaşık bir hale getirmektense bu işleri yapacak bir modül geliştirdim. disk_fact.json dosyasından available scsi controller’ı ve unit number’ı bulan bu modül parametresiz olarak aşağıdaki şekilde çalışmaktadır. disk_fact.json dosyası ise vmware_guest_disk_facts modülü ile yazılmaktadır.

Dizin yapımız aşağıdaki gibidir.

 

 

 

 

Resim – 1

Ansible modülümüzün kodu aşağıdaki gibidir.

 library cat find_spot.py

#!bin/env python

from ansible.module_utils.basic import *

import json

import array

scsi_controller_array=[1000, 1001, 1002, 1003]

def find_spot():

with open("/etc/ansible/roles/addDisk/library/disk_fact.json") as disk_fact_file:

data = json.load(disk_fact_file)

for i in scsi_controller_array:

unit_number_array=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

for p in data['guest_disk_facts']:

if data['guest_disk_facts'][p]['controller_key'] == i :

unit_number_array.remove(data['guest_disk_facts'][p]['unit_number'])

if len(unit_number_array) > 0 :

scsi_controller = str(int(i)-1000)

unit_number = str(unit_number_array[0])

json_data = {

"available_scsi_controller": scsi_controller,

"available_unit_number": unit_number

}
return True, json_data
break
if len(unit_number_array) == 0:
return False

def main():
module = AnsibleModule(argument_spec={})

if find_spot():
module.exit_json(changed=True, msg=find_spot())
else:
module.fail_json(msg="not found any available spot")

main()

 

Modülü script ismi ile aşağıdaki gibi basit bir playbook yardımıyla kullanabiliriz.

 

 

 

 

 

Resim – 2

Playbook’umuzun başarılı çıktısı aşağıdaki gibidir

Resim – 3

Eğer uygun bir scsi_controller bulunmazsa hatayı aşağıdaki gibi ekrana basılır.

Resim – 4 

Son olarak yazılan modülün idempotent olmasına dikkat edilmelidir. Ayrıca büyük bir modül geliştirileceği zaman communitynin de kullanacağı düşünülerek example ve documentation kısımları da eklenmelidir.

Bu konuyla ilgili sorularınızı  alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.

Referanslar

www.mshowto.org

TAGs: Ansible nedir, Ansible modules, Ansible playbook, Ansible module development, Ansible python module, Ansible Engine

Bu İçeriğe Tepkin Ne Oldu?
  • 0
    harika_
    Harika!!
  • 0
    be_enmedim
    Beğenmedim
  • 0
    _ok_iyi
    Çok iyi
  • 0
    sevdim_
    Sevdim!
  • 0
    bilemedim_
    Bilemedim!
  • 0
    olmad_
    Olmadı!
  • 0
    k_zd_m_
    Kızdım!

2016 yılında Yıldız Teknik Üniversitesi Elektronik ve Haberleşme Mühendisliğinden mezun oldum. Sonrasında Bilge Adamda 6 aylık sistem ve ağ uzmanlığı eğitimi alıdım. Bu eğitimde Microsoft On-Prem ürünlerini tecrübe ettim. Sonrasında da Vakifbank'ta Cloud & Linux Administrator olarak işe başladım. Storage ve sanallaştırma ekibindeyim. Storage tarafında EMC ve Hitachi ürünlerini SAN tarafında ise Brocade switchlerin yönetimini yapmaktayım. Bunlara ek olarak VMware ürünleri,ağırlıklı olarak Cisco UCS fiziksel sunucular ve Linux işletim sistemleri ile ilgilenmekteyim. VMware ürünlerinden de özellikle vRealize Orchestrator üzerine çalışmaktayım. Linuxlara işletim sistemi seviyesinde destek olmanın yanında Ansible üzerine yoğunlaşmış durumdayım.

Yazarın Profili
İlginizi Çekebilir

Bültenimize Katılın

Tıklayın, üyemiz olun ve yeni güncellemelerden haberdar olan ilk kişi siz olun.

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir