Como faço para registrar a saída da tarefa em um arquivo?

9

Uma das minhas tarefas ansíveis importa um banco de dados Oracle usando impdp.

Isso gera muita saída para o console, então eu configurei no_log: True.

No entanto, quando isso falhar, quero ver o log!

Como posso fazer essa tarefa específica registrar em um arquivo e não no console?

opticíclico
fonte
Você está usando o módulo de comando?
Boicote SE para Monica Cellio
Uma idéia [mais de um hack] seria gravar os logs em algum arquivo externo e, em seguida, executar uma tarefa que faça uso da failed_whencondição e remover o arquivo de log, se o anterior. tarefa era :) bem sucedida
Dawny33
Por que você consegue ver a saída do console durante execuções bem-sucedidas? Não vi uma configuração nem achei possível mostrar stdout durante uma execução bem-sucedida da tarefa; ela deveria aparecer [ok: nome do host]. No entanto, quando um erro é detectado, a saída é despejada no console de controle ansible (e em qualquer registro ansible definido). Você se importaria em compartilhar a configuração que fornece o stdout grande durante uma execução regular bem-sucedida?
Hjindin
@hvindin Coloque -vvvdepois do ansible-playbookcomando para obter logs detalhados.
Dawny33
11
Registrar uma variável parece a melhor jogada lógica; veja meu comentário na sua resposta para obter minhas opiniões sobre o que fazer com as saídas dos comandos acionados ansible.
hvindin

Respostas:

4

[Convertendo meu comentário em uma resposta]

Uma maneira de fazer isso seria gravar os logs em algum arquivo externo e, em seguida, executar uma tarefa que utilizasse a condição failed_when, e remover o arquivo de log, se a tarefa anterior tivesse êxito.

Algo assim deve ajudá-lo.

 - name: Run Py script
      command: <>.py  > <>.log
      become: yes
      register: PyScript
      ignore_errors: True

    - name: PyScript on success
      command: rm <>.log
      when: PyScript|succeeded

Nota: Essa pode não ser a melhor maneira de lidar com seu problema. Mas, esse foi um truque que me ajudou a fazer o registro e o monitoramento.

Dawny33
fonte
2
Eu iria mais longe e diria que você poderia manter seu comando gravado em stdout / stderr e depois despejá-los como resposta a uma falha. Portanto, como um exemplo no exemplo acima, se você deseja interromper a execução no caso de uma falha, use uma tarefa de falha para gerar apenas o stdout e o stderr registrados no PyScript quando o rc! = 0 parecer uma solução mais holística. Se você usar mecanismos embutidos ansibles, se você tiver um registro ansible configurado em um servidor de controle, por exemplo, esse servidor de controle registrará a falha no log ansible. O que eu acho que seria o lugar correto para isso #
001 hvindin
3

Eu acho que tudo que você precisa fazer é registrar a saída de cada comando que você precisa (armazená-lo em uma variável) e simplesmente despejar a variável em um arquivo. Dessa forma, você pode revisá-lo mais tarde.

tasks:
  - name: Dump all vars
    action: template src=templates/dumpall.j2 dest=/tmp/ansible.all

Em seguida, em dumpall.j2:

Module Variables ("vars"):
--------------------------------
{{ vars | to_nice_json }} 

Environment Variables ("environment"):
--------------------------------
{{ environment | to_nice_json }} 

GROUP NAMES Variables ("group_names"):
--------------------------------
{{ group_names | to_nice_json }}

GROUPS Variables ("groups"):
--------------------------------
{{ groups | to_nice_json }}

HOST Variables ("hostvars"):
--------------------------------
{{ hostvars | to_nice_json }} 

O exemplo que estou usando é daqui

13dimitar
fonte
3

Eu resolvi isso adicionando

ignore_errors: true
register: results

para a tarefa no_log. Isso faz com que o ansible continue para a próxima tarefa, mesmo quando a tarefa falhar. Em seguida, para a próxima tarefa, defina uma tarefa de depuração, que sempre falha e gera a variável registrada, mas é executada apenas quando a tarefa anterior falha:

- name: Error output
  debug:
     var: results
  failed_when: true
  when:
     results is failed

Portanto, mesmo com no_log: true, isso tornará ansible a exibição da saída da tarefa que falhou. Esta solução não está registrando-a em um arquivo conforme solicitado, mas atende a sua necessidade de 'ver o log quando falhou' e, é claro, você pode redirecionar ou usar tee para gerar a saída ansível completa para um arquivo, o que, com esta solução também contém o log da tarefa com falha.

Robin Roevens
fonte
2

O que faço quando tenho um comando para executar e deseja obter o log apenas em caso de falha é o seguinte (prefixado por um coma shell e /bin/sh -c '...'no caso de o iniciador não usar uma systemchamada ou executar o comando diretamente sem o shell) :

command 2&>1 > command-log.txt || cat command-log.txt

Isso redirecionará o erro e a saída padrão para um arquivo e exibirá o conteúdo do arquivo apenas em caso de falha. Se o comando for muito detalhado e você não desejar manter o log quando estiver ok, poderá:

command 2&>1 > command-log.txt && rm command-log.txt || cat command-log.txt

Cotação &&e ||uso da página de manual sh :

O símbolo && (||) faz com que a lista a seguir seja executada apenas se o pipeline anterior retornar um valor zero (diferente de zero).

Essa provavelmente não é a maneira mais idiomática de fazê-lo com o ansible, mas tem a vantagem de ser muito portátil com qualquer sistema de gerenciamento de configuração, permitindo exibir o comando stdout.

Tensibai
fonte
0

Assumindo que o ansible lança corretamente erros no stderr, você pode capturar a saída de erros em qualquer programa em um arquivo usando o redirecionamento de saída:

some command 2> error.log

No entanto, acho que não é esse o caso.

Em vez disso, é provável que você queira consultar este guia para decidir quando ocorrerão erros http://docs.ansible.com/ansible/playbooks_error_handling.html e, em seguida, aguardar sua saída por seqüências que indicam um erro antes de gerar um arquivo

ie

ansible-playbook my-playbook | grep 'error' > error.log

yosefrow
fonte
-2

Eu acho que o que você está procurando pode ser simplesmente redirecionar stdout e street para arquivo.

Normalmente, some-command &> logfile.log

ou alguma variante ....

sparq
fonte
Como é apenas uma resposta parcial, o OP deseja ver o log, se houver erro.
Tensibai
Eu não acho que isso seja uma resposta parcial a essa pergunta. É bom para um script de shell, mas inútil para codificação em ansible .
pintainhos
@chicks Eu acho que poderia ser uma solução válida em uma abordagem de método de 'shell' dentro ansible (que eu não sei muito)
Tensibai
-2

Tee será uma ferramenta muito simples para registro, você pode consultar o seguinte comando.

eric@eric-MacBookPro:~$ ansible -m ping all | tee > /tmp/ansible.log
eric@eric-MacBookPro:~$ cat /tmp/ansible.log 
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
Eric Zhang
fonte
2
1. Isso afeta toda a execução, não apenas uma tarefa. 2. Não faz sentido percorrer o tee se você deseja redirecionar o stdout para um arquivo; não é assim que você usa o comando. 3. Se você estivesse usando o tee corretamente, ele ainda enviaria todo o spam para o console, que o OP não deseja.
Boicote SE para Monica Cellio