Ontwikkel een Bash of PowerShell Script voor Geautomatiseerde Server Migratie en Synchronisatie
description
Met deze prompt kan de gebruiker een script ontwikkelen dat efficiënte, foutbestendige migraties en synchronisaties tussen servers automatiseert. Dit bespaart tijd, vermindert menselijke fouten en zorgt voor consistente serveromgevingen, wat complexere taken en handmatige procedures overbodig maakt.
prompt
try_prompt
Help me een Bash of PowerShell script te maken dat servergegevens en configuraties automatisch migreert en synchroniseert tussen twee servers. Bronserver: <voer het adres of de naam van de bronserver in> Doelserver: <voer het adres of de naam van de doelserver in> Te synchroniseren mappen of bestanden: <besch ... more
generate_helper
...
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Hier is een voorbeeld van een Bash-script dat je kunt gebruiken om de beschreven taken uit te voeren. Het script maakt gebruik van rsync voor synchronisatie, SSH-sleutels voor verificatie, en bevat foutafhandeling en logging. Vervolgens kun je een cron-job instellen om dit script dagelijks om 02:00 uur uit te voeren.
**Stap 1: Maak het Bash-script**
```bash
#!/bin/bash
# Logbestand
LOGFILE="/var/log/migratie_server.log"
# Bron en doelservers
BRON_SERVER="prod-server01.bedrijf.nl"
DOEL_SERVER="backup-server.bedrijf.nl"
# Te synchroniseren mappen
MAPPEN=("/var/www/html" "/etc/apache2")
# Maximum aantal pogingen
MAX_POGINGEN=3
# Functie voor synchronisatie
sync_map() {
local map_path=$1
local poging=1
local succesvol=0
while [ $poging -le $MAX_POGINGEN ]; do
echo "$(date '+%Y-%m-%d %H:%M:%S') - Pogging $poging voor $map_path" >> "$LOGFILE"
rsync -avz --delete -e ssh "$BRON_SERVER:$map_path" "$map_path" >> "$LOGFILE" 2>&1
if [ $? -eq 0 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - Synchronisatie van $map_path gelukt." >> "$LOGFILE"
succesvol=1
break
else
echo "$(date '+%Y-%m-%d %H:%M:%S') - Fout tijdens synchronisatie van $map_path, poging $poging." >> "$LOGFILE"
poging=$((poging + 1))
sleep 10
fi
done
if [ $succesvol -ne 1 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - ERROR: Synchronisatie van $map_path is mislukt na $MAX_POGINGEN pogingen." >> "$LOGFILE"
fi
}
# Start van het script
echo "$(date '+%Y-%m-%d %H:%M:%S') - Start migratieproces" >> "$LOGFILE"
for map in "${MAPPEN[@]}"; do
sync_map "$map"
done
echo "$(date '+%Y-%m-%d %H:%M:%S') - Einde migratieproces" >> "$LOGFILE"
```
**Stap 2: Maak het script uitvoerbaar**
```bash
chmod +x /pad/naar/je/script/migratie.sh
```
**Stap 3: Cron-job instellen**
Voeg de volgende regel toe aan je crontab (bijvoorbeeld via `crontab -e`) om het dagelijks om 02:00 uit te voeren:
```cron
0 2 * * * /pad/naar/je/script/migratie.sh
```
**Opmerkingen:**
- Zorg dat je SSH-sleutels correct zijn ingesteld tussen de servers voor passwordless login.
- Pas de paden aan indien nodig.
- Controleer of de gebruiker die het cron-script uitvoert voldoende rechten heeft op de logmap en de bestanden.
- Het logbestand wordt opgeslagen in `/var/log/migratie_server.log`, pas dit indien gewenst aan.
Heeft u verdere hulp nodig bij het instellen of aanpassen van dit script?
provider: deepseek
model: deepseek-chat
Hier is een Bash-script dat voldoet aan uw vereisten:
```bash
#!/bin/bash
# Configuratie variabelen
BRON_SERVER="prod-server01.bedrijf.nl"
DOEL_SERVER="backup-server.bedrijf.nl"
BRON_DIRECTORIES=("/var/www/html" "/etc/apache2")
LOGBESTAND="/var/log/server_sync.log"
MAX_POGINGEN=3
# Functie voor logging
log_bericht() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOGBESTAND"
}
# Functie voor synchronisatie met herhaalpogingen
sync_directory() {
local bron_dir=$1
local poging=1
while [ $poging -le $MAX_POGINGEN ]; do
log_bericht "Poging $poging om $bron_dir te synchroniseren"
# Uitvoeren rsync met SSH-sleutel authenticatie
rsync -avz --delete -e "ssh -i /home/gebruiker/.ssh/id_rsa -o StrictHostKeyChecking=no" \
"$BRON_SERVER:$bron_dir/" "$DOEL_SERVER:$bron_dir/" >> "$LOGBESTAND" 2>&1
if [ $? -eq 0 ]; then
log_bericht "Succesvol gesynchroniseerd: $bron_dir"
return 0
else
log_bericht "Fout bij synchronisatie $bron_dir (poging $poging)"
((poging++))
sleep 30 # Wacht 30 seconden voor volgende poging
fi
done
log_bericht "KRITIEK: Alle $MAX_POGINGEN pogingen mislukt voor $bron_dir"
return 1
}
# Hoofdscript
log_bericht "=== Start server synchronisatie ==="
# Controleer of beide servers bereikbaar zijn
if ! ssh -o ConnectTimeout=5 -i /home/gebruiker/.ssh/id_rsa "$BRON_SERVER" "echo 'Bronserver bereikbaar'" >> "$LOGBESTAND" 2>&1; then
log_bericht "FOUT: Kan geen verbinding maken met bronserver $BRON_SERVER"
exit 1
fi
if ! ssh -o ConnectTimeout=5 -i /home/gebruiker/.ssh/id_rsa "$DOEL_SERVER" "echo 'Doelserver bereikbaar'" >> "$LOGBESTAND" 2>&1; then
log_bericht "FOUT: Kan geen verbinding maken met doelserver $DOEL_SERVER"
exit 1
fi
# Synchroniseer elke directory
for directory in "${BRON_DIRECTORIES[@]}"; do
sync_directory "$directory"
done
log_bericht "=== Server synchronisatie voltooid ==="
```
**Installatie en configuratie stappen:**
1. **SSH-sleutels instellen:**
```bash
ssh-keygen -t rsa -b 4096
ssh-copy-id -i ~/.ssh/id_rsa.pub gebruiker@prod-server01.bedrijf.nl
ssh-copy-id -i ~/.ssh/id_rsa.pub gebruiker@backup-server.bedrijf.nl
```
2. **Script opslaan:**
```bash
sudo nano /usr/local/bin/server_sync.sh
sudo chmod +x /usr/local/bin/server_sync.sh
```
3. **Cronjob instellen voor dagelijkse uitvoering om 02:00:**
```bash
sudo crontab -e
# Voeg deze regel toe:
0 2 * * * /usr/local/bin/server_sync.sh
```
4. **Log directory aanmaken:**
```bash
sudo mkdir -p /var/log
sudo touch /var/log/server_sync.log
```
**Belangrijke aantekeningen:**
- Vervang `/home/gebruiker/.ssh/id_rsa` met het juiste pad naar uw SSH-sleutel
- Zorg dat de gebruiker de juiste rechten heeft op beide servers
- Het script gebruikt `rsync` met `--delete` om verwijderde bestanden ook te synchroniseren
- Fouten worden gelogd in `/var/log/server_sync.log`
- Bij falen worden 3 pogingen gedaan met 30 seconden tussenpozen
Het script is veilig en robuust met uitgebreide foutafhandeling en logging.

