¿Cómo obtengo registros / detalles de las ejecuciones del módulo ansible-playbook?

95

Digamos que ejecuto lo siguiente.

$ cat test.sh
#!/bin/bash
echo Hello World
exit 0

$ cat Hello.yml
---

- hosts: MyTestHost
  tasks:
  - name: Hello yourself
    script: test.sh


$ ansible-playbook  Hello.yml

PLAY [MyTestHost] ****************************************************************

GATHERING FACTS ***************************************************************
ok: [MyTestHost]

TASK: [Hello yourself] ********************************************************
ok: [MyTestHost]

PLAY RECAP ********************************************************************
MyTestHost                    : ok=2    changed=0    unreachable=0    failed=0

$

Estoy seguro de que tuvo éxito.

¿Dónde / cómo veo el "Hola mundo" hecho eco / impreso por mi script en el host remoto (MyTestHost)? ¿O el código de retorno / salida del script?

Mi investigación me muestra que sería posible escribir un complemento para interceptar las devoluciones de llamada de ejecución del módulo o algo en esas líneas y escribir un archivo de registro. Preferiría no perder el tiempo con eso.

Por ejemplo, algo como stdout a continuación (tenga en cuenta que estoy ejecutando ansible y no ansible-playbook):

$ ansible plabb54 -i /project/plab/svn/plab-maintenance/ansible/plab_hosts.txt -m script -a ./test.sh
plabb54 | success >> {
    "rc": 0,
    "stderr": "",
    "stdout": "Hello World\n"
}

$
Kashyap
fuente

Respuestas:

113

Si pasa la -vbandera a ansible-playbook en la línea de comando, verá stdout y stderr para cada tarea ejecutada:

$ ansible-playbook -v playbook.yaml

Ansible también tiene soporte integrado para el registro. Agregue las siguientes líneas a su archivo de configuración ansible :

[defaults] 
log_path=/path/to/logfile

Ansible buscará el archivo de configuración en varios lugares:

  • ansible.cfg en el directorio actual donde ejecutó ansible-playbook
  • ~/.ansible.cfg
  • /etc/ansible/ansible.cfg
Lorin Hochstein
fuente
8
Gracias. Simplemente codicioso: ¿Puedo iniciar / detener dinámicamente el registro desde un libro de jugadas? Me gusta set -xy set +xen un script de shell.
Kashyap
@thekashyap No creo que esto sea posible actualmente.
Lorin Hochstein
9
Puede usar la no_log: Truebandera para evitar que se registre un comando o un libro de jugadas, pero eso es lo más detallado que creo.
Ade Miller
4
¿Podría describir cómo lo hago logrotatepara log_pathque cada ansibleejecución tenga un archivo diferente (con el comando / libro de jugadas incluido en el archivo)?
mosca de espuma de poliestireno
Necesitaba tres vs para obtener stdout y stderr
rico
24

La tarea de secuencia de comandos del libro de jugadas se generará stdoutal igual que el comando que no es del libro de jugadas, solo debe guardarse en una variable usando register. Una vez que lo tenemos, el módulo de depuración puede imprimir en el flujo de salida del libro de jugadas.

tasks:
- name: Hello yourself
  script: test.sh
  register: hello

- name: Debug hello
  debug: var=hello

- name: Debug hello.stdout as part of a string
  debug: "msg=The script's stdout was `{{ hello.stdout }}`."

La salida debería verse así:

TASK: [Hello yourself] ******************************************************** 
changed: [MyTestHost]

TASK: [Debug hello] *********************************************************** 
ok: [MyTestHost] => {
    "hello": {
        "changed": true, 
        "invocation": {
            "module_args": "test.sh", 
            "module_name": "script"
        }, 
        "rc": 0, 
        "stderr": "", 
        "stdout": "Hello World\r\n", 
        "stdout_lines": [
            "Hello World"
        ]
    }
}

TASK: [Debug hello.stdout as part of a string] ******************************** 
ok: [MyTestHost] => {
    "msg": "The script's stdout was `Hello World\r\n`."
}
joemaller
fuente
pero Hola a ti mismo, la tarea no ha dado ninguna salida
estándar
Este es mi método preferido. Sea bueno en el uso de los valores de las variables registradas en las declaraciones de depuración y el mundo es su ostra.
Joshua K
14

También hay otra forma de generar un archivo de registro.

Antes de ejecutar, ansible-playbookejecute los siguientes comandos para habilitar el registro:

  • Especifique la ubicación del archivo de registro.

    exportar ANSIBLE_LOG_PATH = ~ / ansible.log

  • Habilitar depuración

    exportar ANSIBLE_DEBUG = True

  • Para verificar ese archivo de registro generado.

    menos $ ANSIBLE_LOG_PATH

Kamlesh
fuente
1
ANSIBLE_DEBUG es algo independiente de especificar un archivo de registro. ¡Incluso está separado de la selección de verbosidad! Todavía es muy bueno mencionar esto: la depuración le brindará mensajes de depuración orientados al desarrollador, en un nivel de verbosidad absolutamente extremo. Es bueno tenerlo cerca.
AlanSE
4

Complementos oficiales

Puede utilizar los complementos de devolución de llamada de salida . Por ejemplo, a partir de Ansible 2.4, puede usar el complemento de devolución de llamada de salida de depuración :

# In ansible.cfg:
[defaults]
stdout_callback = debug

(Alternativamente, ejecute export ANSIBLE_STDOUT_CALLBACK=debugantes de ejecutar su libro de jugadas)

Importante: debes ejecutar ansible-playbookcon la opción -v( --verbose) para ver el efecto. Con stdout_callback = debugset, la salida ahora debería verse así:

TASK [Say Hello] ********************************
changed: [192.168.1.2] => {
    "changed": true,
    "rc": 0
}

STDOUT:


Hello!



STDERR:

Shared connection to 192.168.1.2 closed.

Hay otros módulos además del debugmódulo si desea que la salida tenga un formato diferente. Hay json, yaml, unixy, dense, minimal, etc ( la lista completa ).

Por ejemplo, con stdout_callback = yaml, la salida se verá así:

TASK [Say Hello] **********************************
changed: [192.168.1.2] => changed=true 
  rc: 0
  stderr: |-
    Shared connection to 192.168.1.2 closed.
  stderr_lines:
  - Shared connection to 192.168.1.2 closed.
  stdout: |2-

    Hello!
  stdout_lines: <omitted>

Complementos de terceros

Si ninguno de los complementos oficiales es satisfactorio, puede probar el human_logcomplemento. Hay algunas versiones:

Flujo
fuente
3

Usando complementos de devolución de llamada, puede tener la salida estándar de sus comandos en forma legible con el juego : gist: human_log.py

Editar, por ejemplo, salida:

 _____________________________________
< TASK: common | install apt packages >
 -------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


changed: [10.76.71.167] => (item=htop,vim-tiny,curl,git,unzip,update-motd,ssh-askpass,gcc,python-dev,libxml2,libxml2-dev,libxslt-dev,python-lxml,python-pip)

stdout:
Reading package lists...
Building dependency tree...
Reading state information...
libxslt1-dev is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 24 not upgraded.


stderr:

start:
2015-03-27 17:12:22.132237

end:
2015-03-27 17:12:22.136859
J0hnG4lt
fuente
1

Ayuda de línea de comandos de Ansible, como ansible-playbook --helpmuestra cómo aumentar el nivel de detalle de la salida configurando el modo detallado (-v) en más detalle (-vvv) o en el nivel de depuración de la conexión (-vvvv). Esto debería darle algunos de los detalles que busca en stdout, que luego puede iniciar sesión.

Zach Weg
fuente