Cómo agregar un complemento de callback a un PlaybookExecutor en Ansible 2

¿Cómo especificar una callback cuando se llama ansible a través de su API?

Tengo un complemento de callback database_write.py para ansible 2.0.0.2 que inicia sesión en una base de datos cuando se ejecuta:

 ansible-playbook -i inventory.txt playbook.yml # callback is fired ok 

Esto funciona bien porque en mi $ PWD tengo ansible.cfg con esta línea:

 callback_plugins = ./src/callback 

Ahora estoy tratando de hacer que sea imposible ejecutar mi libro de jugadas y mi callback utilizando la API de python. Básicamente he copiado lo que hace la herramienta cli de ansible-playbook

 # based on https://github.com/ansible/ansible/blob/v2.0.0.2-1/lib/ansible/cli/playbook.py pbex = PlaybookExecutor(playbooks=['../playbook.yml'], inventory=inventory, variable_manager=variable_manager, loader=loader, options=options, passwords=passwords) results = pbex.run() 

Esto ejecuta el libro de jugadas bien, pero la callback no se activa.

Supongo que cuando ansible.cfg API de python, ¿mi archivo ansible.cfg no se tiene en cuenta?

¿Cómo especifico mi complemento de callback al PlaybookExecutor?

(La mayoría de la documentación que he encontrado funciona para versiones ansible <2.0)

¡gracias de antemano!

La API 2.0 es muy simple y generalmente no es adecuada para el usuario final. Es probable que también se cambie en el futuro. Consulte esta discusión en la lista de correo donde publiqué una pregunta similar y propuse mi propia respuesta que aparentemente era correcta: puede asignar sus devoluciones de llamada a la instancia del ejecutor TaskQueueManager (PlaybookExecutor._tqm._stdout_callback).

 pbex = PlaybookExecutor(playbooks=playbooks, inventory=inventory, variable_manager=variable_manager, loader=loader, options=options, passwords=passwords) cb = ResultAccumulator() pbex._tqm._stdout_callback = cb results = pbex.run() 

(ResultAccumulator es una clase de complemento de callback desde aquí . Se debe derivar de ansible.plugins.callback.CallbackBase.

Los documentos API ansibles son escasos. PlaybookExecutor no acepta ningún argumento de callback. Sin embargo, puede crear una callback personalizada desde CallbackBase. Aquí hay un ejemplo que devuelve una lista de todos los TaskResults:

 class SampleCallback(CallbackBase): """Sample callback""" def __init__(self): super(SampleCallback, self).__init__() # store all results self.results = [] def v2_runner_on_ok(self, result, **kwargs): """Save result instead of printing it""" self.results.append(result) pbe = PlaybookExecutor( playbooks=playbooks, inventory=inventory, variable_manager=variable_manager, loader=loader, options=options, passwords=passwords ) callback = SampleCallback() pbe._tqm._stdout_callback = callback return_code = pbe.run() results = callback.results 

Con mi configuración (ansible 2.0.0.2 RHEL6 python 2.6.6) necesitaba tenerlo configurado en /etc/ansible/ansible.cfg y así lo hice:

 callback_plugins = /usr/lib/python2.6/site-packages/ansible/plugins/callback bin_ansible_callbacks = True callback_whitelist = profile_tasks