Ansible Module Development

ansible

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

Yazı gezinmesi

Mobil sürümden çık