Mostrar la salida del libro de jugadas de Ansible con el formato adecuado

Mostrar la salida del libro de jugadas de Ansible con el formato adecuado

¿Qué configuración se necesita para formatear correctamente la salida de flujo estándar de las tareas en una ansible-playbookejecución de Ansible?

Lo que ejecuto ansible-playbook foo.yamlcomo resultado de las tareas incluye el contenido de flujo estándar ( stdout, stderr). Pero la visualización de estos se realiza en un gran blob JSON de una sola línea y no se imprime como las líneas formateadas que se enviaron a la secuencia.

TASK [Django: Collect media fixture files] ******************************************************************************
ok: [lorem]

TASK [Django: Create superuser] ******************************************************************************
fatal: [lorem]: FAILED! => {"changed": false, "cmd": "python3 -m django createsuperuser\n  --noinput\n  --username \"admin\"\n  --email \"[email protected]\"", "msg": "\n:stderr: CommandError: You must use --full_name with --noinput.\n", "path": "/var/local/dolor/virtualenv/rectory/venv.py3.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/games", "syspath": ["/tmp/ansible_django_manage_payload_uj9f3le8/ansible_django_manage_payload.zip", "/usr/lib/python37.zip", "/usr/lib/python3.7", "/usr/lib/python3.7/lib-dynload", "/usr/local/lib/python3.7/dist-packages", "/usr/lib/python3/dist-packages"]}

¿Qué está causando este formato no deseado de la salida?¿Cómo puedo decirle a Ansible que siempre formatee correctamente la salida de la transmisión para su visualización?en la ansible-playbooksalida?

Respuesta1

Ansible tiene como valor predeterminado una salida JSON legible por máquina, no adecuada para la lectura humana. Pero hay otrosMódulos de “devolución de llamada” disponibles, algunos de los cuales pueden formatear la salida de la transmisión.

  • El nombre engañosodebugmóduloEs más adecuado para la visualización humana.
  • Recientemente, elyamlmóduloformatea la salida de la transmisión como un documento YAML fácil de leer.

Entonces, usando la ANSIBLE_STDOUT_CALLBACKvariable de entorno:

$ ANSIBLE_STDOUT_CALLBACK=yaml ansible-playbook ansible/deploy.yaml

cambiará el formato de la salida del flujo:

[…]
TASK [Django: Collect media fixture files] ******************************************************************************
ok: [lorem]

TASK [Django: Create superuser] ******************************************************************************
fatal: [lorem]: FAILED! => changed=false
  cmd: |-
    python3 -m django createsuperuser
      --noinput
      --username "admin"
      --email "[email protected]
  msg: |-
    stderr: |-
      CommandError: You must use --full_name with --noinput.
    path: "/var/local/dolor/virtualenv/rectory/venv.py3.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/games"
    syspath: 
    - /tmp/ansible_django_manage_payload_uj9f3le8/ansible_django_manage_payload.zip
    - /usr/lib/python37.zip
    - /usr/lib/python3.7
    - /usr/lib/python3.7/lib-dynload
    - /usr/local/lib/python3.7/dist-packages
    - /usr/lib/python3/dist-packages

Respuesta2

1. Crear archivo de configuración

Para obtener la salida del libro de estrategias de Ansible con un bonito formato JSON, cree un archivo de configuración:

  • ya sea ansible.cfg, en el mismo directorio que el archivo del libro de estrategias de Ansible
  • o en el directorio de inicio, comenzando con un punto,~/.ansible.cfg
  • o en/etc/ansible/ansible.cfg

Fuente:https://docs.ansible.com/ansible/latest/reference_appendices/config.html

Prima: debugtambién da bonitosalida estándar,stderrymensaje.

Contenido del archivo:

[defaults]
stdout_callback=debug

2. Ejecute el libro de jugadas

Ejecute el libro de jugadas exactamente de la misma manera que antes.

ansible-playbook foo.yaml

Comparación

Antes:

TASK [Django: Collect media fixture files] ******************************************************************************
ok: [lorem]

TASK [Django: Create superuser] ******************************************************************************
fatal: [lorem]: FAILED! => {"changed": false, "cmd": "python3 -m django createsuperuser\n  --noinput\n  --username \"admin\"\n  --email \"[email protected]\"", "msg": "\n:stderr: CommandError: You must use --full_name with --noinput.\n", "path": "/var/local/dolor/virtualenv/rectory/venv.py3.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/games", "syspath": ["/tmp/ansible_django_manage_payload_uj9f3le8/ansible_django_manage_payload.zip", "/usr/lib/python37.zip", "/usr/lib/python3.7", "/usr/lib/python3.7/lib-dynload", "/usr/local/lib/python3.7/dist-packages", "/usr/lib/python3/dist-packages"]}

Después:

TASK [Django: Collect media fixture files] ******************************************************************************
ok: [lorem]

TASK [Django: Create superuser] ******************************************************************************
fatal: [lorem]: FAILED! => {
  "changed": false,
  "cmd": "python3 -m django createsuperuser\n  --noinput\n  --username \"admin\"\n  --email \"[email protected]\"",
  "msg": "\n:stderr: CommandError: You must use --full_name with --noinput.\n",
  "path": "/var/local/dolor/virtualenv/rectory/venv.py3.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/games",
  "syspath": [
    "/tmp/ansible_django_manage_payload_uj9f3le8/ansible_django_manage_payload.zip",
    "/usr/lib/python37.zip",
    "/usr/lib/python3.7",
    "/usr/lib/python3.7/lib-dynload",
    "/usr/local/lib/python3.7/dist-packages",
    "/usr/lib/python3/dist-packages"
  ]
}

STDERR:

CommandError: You must use --full_name with --noinput.



MSG:

CommandError: You must use --full_name with --noinput.

información relacionada