如何在邮件发送成功后删除临时文件,失败时保留?
Ansible邮件任务后临时文件的条件删除方案
需求
邮件发送成功后自动删除临时文件,发送失败则保留该文件。
当前配置
- name: send email mail: host: smtp.example.com port: 25 from: "{{ emailme }}" to: "{{ emailme }}" subject: "initial config script for {{ uppercase_hostname }}" body: "Here it is" attach: "{{ tempfilename }}" notify: remove temp file changed_when: true
存在的问题
mail模块发送成功默认返回ok状态,没法触发handler,所以加了changed_when: true。但担心如果邮件发送失败,临时文件还是会被handler删掉。
解决方案
方案一:精准控制changed_when的触发条件
不用把所有情况都标记为changed,只在邮件发送成功时才标记任务状态为changed,这样只有成功才会触发handler删除文件,失败时不会触发。修改后的配置如下:
- name: send email mail: host: smtp.example.com port: 25 from: "{{ emailme }}" to: "{{ emailme }}" subject: "initial config script for {{ uppercase_hostname }}" body: "Here it is" attach: "{{ tempfilename }}" register: mail_result notify: remove temp file changed_when: mail_result is succeeded
对应的handler保持正常删除逻辑即可:
handlers: - name: remove temp file file: path: "{{ tempfilename }}" state: absent
方案二:放弃handler,用条件任务直接处理
如果觉得handler的触发逻辑不好把控,可以直接在邮件任务后加一个删除任务,通过when条件判断邮件是否发送成功:
- name: send email mail: host: smtp.example.com port: 25 from: "{{ emailme }}" to: "{{ emailme }}" subject: "initial config script for {{ uppercase_hostname }}" body: "Here it is" attach: "{{ tempfilename }}" register: mail_result - name: remove temp file if email sent successfully file: path: "{{ tempfilename }}" state: absent when: mail_result is succeeded
额外说明
Ansible里,handler只会在任务执行成功且状态为changed时触发(或者通过changed_when强制标记为changed)。如果邮件任务失败,不管changed_when怎么设置,handler都不会执行——不过上面的方案能让逻辑更清晰,避免意外情况。另外,完全可以把ok状态视为changed来触发handler,只要确保这个标记只在任务成功时生效就没问题。
内容的提问来源于stack exchange,提问作者Lesley L
相关产品推荐
相关产品推荐

