[pyar] Ansible y Popen

Marcos Dione mdione en grulic.org.ar
Vie Oct 21 15:46:15 ART 2016


On Fri, Oct 21, 2016 at 03:44:32PM +0000, Juan Carizza wrote:
> def callback(mensaje):
>     subprocess.call("ansible-playbook unplaybook.yml", shell=True)
> 
> El problema es que cuando el script de Ansible tira un sys.exit(0) mi
> proceso muere y supervisor lo muestra como EXITED.

    es muy raro que ansible terminando mate tu proceso. subprocess
debería estar llamando a fork(); esto crea un proceso hijo que ejecuta
exec*(), y el exit() de ese proceso (ya no la función Python, que es la
que levanta SystemExit, sino la de C, la que realemnte finaliza el
proceso) no debería matar al padre, mucho menos con un shell de por
medio. todo esto lo podés ver corriendo:

strace -ff -o /tmp/foo python tu_scipt.py

    eso te va a dejar en /tmp varios arcivos, uno por proceso. si sabés
de syscalls, vas a poder mas o menos seguir qué van haciendo cada uno de
los procesos, que yo creería van a ser almenos tres: uno el intérprete
python queejecuta tu script, otro el shell que estás pidiendo en el
call() (a todo esto, en la forma que estás llamando a ansible no hace
falta), y finalmente el de ansible.

    tiene que estar pasando otra cosa. una de eelas puede ser que el
script está corriendo en otro environment y no encuentra
ansible-playbook. pero en ese caso tampoco debería matar al padre.

> - Probé haciendo un try catch de SystemExit no funcionó
> - El API e Ansible no es muy entendible en la versión 2.0 y no encontré un
> ejemplo claro. (Para ejecutar Ansible por código y no por un popen)

    eso no ando porque una vez que se hace el fork()+exec(), ya no es
python el que corre.

> ¿Cómo se que viene del script Ansible?

    podrías poner redirecciones en el comando:

ansible-playbook unplaybook.yml &> /tmp/ansible.log

    y ver qué sale.

> ¿De qué forma puedo evitar que el sys.exit de Ansible mate mi proceso?
> ¿Puedo probar abriendo un proceso aparte con multithreading?

    un thread no sirve por varios motivos: a) si un thread llama a
exit(), todos mueren y b) para poder ejecutar otra cosa tenes que usar
exec(), y eso reemplaza todo el proceso, incluyendo los threads.

-- 
(Not so) Random fortune:
Terrorism isn't a crime against people or property. It's a crime against
our minds, using the death of innocents and destruction of property to
make us fearful.
	    -- Bruce Schneier


Más información sobre la lista de distribución pyar