Crear un módulo personalizado con Ansible-Python

Módulos de Ansible

Ansible incluye una serie de módulos (llamados «biblioteca de módulos») que se pueden ejecutar directamente en hosts remotos o a través de Playbooks.

Los usuarios también pueden escribir sus propios módulos. Estos módulos pueden controlar los recursos del sistema, como los servicios, paquetes o archivos (cualquier cosa realmente), o manejar la ejecución de comandos del sistema.

¿Por qué crear su propio módulo?

Como se dijo anteriormente, ansible tiene muchos módulos para realizar diversas tareas. Pero diferentes entornos pueden tener diferentes requisitos en los que usted preferiría tener un módulo personalizado para manejar el sistema o el medio ambiente o el proyecto a su manera.

Vamos a entender cómo podemos crear un módulo personalizado de una manera fácil.

Estructura de carpetas

Es importante conocer la estructura de carpetas y archivos antes de empezar a crear un módulo personalizado. Revisa la siguiente imagen como referencia. Lo que tenemos que trabajar es main.yaml y testing.py bajo la carpeta library.

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

2 directorios, 2 archivos

Escribe tu primer programa python

Para escribir Ansible de forma pragmática debemos entender las utilidades de los módulos. Ansible proporciona una serie de utilidades de módulo que proporcionan funciones de ayuda que puedes utilizar al desarrollar tus propios módulos. La utilidad de módulos testing.py proporciona el principal punto de entrada para acceder a la biblioteca de Ansible, y todos los módulos de Ansible deben, como mínimo, importar de testing.py.

from ansible.module_utils.basic import *

Esto importará todos los archivos module_utils para crear un módulo personalizado. El formato de salida del archivo python es sólo JSON. Así que cuando imprimas la salida de un archivo python, tendrá que ser en JSON.

Las partes clave incluyen siempre importar el código boilerplate de ansible.module_utils.basic así:

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

Ahora instanciar la clase principal o puedes escribir directamente en la clase principal.

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)

El AnsibleModule proporciona un montón de código común para el manejo de los retornos, analiza tus argumentos para ti, y te permite comprobar las entradas. Aquí yourName es la entrada dada al archivo python. Esta entrada será tomada del playbook de ansible.

Los retornos exitosos se hacen así:

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

Y los fallos son igual de simples (donde msg es un parámetro requerido para explicar el error):

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

El programa final de python se ve así

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

Prepara tu playbook

Sabes que usaremos el nombre del módulo personalizado igual que el nombre del archivo de python.

- 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

Aquí vars_prompt te pedirá un nombre y el módulo de pruebas bajo tarea pasará ese nombre al script de python. ¿Puedes adivinar cuál será la salida? Vamos a comprobarlo.

ansible-playbook main.yaml

Conclusiones

Puedes comprobar más en detalle sobre los módulos personalizados en la documentación de Ansible. Hay mucho más que se puede hacer con los módulos personalizados.

Este artículo ha sido tomado directamente de www.9tocloud.com