Salida de pantalla con Ansible

39

Tengo un juego Ansible para PGBouncer que muestra algunos resultados de un módulo de estadísticas integrado en PGBouncer.

Mi problema es que cuando Ansible imprime la salida en el terminal, destruye las nuevas líneas. En lugar de ver

----------
| OUTPUT |
----------

Veo

----------\n| OUTPUT |\n----------

¿Alguien sabe cómo obtener Ansible para "imprimir bastante" la salida?

mjallday
fuente

Respuestas:

14

No hay una manera de hacer lo que quieres de forma nativa en Ansible. Puede hacer esto como una solución alternativa:

ansible-playbook ... | sed 's/\\n/\n/g'
jarv
fuente
1
En OSX tuve que usar sed -e 's/\\n/'$'\\\n/g'. También relevante: comicjk.com/20
Navin
44
vea la respuesta de sorins serverfault.com/a/846232/240508, que es la correcta en 2017 y ansible> 2.3
Vadimo
En su mayoría \naparecen en el resultado, por lo que podría usar esta msg: "{{ result.stdout | regex_replace('\\n', '\n') }}"
expresión regular
desafortunadamente, al hacer esto se eliminan los colores agradables y útiles que se obtienen en la salida ansible
Mehdi LAMRANI
63

Si desea una salida más amigable para los humanos, defina:

ANSIBLE_STDOUT_CALLBACK=debug

Esto hará que ansible usar el módulo de salida de depuración (anteriormente nombrado human_log) a pesar de que su nombre desafortunado es menos detallado y mucho más fácil de leer para los humanos.

Si recibe un error de que este módulo no está disponible, actualice Ansible o agregue este módulo localmente si no puede actualizar ansible, funcionará con más de versiones de ansible como 2.0 o probablemente 1.9.

Otra opción para configurar esto es agregar stdout_callback = debuga su ansible.cfg

Sorin
fuente
13
esta debería ser la respuesta ACEPTADA en 2017, la salida del registro amigable para los humanos se envía de fábrica.
Vadimo
1
Aquí hay algunos consejos más para hacer esto más permanente: github.com/ansible/ansible/issues/27078#issuecomment-364560173
kramer65
1
O ANSIBLE_STDOUT_CALLBACK=yaml. Lo prefiero porque se formatea bien fail msgcuando proporciono un objeto.
Marinos un
13

Puede usar un complemento de devolución de llamada . Esto volverá a analizar su salida y se enciende y apaga fácilmente.

xddsg
fuente
2
Nota: con ansible 2.0.x necesita heredar de CallbackBaseimportado from ansible.plugins.callback import CallbackBasepara que la clase de devolución de llamada funcione.
allo
12

Encontrado de esta manera en el foro del grupo Ansible Project:

- name: "Example test"
  command:
    ...
  register: test
- name: "Example test stdout"
  debug:
    msg: "{{ test.stdout.split('\n') }}"
- name: "Example test stderr"
  debug:
    msg: "{{ test.stderr.split('\n') }}"

Básicamente convertimos esto en una lista dividiéndola por una nueva línea y luego imprimiendo esa lista.

jhutar
fuente
¡Eso hace que la salida de shell sea mucho más legible! ¡Agradable!
Asfand Qazi
Esta solución parece tener un inconveniente importante: si falla la ejecución del módulo "Prueba de ejemplo", generalmente falla la construcción completa del libro de jugadas y nunca verá la salida formateada, especialmente la de stderr, que probablemente sea más interesante.
René
@ René tienes razón. Para eso, puede agregar ignore_errors: yesal comando original y luego algo como `- afirmar: eso:" test.rc == 0 ".
jhutar
0

Si desea verlo en un formato que prácticamente imite la salida estándar, puede usar el debugcomplemento de devolución de llamada con el debugmódulo en Ansible 2.7+ de esta manera:

- name: "Test Output"
  debug:
    msg: "{{ test_result.stdout_lines | join('\n') }}"
piedras de davey
fuente