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:
Fuente de Eventos
Ansible Rulebooks
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"
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://dzone.com/articles/ansible-event-driven-automation-real-time-operations
Subscribe to my newsletter
Read articles from Santiago Fernandez directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Santiago Fernandez
Santiago Fernandez
I have a bachelor's degree in Technology from the University of Palermo, a Master in Information Security from the University of Murcia and different certifications such as CISSP | CISM | CDPSE | CCSK | CSX | MCSA | SMAC™️ | DSOE | DEPC | CSFPC | CSFPC | 5x AWS Certified. He is currently CISO at Klar, a Mexican Fintech. He was fortunate to be awarded as CISO of the Year in Argentina in 2021 and was among the Top 100 CISO's in the World in 2022. A lover of new technologies, he has developed a career in DevSecOps and Cloud Security at Eko Party, the largest security conference in Latin America.