Maak een Ansible Playbook voor geautomatiseerde infrastructuur back-up en herstel
description
Deze prompt helpt gebruikers bij het maken van een robuust Ansible playbook om kritieke back-up- en hersteltaken te automatiseren, waardoor handmatig werk en het risico op dataverlies worden verminderd. Het behandelt data-integriteit, foutafhandeling en het minimaliseren van downtime, waardoor het onderhoud van infrastructuur veiliger en efficiënter verloopt dan handmatige procedures of minder gestructureerde methoden.
prompt
Help me een Ansible playbook te maken dat de back-up en het herstel van mijn infrastructuurcomponenten automatiseert. Geef de back-uptargets op: <voer de infrastructuurcomponenten in voor back-up>
Back-up frequentie: <voer het gewenste back-upschema in>
Details van het herstelproces ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Hier is een voorbeeld van een Ansible playbook dat de back-up en het herstel van webservers en databases automatiseert, inclusief aanbevelingen voor data-integriteit, foutafhandeling en minimalisatie van downtime:
```yaml
---
- name: Backup en herstel van infrastructuurelementen
hosts: all
become: yes
vars:
backup_dir: /mnt/nfs/backups/{{ inventory_hostname }}
backup_time: "{{ lookup('pipe', 'date +%Y%m%d%H%M%S') }}"
backup_retention_days: 7
webservers:
- web1
- web2
databases:
- db1
- db2
tasks:
- name: Zorg dat backup directory bestaat
file:
path: "{{ backup_dir }}"
state: directory
mode: '0755'
- name: Backup webservers
when: "'web' in inventory_hostname"
block:
- name: Maak een tarball van de webserver bestanden
archive:
path: /var/www/
dest: "{{ backup_dir }}/web_backup_{{ backup_time }}.tar.gz"
format: gz
register: web_backup
failed_when: web_backup is failed
- name: Verifieer de integriteit van de webbackup
command: "gzip -t {{ backup_dir }}/web_backup_{{ backup_time }}.tar.gz"
register: gzip_check
failed_when: gzip_check.rc != 0
- name: Backup databases
when: "'db' in inventory_hostname"
block:
- name: Maak een dump van de database
mysql_db:
state: dump
name: "{{ item }}"
target: "{{ backup_dir }}/{{ item }}_{{ backup_time }}.sql"
loop: "{{ databases }}"
register: db_dumps
- name: Verifieer de database dumps
command: "mysqldump --single-transaction --quick --lock-tables=false {{ item }} > {{ backup_dir }}/{{ item }}_{{ backup_time }}.sql"
loop: "{{ databases }}"
register: dump_checks
failed_when: dump_checks.rc != 0
- name: Verwijder oude backups (retentie)
find:
paths: "{{ backup_dir }}"
age: "{{ backup_retention_days }}d"
recurse: yes
register: old_backups
- name: Verwijder oude backups
file:
path: "{{ item.path }}"
state: absent
loop: "{{ old_backups.files }}"
handlers:
- name: Herstel webserver (handmatige goedkeuring vereist)
pause:
prompt: "Wilt u de webserver herstellen? Typ 'ja' om door te gaan."
register: user_input
when: false # Handmatige actie, niet automatisch
# Voor herstel zou je een aparte playbook of taak moeten maken
# die alleen wordt uitgevoerd na goedkeuring.
# Aanbevelingen:
# 1. Data-integriteit: Gebruik checksum (bijv. md5sum) om backups te verifiëren.
# 2. Foutafhandeling: Voeg 'failed_when' en 'rescue' blocks toe om fouten te loggen en verdere acties te ondernemen.
# 3. Minimaliseren downtime: Plan herstel tijdens onderhoudsvensters en gebruik rolling updates indien mogelijk.
```
**Aanbevelingen voor verdere verbetering:**
- Voeg checksum-verificaties toe voor alle backups om dataintegriteit te waarborgen.
- Maak gebruik van Ansible's 'rescue' en 'always' secties om fouten tijdens back-up of herstel af te handelen en te loggen.
- Overweeg het gebruik van een meer geavanceerd herstelproces met automatische tests en bevestigingen om downtime te minimaliseren.
- Automatiseer het herstelproces volledig met duidelijke prompts en handmatige goedkeuringen waar nodig.
Indien je een meer uitgebreide en geautomatiseerde aanpak wenst, kan ik je helpen het playbook verder uit te breiden.
provider: deepseek
model: deepseek-chat
Hier is een Ansible playbook voor back-up en herstel van uw infrastructuur, met de gevraagde aanbevelingen:
## Ansible Playbook: `backup_restore.yml`
```yaml
---
- name: Automatische back-up van webservers en databases
hosts: all
vars:
nfs_server: "192.168.1.100:/backups"
local_mount_point: "/mnt/backups"
backup_retention_days: 7
tasks:
- name: Maak lokaal mount point aan
file:
path: "{{ local_mount_point }}"
state: directory
mode: '0755'
become: yes
- name: Mount NFS share
mount:
path: "{{ local_mount_point }}"
src: "{{ nfs_server }}"
fstype: nfs
state: mounted
opts: "rw,sync"
become: yes
- name: Back-up webserver configuraties
block:
- name: Archiveer web directories
archive:
path:
- "/etc/nginx"
- "/var/www/html"
- "/etc/apache2"
dest: "{{ local_mount_point }}/webserver-{{ inventory_hostname }}-{{ ansible_date_time.epoch }}.tar.gz"
remove: no
when: "'webserver' in group_names"
become: yes
- name: Back-up database servers
block:
- name: MySQL dump
community.mysql.mysql_db:
state: dump
name: all
target: "{{ local_mount_point }}/mysql-{{ inventory_hostname }}-{{ ansible_date_time.epoch }}.sql"
when: ansible_facts['pkg_mgr'] == 'apt' and "'database' in group_names"
- name: PostgreSQL dump
community.postgresql.postgresql_db:
state: dump
name: all
target: "{{ local_mount_point }}/postgresql-{{ inventory_hostname }}-{{ ansible_date_time.epoch }}.sql"
when: ansible_facts['pkg_mgr'] == 'apt' and "'database' in group_names"
become: yes
when: "'database' in group_names"
rescue:
- name: Log back-up fout
debug:
msg: "Back-up gefaald voor {{ inventory_hostname }}"
- name: Stuur notificatie
mail:
subject: "Back-up fout - {{ inventory_hostname }}"
body: "Back-up proces gefaald op {{ ansible_date_time.iso8601 }}"
to: "admin@example.com"
- name: Verwijder oude back-ups
find:
paths: "{{ local_mount_point }}"
patterns: "*.tar.gz,*.sql"
age: "{{ backup_retention_days * 86400 }}"
register: old_backups
- name: Toon oude back-ups voor verwijdering
debug:
msg: "Verwijderen: {{ item.path }}"
loop: "{{ old_backups.files }}"
when: old_backups.matched > 0
- name: Handmatig herstelproces (vereist expliciete uitvoering)
hosts: localhost
vars:
restore_confirmation: false
tasks:
- name: Bevestig herstelactie
pause:
prompt: "WAARSCHUWING: Dit zal data overschrijven. Typ 'BEVESTIG' om door te gaan"
register: restore_confirmation
when: not restore_confirmation
- name: Voer herstel alleen uit na bevestiging
block:
- include_tasks: restore_tasks.yml
when: restore_confirmation.user_input == "BEVESTIG"
```
## Aanvullend bestand: `restore_tasks.yml`
```yaml
- name: Selecteer herstelpunten
debug:
msg: "Beschikbare back-ups in {{ local_mount_point }}"
- name: Monteer NFS share voor herstel
mount:
path: "{{ local_mount_point }}"
src: "{{ nfs_server }}"
fstype: nfs
state: mounted
become: yes
- name: Herstel webserver configuraties
unarchive:
src: "{{ local_mount_point }}/webserver-{{ inventory_hostname }}-SELECTEER_DATUM.tar.gz"
dest: "/"
remote_src: yes
when: "'webserver' in group_names"
become: yes
- name: Herstel databases
block:
- name: MySQL herstel
community.mysql.mysql_db:
state: import
name: all
target: "{{ local_mount_point }}/mysql-{{ inventory_hostname }}-SELECTEER_DATUM.sql"
when: ansible_facts['pkg_mgr'] == 'apt'
- name: PostgreSQL herstel
community.postgresql.postgresql_db:
state: restore
name: all
target: "{{ local_mount_point }}/postgresql-{{ inventory_hostname }}-SELECTEER_DATUM.sql"
when: ansible_facts['pkg_mgr'] == 'apt'
become: yes
when: "'database' in group_names"
```
## Inventory Bestand: `inventory.ini`
```ini
[webservers]
web1.example.com
web2.example.com
[databases]
db1.example.com
db2.example.com
[all:vars]
ansible_ssh_private_key_file=~/.ssh/id_rsa
```
## Aanbevelingen voor Optimalisatie
### Data-integriteit:
1. **Checksums**: Voeg SHA256 checksum verificatie toe aan back-ups
2. **Back-up validatie**: Test periodisch herstel op testomgeving
3. **Versleuteling**: Gebruik Ansible Vault voor gevoelige data
4. **Transactionele back-ups**: Voor databases, gebruik `--single-transaction` bij MySQL
### Foutafhandeling:
1. **Retry mechanisme**: Implementeer opnieuw proberen bij netwerkfouten
2. **Monitoring**: Integreer met alerting systemen (Prometheus, Nagios)
3. **Logging**: Gedetailleerde logging met timestamps
4. **Space monitoring**: Controleer beschikbare schijfruimte voor back-ups
### Downtime minimalisatie:
1. **Hot back-ups**: Gebruik database-specifieke tools voor minimale impact
2. **Staggered herstel**: Herstel databases eerst, dan webservers
3. **Load balancer configuratie**: Neem servers tijdelijk uit rotatie tijdens herstel
4. **Incrementele back-ups**: Overweeg voor frequente wijzigingen
### Uitvoering:
```bash
# Back-up uitvoeren
ansible-playbook -i inventory.ini backup_restore.yml
# Herstel uitvoeren (handmatige bevestiging vereist)
ansible-playbook -i inventory.ini backup_restore.yml --tags restore
```
Dit playbook biedt een robuuste basis die u verder kunt aanpassen aan uw specifieke infrastructuurbehoeften.