Ansible yum update então me mande os resultados

3

Escrevendo uma cartilha para executar as atualizações do yum e depois receber um e-mail de cada servidor. Eu gostaria que o email contivesse o conteúdo alterado do yum.log.

IOW, quero os resultados de:

grep [today's date] /var/log/yum.log

para ser enviado por e-mail de cada servidor.

Eu tentei usar shell: para executar o grep e enviar o e-mail:

    shell: grep '^'date +"%b %d"'' /var/log/yum.log | mail -s "updates applied to 'hostname -s' today" [email protected]

Apenas envia um email em branco.

Também tentei usar a função de e-mail, mas estou com dificuldades para despejar uma variável de várias linhas no corpo da mensagem:

- name: test result
  ignore_errors: yes
  shell: grep "'date '+%b %d''" /var/log/messages
  register: updated

- name: mail result
  mail:
    to: [email protected]
    subject: "updates applied to {{ ansible_hostname }} today"
    body: "{{ item }}"
    with_items: "{{ updated.results|map(attribute='stdout_lines')|list }}"
  when: updated.stdout

Ele também envia, mas imprime o timestamp e gera uma linha de erros para cada linha correspondente no yum.log:

['Sep 12 16:15:28 host-ng ansible-command: Invoked with warn=True executable=None _uses_shell=True _raw_params=grep "'date \'+%b %d\''" /var/log/messages | tail removes=None creates=None chdir=None'

Encontrei esse código results|map de fantasia aqui mas não entendi o suficiente para trabalhar sem erros.

    
por Mike 14.09.2017 / 00:04

2 respostas

3

Não tenho certeza se é seu único problema, mas um problema é que seu with_items é indentado incorretamente. O with_items pertence a uma tarefa, não a mail .

- name: mail result
  mail:
    to: [email protected]
    subject: "updates applied to {{ ansible_hostname }} today"
    body: "{{ item }}"
  with_items: "{{ updated.results|map(attribute='stdout_lines')|list }}"
  when: updated.stdout

Eu não tenho certeza se você precisa do with_items neste caso, no entanto. Você precisa usar with_items quando estiver passando por uma coleção de algo.

Como eu não sei a resposta, se eu estivesse em seu lugar, eu simplesmente começaria com algumas tarefas simples de depuração, em vez do e-mail. Depois de ver os resultados da depuração, deve ser muito mais fácil ver o que você precisa fazer.

- name: mail result
  debug:
    msg: "{{ updated }}"
- name: mail result
  debug:
    msg: ""{{ updated.results|map(attribute='stdout_lines')|list }}""
    
por 14.09.2017 / 00:30
2

Obrigado por compartilhar suas ideias @Zoredache! Isso funciona muito bem:

- name: test result
  ignore_errors: yes
  shell: grep "'date '+%b.%d''" /var/log/yum.log
  register: updated

- name: mail result
  mail:
    to: [email protected]
    subject: "updates applied to {{ ansible_hostname }} today"
    body: "{{ updated.stdout }}"
  when: updated.stdout

Atualização : falei cedo demais! Eu estava testando com grepping /var/log/messages , mas quando executo o grep em /var/log/yum.log , a saída é mesclada novamente sem nenhuma quebra de linha. **

    
por 14.09.2017 / 21:30