Vytvoření vlastního modulu pomocí Ansible-Python
Moduly Ansible
Ansible se dodává s řadou modulů (nazývaných „knihovna modulů“), které lze spouštět přímo na vzdálených hostitelích nebo prostřednictvím knihoven Playbook.
Uživatelé mohou také psát vlastní moduly. Tyto moduly mohou ovládat systémové prostředky, jako jsou služby, balíčky nebo soubory (vlastně cokoli), nebo zpracovávat spouštění systémových příkazů.
Proč vytvářet vlastní modul?
Jak již bylo řečeno, ansible má spoustu modulů k provádění různých úloh. Různá prostředí však mohou mít různé požadavky, kdy byste raději měli vlastní modul, který by systém, prostředí nebo projekt zpracovával po svém.
Pochopíme, jak můžeme snadno vytvořit vlastní modul.
Struktura složek
Než začneme vytvářet vlastní modul, je důležité znát strukturu složek a souborů. Podívejte se na níže uvedený obrázek pro referenci. To, na čem potřebujeme pracovat, je main.yaml a testing.py ve složce library.
root@ubuntu:~/ANSIBLEtesting# strom
.
└── playbooks
├── library
│ └── testing.py
└── main.yaml
2 adresáře, 2 soubory
Napsat první program v jazyce python
Pro pragmatické psaní ansible musíme rozumět modulovým utilitám. Ansible poskytuje řadu modulových utilit, které poskytují pomocné funkce, jež můžete použít při vývoji vlastních modulů. Modulová utilita testing.py poskytuje hlavní vstupní bod pro přístup ke knihovně Ansible a všechny moduly Ansible musí minimálně importovat z testing.py.
from ansible.module_utils.basic import *
Tím se importují všechny soubory module_utils pro vytvoření vlastního modulu. Výstupní formát souboru pythonu je pouze JSON. Takže když budete vypisovat výstup souboru pythonu, bude muset být ve formátu JSON.
Klíčové části zahrnují vždy import kotlového kódu z ansible.module_utils.basic takto:
from ansible.module_utils.basic import AnsibleModule
if __name__ == '__main__':
main()
Nyní instancujte hlavní třídu nebo můžete psát přímo do hlavní třídy.
if __name__ == '__main__':
fields = {
"yourName": {"required": True, "type": "str"}
}
module = AnsibleModule(argument_spec=fields)
yourName = os.path.expanduser(module.params)
newName = firstProg(yourName)
module.exit_json(msg=newName)
Modul Ansible poskytuje spoustu společného kódu pro zpracování návratů, analyzuje za vás argumenty a umožňuje kontrolovat vstupy. Zde je yourName vstupem zadaným do souboru pythonu. Tento vstup bude převzat z ansible playbooku.
Úspěšné návraty probíhají takto:
module.exit_json(changed=True, something_else=12345)
A stejně jednoduše probíhají i selhání (kde msg je povinný parametr pro vysvětlení chyby):
module.fail_json(msg="Something fatal happened")
Finální pythonovský program vypadá takto
#!/bin/env python
from ansible.module_utils.basic import *
import os, json
import re, sysdef firstProg(text):
text1 = "Hello " + text
return text1if __name__ == '__main__':
fields = {
"yourName": {"required": True, "type": "str"}
}
module = AnsibleModule(argument_spec=fields)
yourName = os.path.expanduser(module.params)
newName = firstProg(yourName)
module.exit_json(msg=newName)
Připravte si playbook
Víme, že název vlastního modulu budeme používat stejný jako název pythonovského souboru.
- hosts: all
remote_user: root
gather_facts: yes vars_prompt:
- name: giveName
prompt: "Please provide your name"
private: no
failed_when: giveName is undefined tasks:
- name: Python Execution
testing: yourName={{ giveName }}
register: result
- debug: var=result
Zde se vás vars_prompt zeptá na jméno a testovací modul v rámci úlohy předá toto jméno skriptu pythonu. Dokážete odhadnout, jaký bude výstup ? Pojďme si to ověřit.
ansible-playbook main.yaml
Závěry
Podrobnější informace o vlastních modulech najdete v dokumentaci Ansible. S vlastními moduly toho lze udělat mnohem více.
Tento článek byl převzat přímo z www.9tocloud.com
.