Lecture de l’état du serveur

Durée : 1 h

Prérequis : Avoir les bases du scripting

Environnement de travail : Une VM avec un serveur Web sous Linux

Contexte

En utilisant Shell et en adaptant des scripts Shell nous allons surveiller un serveur Web Apache, puis on automatisera les tâches courantes. Sur ce serveur, nous avons une application avec certains services, tels que le système de vente d’une entreprise. En d’autres termes, nous avons des services critiques en cours d’exécution. Par conséquent, il doit toujours fonctionner, car si un problème survient et que le service tombe en panne, l’entreprise pourrait subir des pertes.

L’une des possibilités sera donc de surveiller ce serveur Web et chaque fois qu’il tombe en panne, nous le redémarrerons. Mais comment savons-nous que le serveur est tombé en panne ? C’est l’objet de ce cours et cela nous permettra d’apprendre à faire évoluer un script en fonction de nos besoins.

Le contexte de l’exercice

Lorsque nous accédons à une page sur Internet, ce que nous faisons en réalité est une requête au serveur. Une demande n’est rien de plus qu’une demande. Dans ce cas, nous demandons une page Web. Si tout se passe bien, notre serveur renvoie la page que nous avons demandée et renvoie également un code de statut. Ce code nous informe du statut de la demande.

Si ce dernier revient égal à 200, cela signifie que tout s’est bien passé. Si le code est 404, cela signifie que ce que nous avons demandé n’a pas été trouvé. Cette erreur est courante lorsque vous essayez d’accéder à une page qui n’existe pas sur le serveur. En plus de ceux-ci, il existe d’autres codes, tels que 500 qui indique une erreur interne dans le serveur.

Sachant que le serveur renvoie un code lorsqu’il reçoit une requête, nous pouvons continuer à surveiller ce code et chaque fois qu’il est différent de 200 nous pourrions redémarrer le serveur.

Vérification du code http

Pour vérifier le statut http, nous pouvons utiliser la commande curl. Cette commande permet le transfert de données entre le serveur et l’hôte. Nous souhaitons que curl nous montre l’état de notre requête :

Étape 1 : Ouvrez votre terminal et tapez l’instruction suivante :

curl --write-out %{http_code} www.google.fr

Curl nous a rendu le code de statut de la réquisition. Mais il a également renvoyé tout le code html de la page, alors que nous avons juste besoin du code http tout à la fin.

 

Étape 2 : Indiquons à curl de prendre cette sortie (--output), qui est le code http, et de la jeter dans le null de Linux, /dev/null.

curl --write-out %{http_code} --output /dev/null www.google.fr

La réponse se réduit, mais il ne nous a renvoyé que le code HTML 200 en nous montrant la progression de la demande.

 

Étape 3 : Nous ne voulons que le code http, alors disons à curl d’être muet ( --silent) et de ne nous montrer que le statut :

curl --write-out %{http_code} --silent --output /dev/null www.google.fr

Connaître les scripts Shell

Dans cette deuxième partie nous répondons aux questions suivantes suite à notre script :

MéthodeConstruction du fichier

Étape 1 : Commençons à créer le script pour vérifier l’état du serveur. Nous créons d’abord un fichier avec le nom verification_serveur, comme il s’agit d’un fichier shell, mettons l’extension « .sh ». Ressemblant à ceci : verification_serveur.sh

Il existe plusieurs types de shell, l’un des plus utilisés dans le monde Linux est bash. C’est lui qui lit et exécute les lignes de notre dossier. Puisque nous allons utiliser bash, nous devons dire dans la première ligne de notre fichier qu’il s’agit de notre interpréteur :

#!/bin/bash

 

Étape 2 : Nous vérifions ensuite le code http, nous savons déjà comment faire en utilisant simplement curl. Attention si on utilise cette commande tout le temps dans le code cela peut nuire à notre lecture dans le script.

Attribuons donc la sortie de cette commande à une variable, qui dans ce cas, sera code_http.

Lorsque nous attribuons une commande à une variable, nous devons l'envelopper à l'intérieur de $() pour qu'elle soit exécutée par le bash :

#!/bin/bash

code_http=$(curl --write-out %{http_code} --silent --output /dev/null www.monserveur.fr)

 

Étape 3 : Demandons au script d'imprimer la variable et de voir si la commande a fonctionné comme prévu :

#!/bin/bash

code_http=$(curl --write-out %{http_code} --silent --output /dev/null www.monserveur.fr)

echo $code_http

Maintenant, demandez au bash d'exécuter ce script :

./verification_serveur.sh

Cela fonctionne.

 

Étape 4 Ce que nous devons faire maintenant, c'est demander à bash de vérifier si ce code est différent de 200, c'est-à-dire si (if) le code est différent (n’est pas égal) de 200. Essayez de redémarrer le serveur Apache http ( systemctl restart http).

#!/bin/bash

code_http=$(curl --write-out %{http_code} --silent --output /dev/null www.monserveur.fr)

if [ $code_http -ne 200 ]; then

    systemctl restart http

fi

Ainsi, à chaque fois que notre serveur aura une réponse différente de 200, il essaiera de redémarrer. Cependant, de cette façon, nous ne savons pas quand il a été réinitialisé. Nous voudrons peut-être savoir quand il a redémarré et pourquoi.

 

Étape 5 Disons à notre script d'écrire (echo) un message avant d'essayer de redémarrer le serveur. Pour garder un journal plus organisé, on mettra le message, la date et l'heure de l'événement.

Nous pouvons obtenir la date du système à l'aide de la commande date. On peut lui demander de nous montrer la date complète en passant le paramètre %F (full date). Si ce paramètre est le premier, il faut passer le signe + avant :

date +%F

Nous pouvons aussi demander l'heure du système. Pour ce faire, il suffit d'utiliser le paramètre %T (time).

date +%T

Pour imprimer la date et l'heure, nous pouvons utiliser la commande :

date +%F %T

Cela ne fonctionne pas. Comme nous utilisons un espace pour séparer la date de l'heure, nous devons donc échapper date avec (\). La bonne commande est :

date +%F\ %T

Nous avons réussi à obtenir la date et l'heure.

 

Étape 6 Mettons-les dans notre code. Puisqu'il s'agit d'une commande, nous devons l'envelopper à l'intérieur de $().

#!/bin/bash

code_http=$(curl --write-out %{http_code} --silent --output /dev/null www.monserveur.fr)

if [ $code_http -ne 200 ]; then

    echo "Problème avec le serveur en le redémarrant  $(date +%F\ %T)"

    systemctl restart httpd

fi

De cette façon, le message sera imprimé à l'écran. Nous devons rediriger la sortie echo de la commande vers notre fichier.

 

Étape 7 Dites donc à bash de rediriger (>>) vers le fichier où nos journaux seront enregistrés. Dans ce cas, ce fichier est dans le dossier /script/serveur.log. Si ce fichier n'existe pas, bash le crée.

#!/bin/bash

code_http=$(curl --write-out %{http_code} --silent --output /dev/null www.monserveur.fr)

if [ $code_http -ne 200 ]; then

    echo "Problème avec le serveur en le redémarrant   $(date +%F\ %T)" >> /script/serveur.log

    systemctl restart httpd

fi

Attention

Vérifier sur quel système vous êtes avec la commande systemctl restart http et pensez à avoir les droits d'écriture pour serveur.log.

Méthode

Étape 8 Maintenant, si le serveur a un problème, exécutez simplement le script et il essaiera de redémarrer le serveur et enregistrera toujours un message dans le journal pour nous avertir.

Mais, nous devons toujours exécuter ce script pour qu'il fonctionne. Nous avons besoin de quelque chose qui l'exécute automatiquement, sans avoir à nous soucier de l'exécution du script.

Planifier des tâches avec cron

Nous voulons que ce script s'exécute de temps en temps. Pour cela, nous pouvons utiliser un outil Linux appelé cron. Avec lui, nous pouvons planifier nos tâches afin qu'elles soient exécutées chaque seconde, heure, jour de la semaine, quand cela nous convient.

Alors, modifions le fichier cron pour qu'il gère notre script. Pour ouvrir le fichier de configuration cron, tapez simplement :

crontab -e

Pour vérifier sa présence :

systemctl status cron

Pour le démarrer :

service cron start

Pour voir les services enregistrés :

crontab –l

Ce fichier est divisé en colonnes, où chacune d’entre elles représente une unité de temps et la dernière représente la tâche à effectuer.

Les colonnes sont divisées en :

Minutes / Heures / Jour du mois / Mois / Jour de la semaine / Commande à exécuter.

Source : wikipedia.org

Par exemple, vous pouvez enregistrer dans le fichier cron :

*/1 * * * * bash /scripts/verification_serveur.sh

Là, on souhaite exécuter le fichier verification_serveur.sh toutes les minutes, tout le temps 7 / 7 jours.