Назад | Перейти на главную страницу

Ansible yum update, затем пришлите мне результаты по электронной почте

Написание playbook для выполнения обновлений yum и последующего получения электронной почты с каждого сервера. Я бы хотел, чтобы письмо содержало изменено содержимое yum.log.

IOW, мне нужны результаты:

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

для отправки по электронной почте с каждого сервера.

Я пробовал использовать shell: чтобы выполнить команду grep, отправьте письмо:

    shell: grep '^`date +"%b %d"`' /var/log/yum.log | mail -s "updates applied to `hostname -s` today" updatereports@mydomain.com

Он просто отправляет пустое электронное письмо.

Также пытался использовать почтовую функцию, но я изо всех сил пытаюсь сбросить многострочную переменную в тело сообщения:

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

- name: mail result
  mail:
    to: updatereports@mydomain.com
    subject: "updates applied to {{ ansible_hostname }} today"
    body: "{{ item }}"
    with_items: "{{ updated.results|map(attribute='stdout_lines')|list }}"
  when: updated.stdout

Он также отправляет, но печатает метку времени, а затем генерирует строку ошибок для каждой совпадающей строки в 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'

Я нашел это причудливым results|map код Вот но не понимаю этого достаточно, чтобы работать без ошибок.

Я не уверен, что это ваша единственная проблема, но одна проблема в том, что вы with_items имеет неправильный отступ. В with_items принадлежит задаче, а не mail.

- name: mail result
  mail:
    to: updatereports@mydomain.com
    subject: "updates applied to {{ ansible_hostname }} today"
    body: "{{ item }}"
  with_items: "{{ updated.results|map(attribute='stdout_lines')|list }}"
  when: updated.stdout

Я не совсем уверен, нужен ли вам with_items на всех в этом случае хотя. Вам нужно использовать with_items когда вы перебираете какую-то коллекцию.

Поскольку я не знаю ответа, если бы я был на вашем месте, я бы просто начал с некоторых простых задач отладки вместо почты. Как только вы увидите результаты отладки, вам будет намного легче понять, что вам нужно делать.

- name: mail result
  debug:
    msg: "{{ updated }}"
- name: mail result
  debug:
    msg: ""{{ updated.results|map(attribute='stdout_lines')|list }}""

Спасибо, что поделились своими идеями @Zoredache! Это прекрасно работает:

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

- name: mail result
  mail:
    to: updatereports@mydomain.com
    subject: "updates applied to {{ ansible_hostname }} today"
    body: "{{ updated.stdout }}"
  when: updated.stdout

Обновить: Я слишком рано заговорил! Я тестировал это с помощью grepping /var/log/messages но когда я выполняю команду grep /var/log/yum.log вывод снова смешивается без разрывов строк. **