How to remove a temp file after emailing it

32 views Asked by At

I want to remove a temp file after it has been successfully emailed, but leave it in place if the email task fails.

This is my task:

  - 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

I had to add the "changed_when" because the mail module returns "ok" when the email is successfully sent, so the handler would not normally be notified. But maybe the email operation will fail - the temp file would still get deleted.

How can I leave the file in place if the email task fails? This could happen if the SMTP server was down or misconfigured, in which case I might need to grab the file by another method. Perhaps there is a way I can treat the "ok" status as if it was "changed"?

1

There are 1 answers

1
itsmedannyc On BEST ANSWER

You can use a block error handling to leave the file in place if the email task fails. For example:

- name: Send email and conditionally remove temp file
  block:

  - 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 }}"
    changed_when: true

  - name: Remove temp file
    file:
      path: "{{ tempfilename }}"
      state: absent

  rescue:

  - name: Debug message that file was left due to failure
    debug:
      msg: "Email failed, leaving {{ tempfilename }} in place."

This will run the email and temp file removal tasks together in a block. If either fails, it will hit the rescue section and skip removing the file, as well as print a debug message that the file was left in place due to the failure.

The key is using block and rescue to define a group of tasks that succeed or fail together. This way you can take conditional action on failure.