2 votos

Ansible una alerta de correo electrónico para todos los hosts

¿Alguien sabe cómo agrupar todos los resultados en 1 alerta de correo electrónico? Creé un libro de jugadas para verificar el sistema de archivos de solo lectura y alertar cuando encuentra uno. pero el problema es que si 2 servidores tienen el problema, recibo 2 alertas por correo electrónico. Necesito una alerta única para todos los hosts problemáticos. Cualquier ayuda será apreciada. :) Intenté muchas cosas, pero recibo una única alerta para los hosts individuales y se inunda mi bandeja de entrada.

 ---

- hosts: free

remote_user: snail

gather_facts: false


tasks:

- name: run echo Command

shell: if grep "[[:space:]]ro[[:space:],]" /proc/mounts | grep -v tmpfs > /dev/null ; then echo 'read-only-FS';else echo 'all_good'; fi

register: outcome


- name: get the IP address

shell: hostname

register: host_name


- name: Send Mail Alert

local_action: mail

host="mailxxxx"

subject="[Read-Only FS] Testing Mail"

body="Read-Only FileSystem on {{ host_name.stdout }}"

to="snail@google.com"

from="root"

when: outcome.stdout == "read-only-FS"
 

2voto

smallB Puntos 3231

La más sencilla que se me ocurre es la siguiente:

  1. Compruebe si hay archivos con algo de "al azar", nombre como "/tmp/ansible-mail". Esto debería ser delegate_to=localhost y run_once=True. Si no es el archivo que debe ser eliminado. (archivo de módulo con state=absent)
  2. Compruebe si FS ha cambiado a registrar.
  3. Si 2 es cambiado anexar a este archivo - Debido a varios host puede anexar el serial=1 podría ser una opción, delegate_to=localhost.
  4. Comprobar la existencia de un "azar" archivo de registro. Delegar en localhost y el conjunto de run_once.
  5. Si 4 es verdadera. A continuación, ejecute de correo. Una vez más, con la delegación y run_once.

Si es necesario puedo hacer simple POC.

EDITAR:

---
- hosts: tmp1, tmp2
  # user, become etc should normaly be set in ansible.cfg
  user: ansible
  become: true
  vars:
    mail_body_file: "/tmp/ansible-mailing-tmp123" 
  tasks:
    - name: Check if there is {{mail_body_file}}
      file:
        state: absent
        path: "{{mail_body_file}}"
      delegate_to: localhost
      run_once: true
      become: false

    - name: Task looking for change, command always reports change so I used it for testing
      command: "echo 123"  
      register: my_test

    - name: Create {{mail_body_file}}
      file:
        state: touch
        path: "{{mail_body_file}}"
      delegate_to: localhost
      run_once: true
      become: false
    # Use shell because lineinfile has race condition
    # with echo >> we put race condition problem on filesystem
    - name: add line about change on host
      shell: "echo {{inventory_hostname}} has change >> {{mail_body_file}}"
      delegate_to: localhost
      when: my_test.changed
      become: false

    - name: get the mail body to variable
      register: mail_body
      command: "cat {{mail_body_file}}"
      delegate_to: localhost
      run_once: True

    - name: mail about change
      mail:
        body: "{{mail_body.stdout}}"
        to: "there@was.my.mail"
        from: "root"
        subject: "Test"
      delegate_to: localhost
      run_once: True

Por favor, tenga en cuenta que usted debe probar.

2voto

Zoredache Puntos 84524

Un libro de jugadas como este podría funcionar.

Tenemos dos juegos separados en el libro de jugadas, en el primer juego nos conectamos a los hosts remotos y reunimos los resultados. En la segunda jugada ejecutamos en el host local, y enviamos el correo. Se utiliza una plantilla jinja en línea que recorrerá todos los hosts que coincidan con el patrón de hosts definido en hosts_pattern .

 ---
- name: gather data
  hosts: linux_systems
  gather_facts: false
  tasks:

  - name: Command to check systems for ead only mounts
    shell: >
      if grep "[[:space:]]ro[[:space:],]" /proc/mounts |
        grep -v tmpfs > /dev/null ; then
      echo 'read-only-FS';else echo 'all_good'; fi
    register: read_only_check

  - name: Get the output of `hostname`
    command: hostname
    register: host_name

- name: email report
  hosts: localhost
  gather_facts: false
  vars:
    hosts_pattern: linux_systems
  tasks:

  - name: Email report of systems with read only filesystems
    mail:
      host: some-smtp.server.example.com
      port: 25
      to: John Smith <john.smith@example.com>
      subject: "[Read-Only FS] Testing Mail"
      body: |
        Report from playbook check_readonly_filesystems.

        {% for host_item in lookup('inventory_hostnames', hosts_pattern, wantlist=True) %}
        {% if read_only_check is defined and
              read_only_check.stdout is defined and
              read_only_check.stdout == "read-only-FS" %}
        Read only - {{ hostvars[host_item]['inventory_hostname'] }} aka {{ hostvars[host_item]['host_name'].stdout }}
        {% else %}
        Good host - {{ hostvars[host_item]['inventory_hostname'] }} aka {{ hostvars[host_item]['host_name'].stdout }}
        {% endif %}
        {% endfor %}
 

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: