Ansible E-Mail mit dynamischem Dateinamen senden

Sep 24 2020

Ich muss Ansible verwenden, um die Protokolldateien vom Remote-Server zu kopieren, umzubenennen und per E-Mail als Anhang zu senden.

Ich habe dieses Spielbuch erstellt:

---
 - hosts: WebAccessServers
   vars:
    date: "{{ lookup('pipe', 'date +%Y%m%d') }}"
   tasks:
     - name: copy web access log file from Web servers to Ansible Server and rename it
       fetch:
        src: /var/www/html/mywebapp/logs/access.log
        dest: /tmp/{{ date }}_{{ inventory_hostname }}_access.log
        flat: yes
        ignore_errors: true
        delegate_to: localhost

 - hosts: localhost
   vars:
    date: "{{ lookup('pipe', 'date +%Y%m%d') }}"
   tasks:
     - name: create variable for the attachments
       shell: "ls /tmp/{{ date }}_*.log"
       register: command_output
     - debug: msg="{{ command_output.stdout_lines }}"

     - name: Send Emails to a bunch of users, with Playbook Report as an attachment.
       mail:
        host: mysmtp.mydomain.com
        port: 25
        subject: Ansible Playbook Report
        body: This is an Email generated using Ansible after execution of task.
        from: [email protected] (Ansible Automates)
        to:
        - John Brown <[email protected]>
        attach:
        - "{{  command_output.stdout_lines }}"
        headers:
        - [email protected]
        - X-Special="Write something special about this Email"
        charset: us-ascii

Wenn ich es ausführe, erhalte ich folgende Ausgabe:

PLAY [WebAccess]


AUFGABE [Fakten sammeln] **************************************************** ********************************************************** ***************************************** ok: [Server-1] ok: [Server-2 ] ok: [Server-3]

AUFGABE [Benutzerdefinierte Webzugriffsprotokolldatei von Webservern kopieren] ****************************************** ********************************************************** ***** ok: [Server-1] ok: [Server-2] ok: [Server-3]

SPIELEN [localhost]


AUFGABE [Fakten sammeln] **************************************************** ********************************************************** ***************************************** ok: [localhost]

AUFGABE [Variable für die Anhänge erstellen] ************************************************** ********************************************************** ******************** geändert: [localhost]

TASK [debug] ****************************************************** ********************************************************** ************************************************** ok: [localhost ] => {"msg": ["/tmp/20200923_Server-1_access.log", "/tmp/20200923_Server-2_access.log", "/tmp/20200923_Server-3_access.log"]} AUFGABE [E-Mails an eine Gruppe senden von Benutzern mit Playbook-Bericht als Anhang.] ******************************************* **************************************** Während der Ausführung der Aufgabe ist eine Ausnahme aufgetreten. Verwenden Sie -vvv, um den vollständigen Traceback anzuzeigen. Der Fehler war: TypeError: Erwartetes str-, Byte- oder os.PathLike-Objekt, keine Liste fatal: [localhost]: FAILED! => {"geändert": false, "msg": "Fehler beim Senden der E-Mail: Datei ['/tmp/20200923_Server-1_access.log', 'kann nicht angehängt werden.'/tmp/20200923_Server-2_access.log ',' /tmp/20200923_Server-3_access.log ']: Erwartetes str-, Byte- oder os.PathLike-Objekt, nicht Liste "," rc ": 1} PLAY RECAP ****** ********************************************************** ********************************************************** ****************************************** Server-1: ok = geändert = 0 nicht erreichbar = 0 fehlgeschlagen = 0 übersprungen = 0 gerettet = 0 ignoriert = 0 Server-2: ok = 2 geändert = 0 nicht erreichbar = 0
fehlgeschlagen = 0 übersprungen = 0 gerettet = 0 ignoriert = 0 Server-3: ok = 2
geändert = 0 nicht erreichbar = 0 fehlgeschlagen = 0 übersprungen = 0 gerettet = 0
ignoriert = 0 localhost: ok = 3 geändert = 1 nicht erreichbar = 0 fehlgeschlagen = 1
übersprungen = 0 gerettet = 0 ignoriert = 0

Wo kann der Anhang in der E-Mail am besten dynamisch und rekursiv zugewiesen werden? Danke für die Unterstützung. Marco

Antworten

1 β.εηοιτ.βε Sep 24 2020 at 01:29

Wie in der Fehlermeldung angegeben to, attachund headerssollen keine Listen sein.

  • to: Die E-Mail-Adresse (n), an die die E-Mail gesendet wird. Dies ist eine durch Kommas getrennte Liste, die Adress- und Phrasenteile enthalten kann.
  • headers: Eine durch vertikale Balken getrennte Liste von Überschriften, die der Nachricht hinzugefügt werden sollen. Jeder einzelne Header wird als angegeben header=value(siehe Beispiel unten).
  • attach: Eine durch Leerzeichen getrennte Liste von Pfadnamen von Dateien , die an die Nachricht angehängt werden sollen . Bei angehängten Dateien wird der Inhaltstyp auf application / octet-stream festgelegt.

Quelle: https://docs.ansible.com/ansible/2.3/mail_module.html, Betonung meiner

  • Für die to, wenn Sie nur einen Empfänger haben to: John Brown <[email protected]>und wenn Sie mehrere habento: John Brown <[email protected]>, John Doe <[email protected]>
  • Für die headers, wenn Sie nur eine haben headers: '[email protected]'und wenn Sie mehrere habenheaders: '[email protected]|X-Special="Write something special about this Email"'
  • Für attachda Sie es von einem anderen der Ausgang eines anderen Aufgabe nehmen, mit Jinja joinFilter können Sie Ihre Liste in eine durch Leerzeichen getrennte String - Darstellung der genannten Liste konvertieren.

Ihre mailAufgabe sollte also eigentlich sein:

- name: Send Emails to a bunch of users, with Playbook Report as an attachment.
  mail:
    host: mysmtp.mydomain.com
    port: 25
    subject: Ansible Playbook Report
    body: This is an Email generated using Ansible after execution of task.
    from: [email protected] (Ansible Automates)
    to: John Brown <[email protected]>
    attach: "{{ command_output.stdout_lines | join(' ') }}"
    headers: '[email protected]|X-Special="Write something special about this Email"'
    charset: us-ascii
MarcoFerrara Sep 29 2020 at 20:34

Das ist meine Arbeitslösung:

---
 - hosts: myapp
   vars:
    date: "{{ lookup('pipe', 'date +%Y%m%d') }}"
   tasks:
     - name: copy access_allowed log file from MyApp servers
       fetch:
        src: /var/www/html/myapp/logs/access_allowed.log
        dest: /tmp/{{ date }}_{{ inventory_hostname }}_access_allowed.log
        flat: yes
        ignore_errors: true
        delegate_to: localhost
     - name: copy access_denied log file from MyApp servers
       fetch:
        src: /var/www/html/myapp/logs/access_denied.log
        dest: /tmp/{{ date }}_{{ inventory_hostname }}_access_denied.log
        flat: yes
        ignore_errors: true
        delegate_to: localhost

     - name: Ansible delete log file
       shell: sudo rm -rf /var/www/html/myapp/logs/access*.log

 - hosts: localhost
   vars:
    date: "{{ lookup('pipe', 'date +%Y%m%d') }}"
   tasks:
     - name: create variable for the attachments
       shell: "ls /tmp/{{ date }}_*.log"
       register: command_output

     - name: Send Emails to a bunch of users, with Playbook Report as an attachment.
       mail:
        host: my.smtp.local
        port: 25
        subject: Ansible Playbook Report
        body: This is an Email generated using Ansible after execution of task.
        from: [email protected] (Ansible Automates)
        to: John Brow <[email protected]>
        attach: "{{ command_output.stdout_lines | join(',') }}"
        headers:
        - [email protected]
        - X-Special="Write something special about this Email"
        charset: us-ascii

     - name: Ansible delete log file
       shell: sudo rm -rf /tmp/*access*.log