¿Qué configuración se necesita para formatear correctamente la salida de flujo estándar de las tareas en una ansible-playbook
ejecución de Ansible?
Lo que ejecuto ansible-playbook foo.yaml
como 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-playbook
salida?
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ñoso
debug
móduloEs más adecuado para la visualización humana. - Recientemente, el
yaml
móduloformatea la salida de la transmisión como un documento YAML fácil de leer.
Entonces, usando la ANSIBLE_STDOUT_CALLBACK
variable 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: debug
tambié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.