Qual configuração é necessária para formatar corretamente a saída de fluxo padrão das tarefas em uma ansible-playbook
execução do Ansible?
O que executo ansible-playbook foo.yaml
a saída das tarefas inclui o conteúdo do fluxo padrão ( stdout
, stderr
). Mas a exibição deles está em um grande blob JSON de linha única e não é impressa como as linhas formatadas que foram enviadas para o fluxo.
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"]}
O que está causando essa formatação indesejada da saída?Como posso dizer ao Ansible para sempre formatar a saída do stream corretamente para exibição?na ansible-playbook
saída?
Responder1
O padrão do Ansible é uma saída JSON legível por máquina, não adequada para leitura humana. Mas existem outrosMódulos de “retorno de chamada” disponíveis, alguns dos quais podem formatar a saída do stream.
- O nome enganoso
debug
móduloé mais adequado para visualização humana. - Recentemente, o
yaml
móduloformata a saída do fluxo como um documento YAML fácil de ler.
Então, usando a ANSIBLE_STDOUT_CALLBACK
variável de ambiente:
$ ANSIBLE_STDOUT_CALLBACK=yaml ansible-playbook ansible/deploy.yaml
mudará a formatação da saída do stream:
[…]
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
Responder2
1. Crie um arquivo de configuração
Para obter a saída do playbook Ansible bem formatada como JSON bonito, crie um arquivo de configuração:
- ou
ansible.cfg
, no mesmo diretório do arquivo do playbook Ansible - ou no diretório inicial, começando com um ponto,
~/.ansible.cfg
- ou em
/etc/ansible/ansible.cfg
Fonte:https://docs.ansible.com/ansible/latest/reference_appendices/config.html
Bônus: debug
também dá bonitosaída padrão,stderremensagem.
Conteúdo do arquivo:
[defaults]
stdout_callback=debug
2. Execute o manual
Execute o manual exatamente da mesma maneira que antes.
ansible-playbook foo.yaml
Comparação
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"]}
Depois:
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.