We have more than 1000 VMs running on different Hyper-V nodes. I want to create a report in CSV format for one systemd service status.
For example, I would like to check the running status of postfix whether it's in state started or stopped. These statuses need to be print into CSV file format.
Expected result as below format
CodePudding user response:
Finally, I got solution for this above request. Here is the code below, helpful for others
Thanks to the gregsowell blog helped me get these done. https://gregsowell.com/?p=7289
---
- name: Generate an HTML report from jinja template
hosts: postfix-hosts
gather_facts: true
vars:
#email settings
email_subject: System status Report
email_host: stackoverflw.smtp.com
email_from: [email protected]
email_to: [email protected]
#random settings
csv_path: /tmp
csv_filename: report.csv
headers: Hostname,OS,Distro Ver,Kernel Ver,Postfix Status,FQDN,Total VCPU,Total RAM,Total SWAP,Total Disk,Hyper-V
tasks:
- name: Gather last Postfix Status
ansible.builtin.shell: systemctl status postfix | egrep -i Active | awk '{ print $2,$3}'
register: active
- name: Save CSV headers
ansible.builtin.lineinfile:
dest: "{{ csv_path }}/{{ csv_filename }}"
line: "{{ headers }}"
create: true
state: present
delegate_to: localhost
run_once: true
- name: Build out CSV file
ansible.builtin.lineinfile:
dest: "{{ csv_path }}/{{ csv_filename }}"
line: "{{ inventory_hostname }},{{ ansible_distribution }},{{ ansible_distribution_version }},{{ ansible_kernel }},{{ active.stdout }},{{ ansible_fqdn }},{{ ansible_processor_vcpus }},{{ ansible_memtotal_mb }},{{ ansible_swaptotal_mb }},{{ ansible_devices.vda.partitions.vda1.size }},{{ ansible_product_name }}"
create: true
state: present
delegate_to: localhost
- name: Read in CSV to variable
community.general.read_csv:
path: "{{ csv_path }}/{{ csv_filename }}"
register: csv_file
delegate_to: localhost
run_once: true
# - name: debug csv_file
# debug:
# var: csv_file
# run_once: true
- name: Send Email
community.general.mail:
host: "{{ email_host }}"
from: "{{ email_from }}"
port: 25
to: "{{ email_to }}"
subject: "[Ansible] {{ email_subject }}"
body: "{{ lookup('template', 'report.html.j2') }}"
attach: "{{ csv_path }}/{{ csv_filename }}"
subtype: html
delegate_to: localhost
run_once: true
report.html.j2
<table style="border: 1px solid black; border-collapse: collapse;">
<tr>
{% for header in headers.split(",") %}
<th style="border: 1px solid black; padding: 8px 16px;">{{ header }}</th>
{% endfor %}
</tr>
{% for host in csv_file.list %}
<tr>
{% for header in headers.split(",") %}
<td style="border: 1px solid black; padding: 8px 16px;">{{ host[header] }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>

