Como obtenho registros / detalhes de execuções do módulo ansible-playbook?

95

Digamos que eu execute o seguinte.

$ cat test.sh
#!/bin/bash
echo Hello World
exit 0

$ cat Hello.yml
---

- hosts: MyTestHost
  tasks:
  - name: Hello yourself
    script: test.sh


$ ansible-playbook  Hello.yml

PLAY [MyTestHost] ****************************************************************

GATHERING FACTS ***************************************************************
ok: [MyTestHost]

TASK: [Hello yourself] ********************************************************
ok: [MyTestHost]

PLAY RECAP ********************************************************************
MyTestHost                    : ok=2    changed=0    unreachable=0    failed=0

$

Tenho certeza de que foi um sucesso.

Onde / como vejo o "Hello World" ecoado / impresso pelo meu script no host remoto (MyTestHost)? Ou o código de retorno / saída do script?

Minha pesquisa me mostra que seria possível escrever um plugin para interceptar callbacks de execução de módulo ou algo nessas linhas e escrever um arquivo de log. Prefiro não perder meu tempo com isso.

Por exemplo, algo como o stdout abaixo (observe que estou executando o ansible e não o ansible-playbook):

$ ansible plabb54 -i /project/plab/svn/plab-maintenance/ansible/plab_hosts.txt -m script -a ./test.sh
plabb54 | success >> {
    "rc": 0,
    "stderr": "",
    "stdout": "Hello World\n"
}

$
Kashyap
fonte

Respostas:

113

Se você passar a -vsinalização para ansible-playbook na linha de comando, verá o stdout e o stderr para cada tarefa executada:

$ ansible-playbook -v playbook.yaml

O Ansible também possui suporte integrado para registro. Adicione as seguintes linhas ao seu arquivo de configuração ansible :

[defaults] 
log_path=/path/to/logfile

O Ansible procurará em vários lugares o arquivo de configuração:

  • ansible.cfg no diretório atual onde você executou ansible-playbook
  • ~/.ansible.cfg
  • /etc/ansible/ansible.cfg
Lorin Hochstein
fonte
8
Obrigado. Apenas ganancioso: Posso iniciar / parar o registro de um manual de forma dinâmica? Como set -xe set +xem um script de shell.
Kashyap
@thekashyap Não acho que isso seja possível no momento.
Lorin Hochstein
9
Você pode usar o no_log: Truesinalizador para impedir que um comando ou manual de log, mas isso é o mais refinado possível, eu acredito.
Ade Miller
4
Você poderia descrever como faço logrotatepara log_pathque cada ansibleexecução tenha um arquivo diferente (com o comando / playbook incluído no arquivo)?
mosca de isopor
Eu precisava de três vs para obter stdout e stderr
rico em
24

A tarefa de script do playbook será gerada stdoutexatamente como o comando não-playbook, ele só precisa ser salvo em uma variável usando register. Assim que tivermos isso, o módulo de depuração pode imprimir no fluxo de saída do manual.

tasks:
- name: Hello yourself
  script: test.sh
  register: hello

- name: Debug hello
  debug: var=hello

- name: Debug hello.stdout as part of a string
  debug: "msg=The script's stdout was `{{ hello.stdout }}`."

A saída deve ser semelhante a esta:

TASK: [Hello yourself] ******************************************************** 
changed: [MyTestHost]

TASK: [Debug hello] *********************************************************** 
ok: [MyTestHost] => {
    "hello": {
        "changed": true, 
        "invocation": {
            "module_args": "test.sh", 
            "module_name": "script"
        }, 
        "rc": 0, 
        "stderr": "", 
        "stdout": "Hello World\r\n", 
        "stdout_lines": [
            "Hello World"
        ]
    }
}

TASK: [Debug hello.stdout as part of a string] ******************************** 
ok: [MyTestHost] => {
    "msg": "The script's stdout was `Hello World\r\n`."
}
joemaller
fonte
mas a tarefa Olá a si mesmo não deu nenhum padrão
Saurabh Chandra Patel
Este é o meu método preferido. Aprenda a usar os valores de variáveis ​​registradas em instruções de depuração e o mundo será sua ostra.
Joshua K
14

Também existe outra maneira de gerar arquivo de log.

Antes de executar, ansible-playbookexecute os seguintes comandos para habilitar o registro:

  • Especifique a localização do arquivo de log.

    exportar ANSIBLE_LOG_PATH = ~ / ansible.log

  • Habilitar depuração

    export ANSIBLE_DEBUG = True

  • Para verificar o arquivo de log gerado.

    menos $ ANSIBLE_LOG_PATH

Kamlesh
fonte
1
ANSIBLE_DEBUG é uma espécie de separado da especificação de um arquivo de log. É até separado da seleção de verbosidade! Isso ainda é muito bom de se chamar - debug lhe dará mensagens de depuração orientadas para o desenvolvedor, em nível de verbosidade absolutamente extremo. É bom ter por perto.
AlanSE de
4

Plugins oficiais

Você pode usar os plug-ins de retorno de chamada de saída . Por exemplo, a partir do Ansible 2.4, você pode usar o plug-in de retorno de chamada de saída de depuração :

# In ansible.cfg:
[defaults]
stdout_callback = debug

(Alternativamente, execute export ANSIBLE_STDOUT_CALLBACK=debugantes de executar seu manual)

Importante: você deve executar ansible-playbookcom a opção -v( --verbose) para ver o efeito. Com stdout_callback = debugset, a saída deve ser semelhante a esta:

TASK [Say Hello] ********************************
changed: [192.168.1.2] => {
    "changed": true,
    "rc": 0
}

STDOUT:


Hello!



STDERR:

Shared connection to 192.168.1.2 closed.

Existem outros módulos além do debugmódulo se você quiser que a saída seja formatada de forma diferente. Há json, yaml, unixy, dense, minimal, etc. ( lista completa ).

Por exemplo, com stdout_callback = yaml, a saída será semelhante a esta:

TASK [Say Hello] **********************************
changed: [192.168.1.2] => changed=true 
  rc: 0
  stderr: |-
    Shared connection to 192.168.1.2 closed.
  stderr_lines:
  - Shared connection to 192.168.1.2 closed.
  stdout: |2-

    Hello!
  stdout_lines: <omitted>

Plug-ins de terceiros

Se nenhum dos plug-ins oficiais for satisfatório, você pode tentar o human_logplug - in. Existem algumas versões:

Fluxo
fonte
3

Usando plug-ins de retorno de chamada, você pode ter o stdout de sua saída de comandos em formato legível com o play: gist: human_log.py

Edite, por exemplo, saída:

 _____________________________________
< TASK: common | install apt packages >
 -------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


changed: [10.76.71.167] => (item=htop,vim-tiny,curl,git,unzip,update-motd,ssh-askpass,gcc,python-dev,libxml2,libxml2-dev,libxslt-dev,python-lxml,python-pip)

stdout:
Reading package lists...
Building dependency tree...
Reading state information...
libxslt1-dev is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 24 not upgraded.


stderr:

start:
2015-03-27 17:12:22.132237

end:
2015-03-27 17:12:22.136859
J0hnG4lt
fonte
1

Ajuda de linha de comando Ansible, como ansible-playbook --helpmostra como aumentar o detalhamento da saída configurando o modo detalhado (-v) para mais detalhamento (-vvv) ou para o detalhamento de depuração de conexão (-vvvv). Isso deve fornecer alguns dos detalhes que você procura no stdout, que podem ser registrados.

Zach Weg
fonte