You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在邮件发送成功后删除临时文件,失败时保留?

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 07:03:40