Ansible yum 更新然后通过电子邮件将结果发送给我

Ansible yum 更新然后通过电子邮件将结果发送给我

编写一个剧本来执行 yum 更新,然后从每个服务器获取一封电子邮件。我希望电子邮件包含已更改yum.log 的内容。

换句话说,我想要的结果是:

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" [email protected]

它只是发送一封空白的电子邮件。

还尝试使用邮件功能,但却无法将多行变量转储到邮件正文中:

- 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

它也会发送,但会打印时间戳,然后为 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代码这里但对它的理解还不够深入,无法正常运行。

答案1

我不确定这是否是您唯一的问题,但有一个问题是您的with_items缩进不正确。with_items属于任务,而不是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

不过,我不确定在这种情况下你是否需要。当你循环遍历某个集合时,with_items你需要使用。with_items

因为我不知道答案,如果我处于你的位置,我会简单地从一些简单的调试任务开始,而不是邮件。一旦你看到调试的结果,你应该更容易知道你需要做什么。

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

答案2

感谢您分享您的想法@Zoredache!这很好用:

- 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

更新:我说得太早了!我通过 grep 测试了它,/var/log/messages但当我对输出执行 grep 时/var/log/yum.log,它又混在一起了,没有任何换行符。**

相关内容