Ansible yum update然后给我发电子邮件的结果

编写一个手册来执行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 

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

也尝试使用邮件function,但我正在努力转储一个多行variables到消息的正文:

 - 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

由于我不知道答案,如果我在你的鞋子里,我只是简单地从一些简单的debugging任务开始,而不是邮件。 一旦你看到debugging的结果,应该很容易看到你需要做什么。

 - 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/messagestesting它,但是当我在/var/log/yum.log上执行grep时,输出被再次混合在一起而没有任何换行符。