¿Cómo registro la salida de la tarea en un archivo?

9

Una de mis tareas ansibles importa una base de datos Oracle usando impdp.

Esto genera una gran cantidad de salida a la consola, así que lo he configurado no_log: True.

Sin embargo, cuando esto falla, ¡quiero ver el registro!

¿Cómo puedo hacer que esta tarea en particular registre en un archivo y no en la consola?

óptico
fuente
¿Estás usando el módulo de comando?
Boicot SE para Monica Cellio
Una idea [más que un truco] sería escribir los registros en algún archivo externo, y luego tener una tarea que haga uso de la failed_whencondición, y eliminar el archivo de registro, si el anterior. la tarea fue exitosa :)
Dawny33
¿Por qué puedes ver la salida de la consola durante las ejecuciones exitosas de todos modos? No he visto una configuración para, ni pensé que fuera posible, mostrar stdout durante una ejecución exitosa de la tarea, debería aparecer [ok: nombre de host]. Sin embargo, cuando se detecta un error, la salida se descarga en la consola de control ansible (y cualquier registro ansible definido) ¿le importaría compartir la configuración que le proporciona la gran salida estándar durante una ejecución exitosa regular?
hvindin
@hvindin Poner -vvvdespués del ansible-playbookcomando para obtener registros detallados.
Dawny33
1
El registro de una variable parece el mejor movimiento lógico, vea mi comentario sobre su respuesta para conocer mis opiniones sobre qué hacer con las salidas de los comandos activados ansibles.
hvindin

Respuestas:

4

[Convertir mi comentario en una respuesta]

Una forma de hacerlo sería escribir los registros en algún archivo externo y luego tener una tarea que haga uso de la condición fail_when y eliminar el archivo de registro, si la tarea anterior fue exitosa.

Algo como esto debería ayudarte.

 - name: Run Py script
      command: <>.py  > <>.log
      become: yes
      register: PyScript
      ignore_errors: True

    - name: PyScript on success
      command: rm <>.log
      when: PyScript|succeeded

Nota: Esta podría no ser la mejor manera de manejar su problema. Pero, este fue un truco que me ayudó a hacer mi registro y monitoreo.

Dawny33
fuente
2
Iría uno más y diría que puedes mantener tu comando escribiendo en stdout / stderr y luego simplemente deshacerte de ellos como respuesta a una falla. Entonces, como ejemplo en el ejemplo anterior, si desea detener la ejecución en caso de falla, use una tarea de falla para generar el stdout y el stderr registrados en PyScript cuando rc! = 0 parecería una solución más integral. Si utiliza mecanismos incorporados ansibles, entonces, si tiene un registro ansible configurado en un servidor de control, como ejemplo, entonces ese servidor de control registrará la falla en el registro ansible. ¿Qué me creo que sería el lugar adecuado para ello
hvindin
3

Creo que todo lo que necesita hacer es registrar la salida de cada comando que necesita (almacenarlo en una variable) y luego simplemente volcar la variable en un archivo. De esa manera puedes revisarlo más tarde.

tasks:
  - name: Dump all vars
    action: template src=templates/dumpall.j2 dest=/tmp/ansible.all

Luego en dumpall.j2:

Module Variables ("vars"):
--------------------------------
{{ vars | to_nice_json }} 

Environment Variables ("environment"):
--------------------------------
{{ environment | to_nice_json }} 

GROUP NAMES Variables ("group_names"):
--------------------------------
{{ group_names | to_nice_json }}

GROUPS Variables ("groups"):
--------------------------------
{{ groups | to_nice_json }}

HOST Variables ("hostvars"):
--------------------------------
{{ hostvars | to_nice_json }} 

El ejemplo que estoy usando es de aquí

13dimitar
fuente
3

Resolví esto agregando

ignore_errors: true
register: results

a la tarea no_log. Esto hace que ansible continúe con la siguiente tarea, incluso cuando la tarea falla. Luego, para la siguiente tarea, defina una tarea de depuración, que siempre falla y genera la variable registrada, pero solo se ejecuta cuando falla la tarea anterior:

- name: Error output
  debug:
     var: results
  failed_when: true
  when:
     results is failed

Entonces, incluso con no_log: true, esto hará que ansible muestre el resultado de la tarea fallida. Esta solución no lo está registrando en un archivo como se solicitó, pero satisface su necesidad de "ver el registro cuando falla" y, por supuesto, puede redirigir o usar tee para generar la salida ansible completa a un archivo, lo que, con esta solución también contiene el registro de la tarea fallida.

Robin Roevens
fuente
2

Lo que hago cuando tengo un comando para ejecutar y deseo obtener el registro solo en caso de falla es el siguiente (precedido por un comando de shell como /bin/sh -c '...'en el caso de que el iniciador no use una systemllamada o ejecute el comando directamente sin shell) :

command 2&>1 > command-log.txt || cat command-log.txt

Esto redirigirá el error y la salida estándar a un archivo y mostrará el contenido del archivo solo en caso de falla. Si el comando es muy detallado y no desea mantener el registro cuando está bien, puede ir con:

command 2&>1 > command-log.txt && rm command-log.txt || cat command-log.txt

Cotización &&y ||uso de la página de manual de sh :

El símbolo && (||) hace que la siguiente lista se ejecute solo si la tubería anterior devuelve un valor cero (no cero).

Probablemente esa no sea la forma más idiomática de hacerlo con ansible, pero tiene la ventaja de ser muy portátil con cualquier sistema de administración de configuración que le permita mostrar comandos stdout.

Tensibai
fuente
0

Suponiendo que ansible arroja errores correctamente a stderr, puede capturar la salida de errores en cualquier programa en un archivo usando la redirección de salida:

some command 2> error.log

Sin embargo, no creo que este sea el caso.

En su lugar, es probable que desee consultar esta guía para decidir cuándo ocurrirán los errores http://docs.ansible.com/ansible/playbooks_error_handling.html y luego seleccionar su salida para las cadenas que indican un error antes de enviarlas a un archivo

es decir.

ansible-playbook my-playbook | grep 'error' > error.log

Yosefrow
fuente
-2

Creo que lo que estás buscando podría ser simplemente redirigir stdout y street a file.

Típicamente, algún comando &> logfile.log

o alguna variante ...

sparq
fuente
Lo cual es solo una respuesta parcial, OP quiere ver el registro en caso de error.
Tensibai
No sé, esto es incluso una respuesta parcial a esta pregunta. Está bien para un script de shell, pero es inútil para codificar en ansible .
pollitos
@chicks Creo que podría ser una solución válida en un enfoque de método 'shell' dentro de ansible (que no sé mucho)
Tensibai
-2

Tee será una herramienta muy simple para iniciar sesión, puede consultar el siguiente comando.

eric@eric-MacBookPro:~$ ansible -m ping all | tee > /tmp/ansible.log
eric@eric-MacBookPro:~$ cat /tmp/ansible.log 
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
Eric Zhang
fuente
2
1. Esto afecta la ejecución completa, no solo una tarea. 2. No tiene sentido pasar por T si va a redirigir su stdout a un archivo; no es así como usas el comando. 3. Si estuviera utilizando tee correctamente, aún generaría todo el spam a la consola, que OP no desea.
Boicot SE para Monica Cellio