« Mises à jour automatiques » : différence entre les versions
De Documentation
Aller à la navigationAller à la recherche
Page créée avec « =script de sauvegarde= Au niveau du système hôte, on ajoute le script : <div class="toccolours mw-collapsible mw-collapsed"> /root/scripts/'''lxc_auto_update.sh''' : <div class="mw-collapsible-content"> #!/bin/bash LOG_FILE="/var/log/lxc_update.log" MAX_RUNS_TO_KEEP=2 RUN_START_MARKER="--- Début de l'exécution du script ---" RUN_END_MARKER="--- Fin de l'exécution du script ---" PROXY_CONTAINER="proxy" WEB_CONTAINERS=("wp" "pmb" "wiki" "tables") # L... » |
|||
| (6 versions intermédiaires par le même utilisateur non affichées) | |||
| Ligne 1 : | Ligne 1 : | ||
= | =Script de mise à jour des conteneurs= | ||
Afin d'automatiser la mise à jour des conteneurs, on crée un script qui va | |||
:*Mettre à jour les conteneurs alpine en fonctionnement | |||
:*Créer un fichier de log | |||
:*Corriger le fichier de log pour ne garder la trace que des deux dernières mises à jour | |||
:*Envoyer un mail d'alerte en cas d'erreur | |||
:*Redémarrer les conteneurs en prenant soin de démarrer le conteneur '''proxy''' en dernier | |||
<br> | |||
<div class="toccolours mw-collapsible mw-collapsed"> | <div class="toccolours mw-collapsible mw-collapsed"> | ||
/root/scripts/'''lxc_auto_update.sh''' : | /root/scripts/'''lxc_auto_update.sh''' : | ||
| Ligne 152 : | Ligne 158 : | ||
fi | fi | ||
# | # Définir l'adresse e-mail pour les notifications | ||
EMAIL_DESTINATAIRE="toto@mail.com" # Remplace par ton adresse e-mail | EMAIL_DESTINATAIRE="toto@mail.com" # Remplace par ton adresse e-mail | ||
| Ligne 163 : | Ligne 169 : | ||
</div> | </div> | ||
</div> | </div> | ||
<br> | |||
=Envoi des E-mails= | =Envoi des E-mails= | ||
==Installation des logiciels de gestion des mails== | ==Installation des logiciels de gestion des mails== | ||
| Ligne 206 : | Ligne 214 : | ||
::*''Pour que la redirection de mails fonctionne, il faut que l'adresse de destination finale soit différente de l'adresse utilisée pour l'identification pour l'envoi des mails.'' | ::*''Pour que la redirection de mails fonctionne, il faut que l'adresse de destination finale soit différente de l'adresse utilisée pour l'identification pour l'envoi des mails.'' | ||
=Automatisation= | |||
On automatise l'exécution (dimache à 2h du matin) : | On automatise l'exécution (dimache à 2h du matin) : | ||
crontab -e | crontab -e | ||
0 2 * * 7 /root/scripts/lxc_auto_update.sh | 0 2 * * 7 /root/scripts/lxc_auto_update.sh | ||
Dernière version du 15 mai 2025 à 17:30
Script de mise à jour des conteneurs
Afin d'automatiser la mise à jour des conteneurs, on crée un script qui va
- Mettre à jour les conteneurs alpine en fonctionnement
- Créer un fichier de log
- Corriger le fichier de log pour ne garder la trace que des deux dernières mises à jour
- Envoyer un mail d'alerte en cas d'erreur
- Redémarrer les conteneurs en prenant soin de démarrer le conteneur proxy en dernier
/root/scripts/lxc_auto_update.sh :
#!/bin/bash
LOG_FILE="/var/log/lxc_update.log"
MAX_RUNS_TO_KEEP=2
RUN_START_MARKER="--- Début de l'exécution du script ---"
RUN_END_MARKER="--- Fin de l'exécution du script ---"
PROXY_CONTAINER="proxy"
WEB_CONTAINERS=("wp" "pmb" "wiki" "tables") # Liste de tous les conteneurs web
WEB_SERVICE_NAME="apache2" # Nom du service web à vérifier (adapter si nécessaire)
SLEEP_AFTER_RESTART=10 # Délai après le redémarrage des conteneurs web
bavarder() {
local message="$1"
echo "$(date '+%Y-%m-%d %H:%M:%S') - $message" >> "$LOG_FILE"
}
# Ajouter un marqueur de début d'exécution
bavarder "$RUN_START_MARKER"
# Récupérer la liste des noms de conteneurs Alpine
containers=$(lxc list --format csv | tail -n +2 | cut -d',' -f1)
bavarder "Liste des conteneurs récupérée : '$containers'"
# Séparer les noms de conteneurs en un tableau
IFS=$'\n' read -r -d '' -a container_array <<< "$containers"
# Boucle pour lancer les mises à jour
{
for container in "${container_array[@]}"; do
bavarder "--- Début du traitement du conteneur : '$container' ---"
config=$(lxc config show "$container")
if echo "$config" | grep -iq "alpine"; then
bavarder "Le conteneur '$container' semble être basé sur Alpine."
is_running=$(lxc list --format csv | grep "^${container}," | grep ",RUNNING,")
if [ -n "$is_running" ]; then
bavarder "Le conteneur '$container' est en cours d'exécution, lancement de la mise à jour..."
lxc exec "$container" -- sh -c "apk update && apk upgrade --available"
result=$?
if [ "$result" -ne 0 ]; then
bavarder "Erreur lors de la mise à jour de '$container'."
fi
else
bavarder "Le conteneur '$container' n'est pas en cours d'exécution, mise à jour ignorée."
fi
else
bavarder "Le conteneur '$container' ne semble pas être basé sur Alpine, mise à jour ignorée."
fi
bavarder "--- Fin du traitement du conteneur : '$container' ---"
done
} >> "$LOG_FILE" 2>&1
bavarder "Fin de la tentative de mise à jour des conteneurs."
# --- Début du redémarrage des conteneurs Alpine (sauf le proxy) ---
bavarder "--- Début du redémarrage des conteneurs Alpine (sauf $PROXY_CONTAINER) ---"
for container in "${container_array[@]}"; do
if [ "$container" != "$PROXY_CONTAINER" ]; then
config=$(lxc config show "$container")
if echo "$config" | grep -iq "alpine"; then
is_running=$(lxc list --format csv | grep "^${container}," | grep ",RUNNING,")
if [ -n "$is_running" ]; then
bavarder "Redémarrage du conteneur '$container'..."
lxc restart "$container"
sleep "$SLEEP_AFTER_RESTART"
# Vérifier l'état du service web pour les conteneurs web
is_web_container=0
for web_container in "${WEB_CONTAINERS[@]}"; do
if [ "$container" == "$web_container" ]; then
is_web_container=1
break
fi
done
if [ "$is_web_container" -eq 1 ]; then
service_status=$(lxc exec "$container" -- rc-service "$WEB_SERVICE_NAME" status 2>&1)
if ! echo "$service_status" | grep -q "started"; then
bavarder "$WEB_SERVICE_NAME ne semble pas en cours d'exécution dans '$container', tentative de démarrage..."
lxc exec "$container" -- rc-service "$WEB_SERVICE_NAME" start
sleep 5
service_status_after_start=$(lxc exec "$container" -- rc-service "$WEB_SERVICE_NAME" status 2>&1)
if ! echo "$service_status_after_start" | grep -q "started"; then
bavarder "Échec du démarrage de $WEB_SERVICE_NAME dans '$container'."
else
bavarder "$WEB_SERVICE_NAME démarré avec succès dans '$container'."
fi
else
bavarder "$WEB_SERVICE_NAME semble être en cours d'exécution dans '$container'."
fi
fi
fi
fi
fi
done
bavarder "--- Fin du redémarrage des conteneurs Alpine (sauf $PROXY_CONTAINER) ---"
# --- Redémarrage du conteneur proxy en dernier ---
bavarder "--- Début du redémarrage du conteneur proxy ($PROXY_CONTAINER) ---"
is_proxy_running=$(lxc list --format csv | grep "^${PROXY_CONTAINER}," | grep ",RUNNING,")
if [ -n "$is_proxy_running" ]; then
bavarder "Redémarrage du conteneur proxy '$PROXY_CONTAINER'..."
lxc restart "$PROXY_CONTAINER"
result=$?
if [ "$result" -ne 0 ]; then
bavarder "Erreur lors du redémarrage du conteneur proxy '$PROXY_CONTAINER'."
fi
else
bavarder "Le conteneur proxy '$PROXY_CONTAINER' n'est pas en cours d'exécution, redémarrage ignoré."
fi
bavarder "--- Fin du redémarrage du conteneur proxy ($PROXY_CONTAINER) ---"
# Ajouter un marqueur de fin d'exécution
bavarder "$RUN_END_MARKER"
# --- Gestion de la rotation des logs ---
if [ -f "$LOG_FILE" ]; then
# Récupérer toutes les occurrences du marqueur de début d'exécution
start_markers=$(grep -c "^$RUN_START_MARKER" "$LOG_FILE")
# Calculer le nombre d'exécutions à supprimer
runs_to_remove=$((start_markers - MAX_RUNS_TO_KEEP))
if [ "$runs_to_remove" -gt 0 ]; then
# Utiliser awk pour ne conserver que les N dernières exécutions
awk -v n="$MAX_RUNS_TO_KEEP" -v start_marker="$RUN_START_MARKER" -v end_marker="$RUN_END_MARKER" '
BEGIN { count = 0; in_run = 0; }
$0 ~ start_marker {
count++;
if (count > (NR - RSTART) + 1 - (n * (RLENGTH ? 1 : 0))) {
in_run = 1;
} else {
in_run = 0;
print;
}
}
$0 ~ end_marker {
if (!in_run) {
print;
}
}
<nowiki>!($0 ~ start_marker) && !($0 ~ end_marker) {
if (!in_run) {
print;
}
}
' "$LOG_FILE" > "$LOG_FILE.tmp" && mv "$LOG_FILE.tmp" "$LOG_FILE"
fi
fi
# Définir l'adresse e-mail pour les notifications
EMAIL_DESTINATAIRE="toto@mail.com" # Remplace par ton adresse e-mail
# Vérifier s'il y a eu des erreurs et envoyer un e-mail si c'est le cas
if grep -q "Erreur" "$LOG_FILE"; then
cat "$LOG_FILE" | mail -s 'Rapport de mise à jour LXC - Erreurs détectées' "$EMAIL_DESTINATAIRE"
fi
exit 0
Envoi des E-mails
Installation des logiciels de gestion des mails
L'envoi des mails nécessite l'installation de mailutils et ssmtp :
apt-get install mailutils ssmtp
Configuration de ssmtp
vi /etc/ssmtp/ssmtp.conf
ssmtp.conf
# # Config file for sSMTP sendmail # # The person who gets all mail for userids < 1000 # Make this empty to disable rewriting. root=toto@monmail.fr # The place where the mail goes. The actual machine name is required no # MX records are consulted. Commonly mailhosts are named mail.domain.com mailhub=smtp.gmail.com:587 (pour gmail) # Where will the mail seem to come from? # rewriteDomain= # The full hostname hostname=raspberrypi # Are users allowed to set their own From: address? # YES - Allow the user to specify their own From: address # NO - Use the system generated From: address FromLineOverride=YES UseTLS=YES UseSTARTTLS=YES AuthUser=toto@monfournisseur.com AuthPass=MonMotdePasseDeConnection
Remarques :
- Pour gmail, il faut créer un mot de passe d'application dans les paramètre du compte google et l'utiliser ici.
- Pour que la redirection de mails fonctionne, il faut que l'adresse de destination finale soit différente de l'adresse utilisée pour l'identification pour l'envoi des mails.
Automatisation
On automatise l'exécution (dimache à 2h du matin) :
crontab -e 0 2 * * 7 /root/scripts/lxc_auto_update.sh