Event Driven Ansible, what, why and how?
Ansible Playbooks is the known term, now there is a new term which is being floted in the project, which is Ansible Rulebooks. Today we are going to discuss about Ansible's journey from Playbook to Rulebook rather Playbook with Rulebook.
What is Event Driven Ansible?
What is Event Driven Ansible? In simple terms, some action is triggered by some events. The idea of EDA comes from Event driven architecture. Event driven ansible runs code automatically based on received event notifications.
Some important terms:
What is event in Event Driven Ansible?
The event is the notification of a certain incident.
Where do we get the events from?
We get the events from event sources. Ansible EDA provides different pulgins to support various event sources. There are several event source plugins such as :
url_check (checking the http status code), webhook (providing and checking events from webhook), journald (monitoring the journald logs) and the list goes on.
When to take actions?
Rulebook defines conditions and actions in case of fulfilling those actions. Conditions use operators as strings, boolean and numerical data. And actions are occurrence of events once the conditions are met. Running a playbook, setting a fact, running a module etc.
Small example Project
Here is a small example of Event Driven Ansible and how it is run. The idea is on receiving of a message (here the number 42) a playbook will run in the host. There are the following 3 files :
demo_rule.yml
---
- name: Listen for events on a webhook
hosts: all
sources:
- ansible.eda.webhook:
host: 0.0.0.0
port: 8000
rules:
- name: Say thank you
condition: event.payload.message == "42"
action:
run_playbook:
name: demo.yml
This is the rulebook. We are using the webhook
plugin here as the event source. As a rule in the event of receiving the message 42
as json payload in the webhook, we run the playbook called demo.yml
demo.yml
- hosts: localhost
connection: local
tasks:
- debug:
msg: "Thank you for the answer."
demo.yml
, the playbook which run on the occurrence of the event mentioned in the rulebook and prints a debug message.
---
local:
hosts:
localhost
inventory.yml
mentions the hosts to run the action against.
Further there are 2 files to one to test 42.json
and 43.json
to test the code.
{
"message" : "42"
}
{
"message" : "43"
}
First we have to install all related dependencies before we can run the rulebook.
$ python -m venv .venv
$ source .venv/bin/activate
$ python -m pip install ansible ansible-rulebook ansible-runner psycopg
$ ansible-galaxy collection install ansible.eda
$ ansible-rulebook --rulebook demo_rule.yml -i inventory.yml --verbose
Go to another terminal and on the same directory path and run the following command to test the Rulebook. After receiving the message, the playbook runs.
curl -X POST -H "Content-Type: application/json" -d @42.json 127.0.0.1:8000/endpoint
Output
2024-06-07 16:48:53,868 - ansible_rulebook.app - INFO - Starting sources
2024-06-07 16:48:53,868 - ansible_rulebook.app - INFO - Starting rules
...
TASK [debug] *******************************************************************
ok: [localhost] => {
"msg": "Thank you for the answer."
}
PLAY RECAP *********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
2024-06-07 16:50:08,224 - ansible_rulebook.action.runner - INFO - Ansible runner Queue task cancelled
2024-06-07 16:50:08,225 - ansible_rulebook.action.run_playbook - INFO - Ansible runner rc: 0, status: successful
Now if we run the other json file 43.json
we see that the playbook does not run even after the http status code
being 200
.
curl -X POST -H "Content-Type: application/json" -d @43.json 127.0.0.1:8000/endpoint
Output :
2024-06-07 18:20:37,633 - aiohttp.access - INFO - 127.0.0.1 [07/Jun/2024:17:20:37 +0100] "POST /endpoint HTTP/1.1" 200 159 "-" "curl/8.2.1"
You can try this yourself follwoing this git repository.