python - introducción - comentarios en ansible
¿Llamar a un Módulo Ansible desde otro Módulo Ansible? (1)
Pregunta
¿Es posible llamar un módulo Ansible desde otro módulo Ansible mediante programación?
Contexto
He estado trabajando con Cisco UCS a través de Python (ucsmsdk) y Ansible para crear un medio de automatización de plantillas de perfil de servicio (SPT a partir de ahora). He creado aplicaciones y módulos que se ajustan a las normas establecidas en los respectivos repositorios Git.
Si bien puedo crear estos SPT con un libro de estrategias de Ansible, se requieren muchas propiedades reutilizadas para crear cada elemento individual y seguir sus largas cadenas de relaciones padre / hijo. Me gustaría eliminar toda esta reutilización y simplificar la creación de los elementos alimentando todos los parámetros que necesito para hacer esto de una vez con su estructura intacta.
El siguiente ejemplo muestra el sistema actual a lo que me gustaría.
Corriente
tasks:
- name: create ls server
ls_server_module:
name: ex
other_args:
creds:
- name: create VNIC Ether
vnic_ether_module:
name: ex_child
parent: ex
other_args:
creds:
- name: create VNIC Ether If (VLAN)
vnic_ether_if_module:
name: ex_child_child
parent: ex_child
creds:
- name: create VNIC Ether
vnic_ether_module:
name: ex_child_2
parent: ex
other_args:
creds:
Deseado
tasks:
- name: create template
spt_module:
name: ex
other_args:
creds:
LAN:
VNIC:
- name: ex_child
other_args:
vlans:
- ex_child_child
- name: ex_child_2
other_args:
Actualmente, mi única barrera es inducir la reutilización de algunos códigos llamando a estos módulos que crean el objeto de una manera dinámica y programática.
No puede ejecutar un módulo desde otro módulo, porque los módulos en Ansible son entidades independientes, que se empaquetan en el controlador y se entregan al host remoto para su ejecución.
Pero hay complementos de acción para estas situaciones. Puede crear el complemento de acción spt_module
(se ejecutará localmente en el controlador Ansible) que a su vez puede ejecutar varios módulos diferentes, en lan/vnic
parámetros de lan/vnic
.
Así es como se ve tu complemento de acción ( spt_module.py
) (muy simplificado):
from ansible.plugins.action import ActionBase
class ActionModule(ActionBase):
def run(self, tmp=None, task_vars=None):
result = super(ActionModule, self).run(tmp, task_vars)
vnic_list = self._task.args[''LAN''][''VNIC'']
common_args = {}
common_args[''name''] = self._task.args[''name'']
res = {}
res[''create_server''] = self._execute_module(module_name=''ls_server_module'', module_args=common_args, task_vars=task_vars, tmp=tmp)
for vnic in vnic_list:
module_args = common_args.copy()
module_args[''other_args''] = vnic[''other_args'']
res[''vnic_''+vnic[''name'']] = self._execute_module(module_name=''vnic_ether_module'', module_args=module_args, task_vars=task_vars, tmp=tmp)
return res
El código no está probado (errores, errores tipográficos posibles).