2014-09-18 15 views
14

Vorrei sapere se esiste un modo per stampare le informazioni mentre un modulo è in esecuzione, principalmente come mezzo per dimostrare che il processo funziona e non è stato bloccato. Nello specifico, sto cercando di ottenere un feedback durante l'esecuzione del modulo cloudformation. Ho provato la modifica del (Python) il codice sorgente per includere il seguente:Ansible - Posso stampare le informazioni durante l'esecuzione del modulo?

def debug(msg): 
    print json.dumps({ 
     "DEBUG" : msg 
    }) 

... 

debug("The stack operation is still working...") 

Che cosa questo ha fatto, naturalmente, era Store Tutto questo in uscita e solo stampare il tutto dopo che il modulo era terminato l'esecuzione. Quindi, per modelli di cloudformation particolarmente grandi, questo significa che aspetto circa 5 minuti circa, e poi all'improvviso vedo una grande quantità di testo apparire sullo schermo alla fine. Quello che mi aspettavo era vedere "L'operazione stack funziona ancora ..." stampata ogni x secondi.

Sembrerebbe che lo Asynchronous Actions and Polling sia quello che sto cercando ... ma anche questo non ha funzionato. L'intera attività, "Avvia CloudFormation per {{stackname}}", è stata interamente ignorata. Vedi sotto per la (YAML) frammento dal mio playbook rilevanti:

- name: Launch CloudFormation for {{ stackname }} 
     cloudformation: > 
     stack_name="{{ stackname }}" state=present 
     region="{{ region }}" disable_rollback=true 
     template="{{ template }}" 
     register: cloud 
     args: 
     template_parameters: 
      KeyName: "{{ keyName }}" 
      Region: "{{ region }}" 
      SecurityGroup: "{{ securityGroup }}" 
      BootStrapper: "{{ bootStrapper }}" 
      BootStrapCommand: "powershell.exe -executionpolicy unrestricted -File C:\\{{ bootStrapper }} {{ region }}" 
      S3Bucket: "{{ s3Bucket }}" 
     async: 3600 
     poll: 30 

Questo mi dice che asincrona è pensato per i comandi tipici di shell, e non i moduli complessi come cloudformation. O - Forse ho fatto qualcosa di sbagliato.

Qualcuno potrebbe far luce su questa situazione? Ancora una volta, per attività di cloud computing di grandi dimensioni che richiedono un po 'di tempo, vorrei alcune indicazioni periodiche che l'attività è ancora in esecuzione, e non sospesa. Apprezzo l'aiuto!

risposta

6

La risposta è semplice - no. Ansible è un sistema continuo che mira a gestire la capacità di eseguire un gruppo di server e visualizzare risultati di stdout in tempo reale può essere molto scomodo.

Ma penso che è possibile utilizzare alcuni accorgimenti se il sistema di destinazione può supportare l'esecuzione in background. Vedo che il vostro sistema è Windows, quindi è necessario installare Cygwin su di esso per la capacità di eseguire sfondo comandi come "sleep 20 &" nell'esempio qui sotto

È possibile eseguire questo playbook con ansible-playbook -vv background.yml Si può vedere che stdout cambio . echo Test---- >> /tmp/test && tail /tmp/test è un comando di dimostrazione. Dovresti inviare i dati ad alcuni file e adattarli per poter vedere i progressi. Oppure Si può guardare la dimensione del file del file stdout e visualizzarlo. Usa l'immaginazione)))

# @file background.yml 

- hosts: 127.0.0.1 
    connection: local 
    gather_facts: no 

    tasks: 
    - name: Background operation 
    shell: "sleep 20 & \ PPID=$! \ echo $PPID" 
    register: bcktsk 

    - name: Check PPID 
    shell: "kill -0 {{ bcktsk.stdout | int + 2 }}" 
    register: checkppid 
    ignore_errors: true 

    - name: Check if process still active 
    shell: "echo Test---- >> /tmp/test && tail /tmp/test && kill -0 {{ bcktsk.stdout | int + 2 }}" 
    register: test 
    when: checkppid.rc == 0 
    until: test.rc ==1 
    delay: 2 
    retries: 10000 
    ignore_errors: true 
+1

Grazie. Posso almeno fare qualcosa del genere per riferire su un intervallo di 30 secondi forse una semplice nota "L'operazione funziona ancora ...". È solo un peccato che Ansible non supporti ancora i veri processi asincroni. – Brian

+1

Sebbene in pratica, questo non sembra funzionare per il modulo CloudFormation. Di nuovo, sembra che solo i comandi di shell semplici possano essere eseguiti in modo asincrono (o come processi in background). ** Quindi la risposta è ancora un NO concreto. ** – Brian

0

C'è un modo per aggirare questo, e sarà visualizzare l'output in tempo reale, tuttavia si dovrà fare con i prefissi iniettati su ogni linea. E 'disordinato/hacker, ma per scopi di debug/monitoraggio si ottiene il lavoro fatto:

- name: Run some command and echo it's realtime stdout 
    shell: ":" 
    with_lines: "/usr/bin/some_long_running_command with arguments and such here" 

Il comando : è solo un noop, si può facilmente utilizzare command: /usr/bin/true se questo è più facile.In ogni caso, queste linee di uscita sarà simile a:

changed: [localhost] => (item=first output line) 
changed: [localhost] => (item=second output line) 
changed: [localhost] => (item=third output line) 
1

Il mio approccio per il modulo localhost:

... 
module.log(msg='test!!!!!!!!!!!!!!!!!') 
... 

Poi in un'altra finestra:

$ tail -f /var/log/messages 

Nov 29 22:32:44 nfvi-ansible-xxxx python2: ansible-test-module test!!!!!!!!!!!!!!!!! 
Problemi correlati