Ontwikkel een Ansible Playbook voor Geautomatiseerde Configuratievalidatie en Correctie
description
Met deze prompt kan de gebruiker een playbook ontwikkelen dat automatisch de naleving van configuratiestandaarden bewaakt en afwijkingen corrigeert, waardoor handmatige controles overbodig worden en de infrastructuur consistent en betrouwbaar blijft. Dit bespaart tijd, vermindert fouten en integreert naadloos met bestaande monitoringtools voor proactief beheer.
prompt
Help me een Ansible Playbook te maken dat automatisch de configuraties van mijn systemen valideert tegen vooraf gedefinieerde standaarden en afwijkingen corrigeert. Mijn validatieregels: <voer je validatieregels in> Frequentie van validatie: <voer de gewenste validatiefrequentie in> Correctiestrategie: <beschri ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Hier is een voorbeeld van een Ansible Playbook dat aan jouw eisen voldoet, inclusief structuur, validatie, correcties, en rapportage. Daarnaast geef ik best practices om het playbook efficiënt en onderhoudsvriendelijk te maken.
---
**Voorbeeld Ansible Playbook: validate_and_fix_ssh_access.yml**
```yaml
---
- name: Valideer en corrigeer SSH-toegang volgens standaarden
hosts: all
become: yes
vars:
toegestane_ip_adressen:
- 192.168.1.0/24
- 10.0.0.0/8
tasks:
- name: Controleer huidige SSH toegangsregels
command: "sshd -T"
register: sshd_config
changed_when: false
- name: Extract PermitOpen regels uit sshd_config
set_fact:
permitopen_rules: "{{ sshd_config.stdout_lines | select('search', '^permitopen') | list }}"
- name: Valideer of SSH toegang alleen vanaf toegestane IP-adressen
vars:
current_permitopen: "{{ permitopen_rules }}"
afwijkingen: []
block:
- name: Verzamel alle permitopen regels
set_fact:
permitopen_list: "{{ permitopen_rules | map('regex_search', 'permitopen\\s+(\\S+)') | select('string') | list }}"
- name: Valideer IP-adressen
set_fact:
afwijkingen: >-
{{ afwijkingen +
(permitopen_list | select('regex_search', '^(?!{{ item }}$)').list)
}}
loop: "{{ permitopen_list }}"
- name: Rapportage afwijkingen
debug:
msg: "De volgende permitopen regels zijn niet toegestaan: {{ afwijkingen }}"
when: afwijkingen | length > 0
- name: Corrigeer SSH configuratie indien afwijkingen gevonden
block:
- name: Backup bestaande sshd_config
copy:
src: /etc/ssh/sshd_config
dest: "/etc/ssh/sshd_config.bak_{{ ansible_date_time.iso8601 }}"
remote_src: yes
- name: Verwijder ongewenste permitopen regels
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^permitopen\s+.*'
state: absent
- name: Voeg correcte permitopen regels toe
lineinfile:
path: /etc/ssh/sshd_config
line: "permitopen {{ item }}"
insertafter: '^#?PermitOpen'
create: yes
loop: "{{ toegestane_ip_adressen | map('regex_replace', '(.*)', 'permitopen \\1') | list }}"
- name: Herstart SSH dienst
service:
name: sshd
state: restarted
when: afwijkingen | length > 0
```
---
### Best practices voor structurering en minimaliseren van systeemonderbrekingen:
1. **Modulariseer je playbooks**: Gebruik roles voor verschillende onderdelen zoals SSH-configuratie, monitoring, etc. Dit maakt onderhoud eenvoudiger.
2. **Gebruik 'check mode' en dry-runs**: Test je playbooks met `ansible-playbook --check` om wijzigingen te simuleren en onderbrekingen te minimaliseren.
3. **Backup configuraties**: Maak altijd backups voordat je configuraties wijzigt, bijvoorbeeld met de `copy` module.
4. **Automatiseer herstarts**: Herstart services alleen wanneer er daadwerkelijk wijzigingen zijn doorgevoerd, bijvoorbeeld met `notify` en handlers.
5. **Integratie met monitoring**: Gebruik Ansible modules of API's van monitoringtools (zoals Nagios, Zabbix) om rapportages en alerts te automatiseren.
6. **Gebruik van cron jobs**: Plan de uitvoering van je playbook dagelijks om 02:00 uur met cron of Ansible Tower/AWX.
7. **Logging en rapportage**: Verzend rapportages naar een centraal systeem of stuur e-mails met de resultaten.
8. **Beperk wijzigingsimpact**: Voer wijzigingen eerst uit op test- of stagingomgevingen en pas ze aan voordat je ze in productie doorvoert.
---
Wil je dat ik het playbook verder uitbreid met integratie van monitoringtools of andere configuraties?
provider: deepseek
model: deepseek-chat
Hier is een volledig Ansible Playbook met best practices voor configuratievalidatie en -correctie:
## Directory Structuur (Aanbevolen)
```
ansible-config-validation/
├── inventories/
│ ├── production/
│ └── staging/
├── group_vars/
│ ├── all.yml
│ └── linux_servers.yml
├── roles/
│ └── ssh_hardening/
│ ├── tasks/
│ ├── handlers/
│ └── templates/
├── playbooks/
│ ├── config_validation.yml
│ └── emergency_rollback.yml
└── scripts/
├── schedule_daily_validation.sh
└── monitoring_integration.py
```
## Hoofd Playbook: `playbooks/config_validation.yml`
```yaml
---
- name: Dagelijkse Configuratie Validatie en Correctie
hosts: all
serial: "25%" # Minimaliseer impact door in batches te werken
max_fail_percentage: 10
any_errors_fatal: false
vars:
allowed_ssh_ips: ["192.168.1.0/24", "10.0.0.100"]
validation_timeout: 300
backup_enabled: true
pre_tasks:
- name: Maak backup van huidige configuratie
ansible.builtin.copy:
src: "/etc/ssh/sshd_config"
dest: "/etc/ssh/sshd_config.backup-{{ ansible_date_time.epoch }}"
remote_src: yes
when: backup_enabled
changed_when: false
roles:
- role: ssh_hardening
tags: ssh
post_tasks:
- name: Valideer SSH configuratie
ansible.builtin.command: sshd -t
register: sshd_validation
changed_when: false
failed_when: sshd_validation.rc != 0
- name: Rapporteer validatie status
ansible.builtin.debug:
msg: "SSH configuratie validatie geslaagd"
when: sshd_validation.rc == 0
- name: Herstart SSH service indien nodig
ansible.builtin.service:
name: sshd
state: restarted
when:
- ssh_hardening_changed | default(false)
- sshd_validation.rc == 0
notify: wait_for_ssh_recovery
handlers:
- name: wait_for_ssh_recovery
ansible.builtin.wait_for:
port: 22
host: "{{ ansible_host }}"
delay: 5
timeout: 30
listen: "Herstart SSH service indien nodig"
```
## SSH Hardening Role: `roles/ssh_hardening/tasks/main.yml`
```yaml
---
- name: Valideer huidige SSH configuratie
ansible.builtin.lineinfile:
path: /etc/ssh/sshd_config
regexp: '^#?PermitRootLogin'
line: 'PermitRootLogin no'
validate: sshd -t -f %s
register: ssh_root_login
- name: Configureer toegestane IP-adressen
ansible.builtin.lineinfile:
path: /etc/ssh/sshd_config
regexp: '^#?AllowUsers'
line: 'AllowUsers *@{{ item }}'
validate: sshd -t -f %s
loop: "{{ allowed_ssh_ips }}"
register: ssh_allowed_ips
- name: Stel wijzigingsvlag in
ansible.builtin.set_fact:
ssh_hardening_changed: true
when: ssh_root_login.changed or ssh_allowed_ips.changed
```
## Cron Job voor Dagelijkse Uitvoering
```bash
#!/bin/bash
# scripts/schedule_daily_validation.sh
# Dagelijkse uitvoering om 02:00
0 2 * * * /usr/bin/ansible-playbook \
-i /path/to/ansible-config-validation/inventories/production \
/path/to/ansible-config-validation/playbooks/config_validation.yml \
--limit "production_servers" \
--vault-password-file /etc/ansible/vault_pass.txt
```
## Monitoring Integratie
```python
#!/usr/bin/env python3
# scripts/monitoring_integration.py
import json
import requests
from ansible.runner import Runner
class MonitoringIntegration:
def __init__(self):
self.prometheus_url = "http://prometheus:9090"
self.grafana_url = "http://grafana:3000"
def send_validation_metrics(self, results):
"""Stuur validatieresultaten naar Prometheus"""
metrics = {
'config_validation_success': len([r for r in results if r['success']]),
'config_validation_failed': len([r for r in results if not r['success']]),
'auto_correction_applied': len([r for r in results if r['corrected']])
}
# Push naar Prometheus Pushgateway
requests.post(f"{self.prometheus_url}/metrics", json=metrics)
def create_grafana_annotation(self, message):
"""Maak annotatie in Grafana"""
annotation = {
"text": message,
"tags": ["ansible-validation"]
}
requests.post(f"{self.grafana_url}/api/annotations", json=annotation)
```
## Best Practices voor Minimale Onderbrekingen
### 1. Rolling Updates
```yaml
- name: Veilige implementatie
hosts: webservers
serial: "20%" # Werk in batches van 20%
max_fail_percentage: 15
```
### 2. Health Checks
```yaml
- name: Pre-flight check
ansible.builtin.wait_for:
port: 22
host: "{{ ansible_host }}"
timeout: 30
delegate_to: localhost
- name: Post-implementatie validatie
ansible.builtin.uri:
url: "http://{{ ansible_host }}/health"
status_code: 200
timeout: 10
```
### 3. Rollback Strategie
```yaml
- name: Nood rollback
hosts: all
tasks:
- name: Herstel backup configuratie
ansible.builtin.copy:
src: "/etc/ssh/sshd_config.backup-latest"
dest: "/etc/ssh/sshd_config"
remote_src: yes
notify: restart sshd
```
### 4. Variabelen Management (`group_vars/all.yml`)
```yaml
---
# SSH Configuratie
allowed_ssh_ips:
- "192.168.1.0/24"
- "10.0.0.100"
# Validatie Instellingen
validation_schedule: "0 2 * * *"
backup_retention_days: 7
maintenance_window: "02:00-04:00"
# Monitoring Integratie
monitoring_enabled: true
prometheus_endpoint: "http://prometheus:9090"
```
## Uitvoering en Testen
```bash
# Test playbook
ansible-playbook -i inventories/staging playbooks/config_validation.yml --check
# Dro-run voor validatie
ansible-playbook -i inventories/production playbooks/config_validation.yml --diff
# Volledige implementatie
ansible-playbook -i inventories/production playbooks/config_validation.yml
```
Deze structuur biedt:
- **Veiligheid**: Backups en rollback mogelijkheden
- **Minimale impact**: Rolling updates en health checks
- **Monitoring**: Integratie met Prometheus/Grafana
- **Flexibiliteit**: Eenvoudig uitbreidbaar voor extra validatieregels
- **Betrouwbaarheid**: Pre- en post-validatie van wijzigingen