Ansible E-Mail mit dynamischem Dateinamen senden
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
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 angegebenheader=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 habento: 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 habenheaders: '[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
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