Opret et brugerdefineret modul med Ansible-Python

Ansible-moduler

Ansible leveres med en række moduler (kaldet “modulbiblioteket”), som kan udføres direkte på fjernværter eller via Playbooks.

Brugere kan også skrive deres egne moduler. Disse moduler kan styre systemressourcer som tjenester, pakker eller filer (alt muligt) eller håndtere udførelse af systemkommandoer.

Hvorfor oprette sit eget modul?

Som tidligere nævnt har ansible mange moduler til at udføre forskellige opgaver. Men forskellige miljøer kan have forskellige krav, hvor du foretrækker at have et brugerdefineret modul til at håndtere systemet eller miljøet eller projektet på din egen måde.

Lad os forstå, hvordan vi kan oprette et brugerdefineret modul på en nem måde.

Mappestruktur

Det er vigtigt at kende mappe- og filstrukturen, før vi begynder at oprette et brugerdefineret modul. Tjek nedenstående billede som reference. Det, vi skal arbejde med, er main.yaml og testing.py under biblioteksmappen.

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

2 mapper, 2 filer

Skriv dit første pythonprogram

For at skrive ansible pragmatisk må vi forstå modulværktøjer. Ansible indeholder en række modulværktøjsprogrammer, der leverer hjælpefunktioner, som du kan bruge, når du udvikler dine egne moduler. Modulværktøjet testing.py giver det vigtigste indgangspunkt for adgang til Ansible-biblioteket, og alle Ansible-moduler skal som minimum importere fra testing.py.

from ansible.module_utils.basic import *

Dette vil importere alle module_utils-filerne for at oprette et brugerdefineret modul. Udgangsformatet for pythonfilen er kun JSON. Så når du udskriver output af en python-fil, skal det være i JSON.

Nøglepunkterne omfatter altid import af boilerplate-koden fra ansible.module_utils.basic på denne måde:

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

Instantier nu hovedklassen, eller du kan skrive direkte til hovedklassen.

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)

AnsibleModulet indeholder masser af fælles kode til håndtering af returneringer, analyserer dine argumenter for dig og giver dig mulighed for at kontrollere inddata. Her er yourName det input, der er givet til python-filen. Dette input vil blive hentet fra ansible playbook.

Succesfulde returneringer foretages på denne måde:

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

Og fejl er lige så enkle (hvor msg er en nødvendig parameter til at forklare fejlen):

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

Det endelige pythonprogram ser således ud

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

Gør din playbook klar

Vis, at vi vil bruge navnet på det brugerdefinerede modul det samme som pythonfilens navn.

- 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

Her vil vars_prompt bede dig om et navn, og testmodul under opgaven vil videregive dette navn til python-scriptet. Kan du gætte, hvad output vil være ? Lad os tjekke.

ansible-playbook main.yaml

Konklusioner

Du kan tjekke mere i detaljer om de brugerdefinerede moduler i Ansible-dokumentationen. Der er meget mere, der kan gøres med brugerdefinerede moduler.

Denne artikel er taget direkte fra www.9tocloud.com