Programmer l'exécution d'un script en avance sur linux

Posted on mar. 30 juillet 2019 in adminsys

Besoin : lancer un script sur des serveurs linux à une heure donnée, sans jenkins

On doit parfois lancer un script bash sur des serveurs linux (par exemple pour faire de la maintenance ou redémarrer un service hors horaires d'utilisation). Si on a un jenkins avec ansible et une connexion directe aux serveurs, on va dire que c'est facile.

Mais comment faire quand on a pas de jenkins ou pas une connexion stable. On peut utiliser le cron local à chaque serveur.

L'astuce, c'est de lancer le script avec une tâche cron et de supprimer cette tâche cron immédiatement après son lancement.

Solution : tâche cron auto-destructible

Passons au code directement, les explications après :

$ crontab -l
0 20 * * * bash /opt/cron/mon_script.sh

$ cat /opt/cron/mon_script.sh
#!/usr/bin/env sh

# Remove self from cron
crontab -l | grep -v '/opt/cron/mon_script.sh'  | crontab -

# Changement de la version dans la conf nrpe
sed -i 's#command\[check_app_version\].*#command\[check_app_version\]=/usr/lib64/nagios/plugins/check_app_version 1.9.45#' /etc/nrpe.d/common.cfg
# Restart le service nrpe
systemctl restart nrpe

# do the stuff here
# par exemple, met à jour l'appli
# blablabla

Ok, décortiquons.

En premières lignes, on voit que le script bash /opt/cron/mon_script.sh est croné tous les jours à 20h.
Ensuite, on a le détail du-dit script.

Et sa première action est de s'enlever de cron.
Voilà.
Fin de l'astuce.

Bon, comme on essaye de faire des choses bien, et qu'il n'y aura pas retour sur l'action entreprise, la deuxième chose faite est de modifier la supervision pour dire "on s'attend à être dans cet état-là". Comme ça, si jamais la suite ne se passe pas bien, un coup d'oeil à la supervision nous l'indiquera avec une belle alerte.