Ontwikkel Dynamische Ansible Playbooks met Conditionele Logica en Event-gedreven Automatisering
description
Maakt het mogelijk om adaptieve en intelligente Ansible playbooks te maken die automatisch reageren op veranderingen en gebeurtenissen in de infrastructuur, waardoor de efficiëntie verbetert en handmatige tussenkomst vermindert. Deze aanpak ondersteunt complexere workflows dan statische deployments en biedt meer flexibiliteit en geavanceerde automatisering.
prompt
Help me een Ansible playbook te ontwikkelen dat conditionele logica en event-gedreven automatisering bevat om dynamisch te reageren op verschillende infrastructuurtoestanden en gebeurtenissen. Beschrijf hoe ik conditionals, loops en event triggers binnen het playbook kan implementeren om taken te automatiseren op basis van realtime veranderingen.
Infrastructuur o ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Hier is een overzicht van hoe je een Ansible playbook kunt ontwikkelen dat conditionele logica, loops en event-gedreven automatisering bevat om op realtime veranderingen te reageren in een productie-infrastructuur:
1. **Gebruik van conditionele logica (conditionals):**
- Controleer de wijzigingsdatum van configuratiebestanden met de `stat` module.
- Gebruik de geregistreerde resultaten (`register`) om te bepalen of een bestand recent is gewijzigd (bijvoorbeeld binnen het laatste uur).
- Voer alleen herstarttaken uit indien de wijziging recent is.
2. **Implementatie van loops:**
- Loop door een lijst van services die mogelijk moeten worden herstart, bijvoorbeeld met `with_items`.
- Voer herstart-acties uit voor elke service die aan de voorwaarden voldoet.
3. **Event triggers en event-gedreven automatisering:**
- Ansible zelf is niet volledig event-gedreven, maar je kunt dit aanpakken via tools zoals **Ansible AWX/Tower**, **cron-job** scripts, of door gebruik te maken van **callback plugins** of **webhooks**.
- Voor eenvoudige gevallen kun je bijvoorbeeld een playbook maken dat periodiek wordt uitgevoerd en controleert op recente wijzigingen of service-fouten.
4. **Voorbeeld van een basis playbook:**
```yaml
- name: Automatisering op basis van infrastructuurstatus
hosts: alle_servers
vars:
services:
- nginx
- redis
- postgres
tasks:
- name: Controleer of configuratiebestanden recent gewijzigd zijn
stat:
path: /etc/{{ item }}/config.conf
register: config_stat
with_items: "{{ services }}"
- name: Verzamel services die recent gewijzigd zijn
set_fact:
services_te_herstarten: "{{ services_te_herstarten | default([]) + [item.0] }}"
when: item.1.stat.mtime >= (ansible_date_time.epoch | int) - 3600
with_together:
- "{{ services }}"
- "{{ config_stat.results }}"
- name: Herstart services die recent gewijzigd zijn
service:
name: "{{ item }}"
state: restarted
loop: "{{ services_te_herstarten | default([]) }}"
- name: Controleer op service-fouten (voorbeeld)
shell: systemctl is-failed {{ item }}
register: service_fouten
with_items: "{{ services }}"
- name: Meld service-fouten
debug:
msg: "Service {{ item.item }} is gefaald!"
when: "'failed' in item.stdout"
loop: "{{ service_fouten.results }}"
```
5. **Realtime event-gedreven automatisering:**
- Voor echte event-gedreven aanpakken kun je gebruik maken van tools zoals **Ansible AWX** met **webhooks** of **callback plugins** die automatisch een playbook triggeren bij een gebeurtenis (bijvoorbeeld door integraties met monitoringtools zoals Nagios, Zabbix, of Prometheus).
- Of gebruik een externe scheduler (bijv. Jenkins) die op basis van event logs speelt.
**Samenvatting:**
- Gebruik `stat` en tijdsvergelijkingen voor conditionele acties.
- Gebruik loops (`with_items`, `loop`) voor meerdere services of configuraties.
- Implementeer event triggers via integraties of periodieke checks.
- Combineer conditionals en loops om dynamisch en automatisch te reageren op wijzigingen en gebeurtenissen in je infrastructuur.
Wil je dat ik een compleet, uitgewerkt voorbeeld playbook voor jouw situatie maak?
provider: deepseek
model: deepseek-chat
Hier is een volledig Ansible playbook met de gevraagde functionaliteit:
```yaml
---
- name: Dynamische Infrastructuur Automatisering
hosts: production_servers
vars:
config_files:
- /etc/nginx/nginx.conf
- /etc/apache2/apache2.conf
- /etc/mysql/my.cnf
notification_email: admin@bedrijf.nl
max_config_age: 3600 # 1 uur in seconden
tasks:
# Controleren op configuratiewijzigingen
- name: Controleer configuratiewijzigingen
stat:
path: "{{ item }}"
register: config_stats
loop: "{{ config_files }}"
ignore_errors: yes
# Conditionele service herstart gebaseerd op recente wijzigingen
- name: Herstart services alleen bij recente configuratiewijzigingen
service:
name: "{{ item.item | basename | regex_replace('\\.conf$', '') }}"
state: restarted
when:
- item.stat.exists
- (ansible_date_time.epoch | int) - item.stat.mtime <= max_config_age
- item.stat.mtime > 0
loop: "{{ config_stats.results }}"
notify: stuur_melding_herstart
# Monitoring van service status
- name: Controleer service status
systemd:
name: "{{ item }}"
enabled: yes
register: service_status
loop:
- nginx
- apache2
- mysql
# Automatisch herstarten van gefaalde services
- name: Herstart gefaalde services
service:
name: "{{ item.item }}"
state: restarted
when: item.failed
loop: "{{ service_status.results }}"
notify: stuur_melding_service_fout
handlers:
# Event handlers voor meldingen
- name: stuur_melding_herstart
mail:
host: smtp.gmail.com
port: 587
username: "ansible@bedrijf.nl"
password: "{{ smtp_password }}"
to: "{{ notification_email }}"
subject: "Service herstart - {{ inventory_hostname }}"
body: |
Service {{ item.item | basename | regex_replace('\\.conf$', '') }}
is herstart vanwege configuratiewijziging.
Bestand: {{ item.item }}
Wijzigingstijd: {{ item.stat.mtime | to_datetime }}
- name: stuur_melding_service_fout
mail:
host: smtp.gmail.com
port: 587
username: "ansible@bedrijf.nl"
password: "{{ smtp_password }}"
to: "{{ notification_email }}"
subject: "Service hersteld - {{ inventory_hostname }}"
body: |
Service {{ item.item }} was gefaald en is automatisch herstart.
Tijdstip: {{ ansible_date_time.iso8601 }}
```
## Implementatie Details:
### **Conditionele Logica:**
- `when:` statements controleren of configuraties in het laatste uur zijn gewijzigd
- `(ansible_date_time.epoch | int) - item.stat.mtime <= max_config_age` - controleert mtime
- `ignore_errors: yes` - zorgt voor doorlopende uitvoering bij ontbrekende bestanden
### **Loops:**
- `loop: "{{ config_files }}"` - itereert over alle configuratiebestanden
- `loop: "{{ config_stats.results }}"` - verwerkt geregistreerde resultaten
- `loop:` met service lijst voor statuscontrole
### **Event-gedreven Automatisering:**
- `handlers:` voor asynchrone meldingen
- `notify:` triggert handlers op basis van events
- Real-time reactie op service failures en config changes
### **Extra Features:**
- Dynamische service naam extractie uit config bestandsnamen
- SMTP integratie voor meldingen
- Tijdgebonden conditionele checks
- Error handling met `ignore_errors`
## Gebruik:
1. Sla op als `infra-automation.yml`
2. Voer uit met: `ansible-playbook -i production_inventory infra-automation.yml`
3. Zorg dat `smtp_password` is gedefinieerd in ansible-vault
Dit playbook biedt volledige automatisering voor je productie-omgeving met de gevraagde conditionele logica en event-driven functionaliteit.