# 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.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1741788147344/76ef92de-f7a1-40f5-b0e3-879d2a562d39.png align="center")

## Instalación

Vamos a actualizar.

```bash
sudo apt update && sudo apt upgrade -y
```

Ahora es el turno de Java.

```bash
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.

```bash
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`.

```bash
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`?

```yaml
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`.

```yaml
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"
```

<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Si no sabes como crear una aplicacion en Slack, para poder interactuar en el feed. Revisa esta <a target="_self" rel="noopener noreferrer nofollow" href="https://api.slack.com/tutorials/tracks/getting-a-token" style="pointer-events: none">documentacion</a>.</div>
</div>

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

```bash
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.

```yaml
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.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1741736017995/b2a47054-8cbb-4f6b-931e-38e879e30593.png align="center")

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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1741736118771/889bc4c3-d91f-4fd1-971d-122504ed1278.png align="center")

## 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://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](https://dzone.com/articles/ansible-event-driven-automation-real-time-operations)
