Exibir a saída do playbook Ansible formatada corretamente

Exibir a saída do playbook Ansible formatada corretamente

Qual configuração é necessária para formatar corretamente a saída de fluxo padrão das tarefas em uma ansible-playbookexecução do Ansible?

O que executo ansible-playbook foo.yamla 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-playbooksaí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 enganosodebugmóduloé mais adequado para visualização humana.
  • Recentemente, oyamlmóduloformata a saída do fluxo como um documento YAML fácil de ler.

Então, usando a ANSIBLE_STDOUT_CALLBACKvariá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: debugtambé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.

informação relacionada