Skip to main content

Command Palette

Search for a command to run...

Respondiendo a Eventos de manera automatizada, con Ansible Rulebooks.

Aprovecha los eventos para automatizar acciones y reducir esfuerzos de manera eficiente.

Updated
4 min read
Respondiendo a Eventos de manera automatizada, con Ansible Rulebooks.

La automatización basada en eventos permite al equipo de SecOps ejecutar acciones predefinidas automáticamente en respuesta a eventos específicos dentro de un entorno. Este enfoque mejora la eficiencia operativa al reducir la intervención manual y permite que los sistemas se adapten rápidamente a las condiciones cambiantes. Ansible nos ayuda al incorporar funciones basadas en eventos para ofrecer soporte a una automatización dinámica y receptiva.

Arquitectura

Para emplear la Automatización de Ansible Basada en Eventos, es fundamental entender tres conceptos:

  1. Fuente de Eventos

  2. Ansible Rulebooks

  3. Acciones

Las fuentes son el origen de los eventos que desencadenarán el proceso para ser evaluado por las condiciones del ansible rulebook. Si se cumplen estas condiciones, se procederá a ejecutar un playbook, un módulo o, en su defecto, invocar un script. Esto hace de esta herramienta una excelente opción para diversos casos de uso.

Instalación

Vamos a actualizar.

sudo apt update && sudo apt upgrade -y

Ahora es el turno de Java.

sudo apt install openjdk-17-jdk
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$PATH:~/.local/bin

Vamos agregar Python3 con Pip, siempre necesario, y Pipx para tener en todo nuestro entorno ansible.

sudo apt install python3 python3-pip pipx ansible-core
pipx install ansible
pipx install ansible-rulebook
pipx install ansible-runner

Ahora la frutilla del postre, ansibe.eda.

ansible-galaxy collection install ansible.eda

Ya tenemos nuestro servidor, listo.

Prueba de Concepto

Este es un ejemplo de ansible-rulebook para supervisar cambios utilizando el módulo ansible.eda.file_watch. Envía un mensaje a Slack cuando se cumple la condición event.change == "modified" o event.change == "created". En mi caso, quiero supervisar /home/santiago/data, pero ¿no sería una buena idea monitorear, por ejemplo, /etc/passwd, /etc/shadow?

filewatch.yml
---
- name: Monitor /home/santiago for file changes
  hosts: localhost
  sources:
    - name: file_watch
      ansible.eda.file_watch:
        path: /home/santiago/data
        recursive: true
        exclude_patterns:
          - "*.log"
          - "*.tmp"
  rules:
    - name: Notify Slack if a file is modified
      condition: event.change == "modified" and event.type == "FileModifiedEvent"
      action:
        run_playbook:
          name: notify-slack.yml
          extra_vars:
            event_path: "{{ event.src_path }}"
            event_change: "{{ event.change }}"
      throttle:
        once_within: "60 seconds"  # Formato correcto: "60 seconds"
        group_by_attributes:       # Agrupa eventos por estos atributos
          - src_path              # Agrupa por la ruta del archivo

    - name: Notify Slack if a new file is created
      condition: event.change == "created" and event.type == "FileCreatedEvent"
      action:
        run_playbook:
          name: notify-slack.yml
          extra_vars:
            event_path: "{{ event.src_path }}"
            event_change: "{{ event.change }}"
      throttle:
        once_within: "60 seconds"  # Formato correcto: "60 seconds"
        group_by_attributes:       # Agrupa eventos por estos atributos
          - src_path              # Agrupa por la ruta del archivo

Si estas condiciones se cumplen, ejecuta notify-slack.yml.

notify-slack.yml
---
- name: Send Slack Notification
  hosts: localhost
  tasks:
    - name: Debug event variables
      debug:
        msg:
          - "Event Path: {{ event_path }}"
          - "Event Change: {{ event_change }}"

    - name: Send message to Slack
      community.general.slack:
        token: "ACA_TOKEN" # Seria mejor que esto este como variable en un .ini o hagas un export
        channel: "#alarms" # Este es el canal que uso.
        msg: "🚨 Archivo detectado en /home/santiago/data: {{ event_path }} ({{ event_change }})"
        username: "Ansible Bot"
💡
Si no sabes como crear una aplicacion en Slack, para poder interactuar en el feed. Revisa esta documentacion.

Creamos nuestro inventorio, en mi caso solo lo hare local pero podrias tener una granja de servidores a monitorear. Vamos a llamarlo inventory.yml.

all:
  children:
    ungrouped:
      hosts:
        localhost:
          ansible_connection: local

Ejecutamos Ansible Event Drive Automation de la siguiente manera, haciendo referencia al inventario de activos y al playbook.

ansible-rulebook -i inventory.yml -r filewatch.yml

Primero, creamos el archivo.txt y luego realizamos una modificación. Aquí observamos cómo se ejecutan los eventos y se notifican en Slack. La creación provoca una modificación al guardarlo.

Aquí están los mensajes que nos llegan a Slack.

Conclusion

Con EDA no tenemos límites; podemos aplicarlo a múltiples escenarios, como responder ante incidentes, escalar infraestructura, reiniciar servicios o cumplir con regulaciones. Sin duda, es un aliado al considerar la operación de SecOps o DevOps. ¡Dejemos volar la imaginación!

Referencias

https://developers.redhat.com/articles/2024/04/12/event-driven-ansible-rulebook-automation#ansible_rulebook_cli_setup

https://dzone.com/articles/ansible-event-driven-automation-real-time-operations

Automated Event Handling with Ansible Rulebooks