Ansible: ¿Cómo informar a un script de python sobre el resultado de una tarea?

Tengo un libro de jugadas simple para recuperar y copiar archivos de un recurso compartido a clientes remotos de Windows:

- name: Test chocolatey module hosts: win_clones vars_files: - /fullpath/hosts_vars tasks: - name: Fetching and copying the file on the client ... win_get_url: url: 'ftp://172.20.0.5/choco-repo/{{ item }}' dest: 'C:\Test\{{ item }}' with_items: "{{ clients[machine].to_install }}" 

Ejecuto este juego desde un script de python usando subproceso:

 for i in clients: machine = "machine=" limit = "--limit=" an2 = subprocess.Popen(["ansible-playbook", "fetch.yml","-e", machine+i, limit+i], cwd='/home/diego/work/gitl_repo/ansible-software-deployment') an2.wait() 

Cuando una tarea falla por cualquier motivo, puedo ver eso en mi terminal:

 TASK [Fetching and copying the file on the client ...] ************************* failed: [cl1] (item=banana) => {"failed": true, "item": "banana", "msg": "Error downloading ftp://172.20.0.5/..... 

¿Es posible pasar esta información a mi script de python? En otras palabras, ¿cómo podría decirle a python el resultado de una determinada tarea, es decir, si falló o si se realizó? Gracias

Puede establecer stdout_callback = json mediante el archivo de configuración o la variable env ANSIBLE_STDOUT_CALLBACK .
ansible-playbook imprimirá un enorme archivo json con el resultado de la ejecución en la salida estándar.

Puede ejecutar el libro de jugadas desde la API de Python (aunque es más código y Ansible no lo admite oficialmente para llamadores externos). Use el ejemplo de Python API 2.0 como línea de base y, en lugar de cargar una obra, cargue un libro de jugadas:

 from ansible.playbook import Playbook playbook = Playbook(loader).load('fetch.yml' loader=loader, variable_manager=variable_manager) 

Entonces sustituye

 result = tqm.run(play) 

para esto

 for play in playbook.get_plays(): result = tqm.run(play) 

Necesitará alguna adaptación para iterarlo varias veces en su bucle for anterior, pero este es el marco.