Skapa en egen modul med Ansible-Python

Ansible-moduler

Ansible levereras med ett antal moduler (det så kallade modulbiblioteket) som kan exekveras direkt på fjärrvärdar eller via Playbooks.

Användare kan också skriva sina egna moduler. Dessa moduler kan styra systemresurser, som tjänster, paket eller filer (egentligen vad som helst), eller hantera utförandet av systemkommandon.

Varför skapa en egen modul?

Som tidigare nämnts har ansible många moduler för att utföra olika uppgifter. Men olika miljöer kan ha olika krav där du föredrar att ha en egen modul för att hantera systemet, miljön eller projektet på ditt eget sätt.

Låt oss förstå hur vi kan skapa en egen modul på ett enkelt sätt.

Mappstruktur

Det är viktigt att känna till mapp- och filstrukturen innan vi börjar skapa en egen modul. Titta på nedanstående bild som referens. Det vi behöver arbeta med är main.yaml och testing.py under mappen library.

root@ubuntu:~/ANSIBLEtesting# tree
.
└─── playbooks
├─── library
│ └── testing.py
└─── main.yaml

2 kataloger, 2 filer

Skriv ditt första pythonprogram

För att skriva ansible pragmatiskt måste vi förstå modulverktyg. Ansible tillhandahåller ett antal modulverktyg som tillhandahåller hjälpfunktioner som du kan använda när du utvecklar dina egna moduler. Modulverktyget testing.py ger den huvudsakliga ingången till Ansible-biblioteket, och alla Ansible-moduler måste åtminstone importera från testing.py.

from ansible.module_utils.basic import *

Detta kommer att importera alla module_utils-filer för att skapa en egen modul. Utdataformatet för pythonfilen är endast JSON. Så när du skriver ut utdata från en pythonfil måste det vara i JSON.

Nyckelkomponenter inkluderar att alltid importera boilerplate-koden från ansible.module_utils.basic så här:

from ansible.module_utils.basic import AnsibleModule
if __name__ == '__main__':
main()

Instantisera nu huvudklassen eller så kan du skriva direkt till huvudklassen.

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)

The AnsibleModule tillhandahåller massor av gemensam kod för hantering av returer, parsar dina argument åt dig och gör det möjligt för dig att kontrollera indata. Här är yourName den indata som ges till pythonfilen. Denna indata kommer att tas från ansible playbook.

Framgångsrika returer görs så här:

module.exit_json(changed=True, something_else=12345)

Och misslyckanden är lika enkla (där msg är en obligatorisk parameter för att förklara felet):

module.fail_json(msg="Something fatal happened")

Det slutgiltiga pythonprogrammet ser ut så här

#!/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)

Get your playbook ready

Vissa om att vi kommer att använda den anpassade modulens namn på samma sätt som pythonfilens namn.

- 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

Här kommer vars_prompt att be dig om ett namn och testing module under task kommer att skicka det namnet till pythonskriptet. Kan du gissa vad resultatet blir? Låt oss kolla.

ansible-playbook main.yaml

Konklusioner

Du kan läsa mer i detalj om anpassade moduler i Ansible-dokumentationen. Det finns mycket mer som kan göras med anpassade moduler.

Denna artikel har tagits direkt från www.9tocloud.com