tutorial introducción for dummies comentarios automatizacion python python-2.7 automation ansible ansible-2.x

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).