Guides pratiques DevOps

Un ensemble de guides DevOps pragmatiques qui vont droit au but et proposent des solutions concrètes et applicables au monde réel.

Guides pratiques DevOps
Photo par Cristina Gottardi / Unsplash

Stockage d'objets

Gestion des objets provenant de stockages compatibles S3

Nous allons utiliser la aws s3 Utilitaire en ligne de commande pour cela. Pour l'installer, consultez : Installer l'interface de ligne de commande AWS.

Pour lire ou écrire des objets/fichiers depuis/vers des espaces de stockage d'objets compatibles S3, vous devez d'abord vous authentifier. Vous pouvez vous authentifier avec votre compte utilisateur ou à l'aide de clés API.

Trouvez un moyen de générer une clé API auprès de votre fournisseur de stockage S3, puis définissez les variables d'environnement suivantes :

export AWS_ACCESS_KEY_ID=$MY_S3_ACCESS_KEY
export AWS_SECRET_ACCESS_KEY=$MY_S3_SECRET_KEY
export AWS_DEFAULT_REGION=$MY_S3_REGION
export AWS_ENDPOINT_URL=$MY_S3_ENDPOINT_URL

Pour plus d'informations sur les variables d'environnement que vous pouvez utiliser pour configurer l'utilitaire de ligne de commande « aws », consultez la documentation. variables d'environnement de configuration de l'interface de ligne de commande AWS.

Une fois les variables d'environnement ci-dessus correctement configurées, vous pourrez transférer des fichiers depuis et vers le stockage S3 si la clé API dispose des autorisations requises. Voici les commandes :

# Upload myfile into mybucket
aws s3 cp /tmp/myfile s3://mybucket/

# Upload myfile into mybucket at myfilerenamed
aws s3 cp /tmp/myfile s3://mybucket/myfilerenamed

# Upload myfile into mybucket inside the files directory
aws s3 cp /tmp/myfile s3://mybucket/files/

# Download myfile from mybucket
aws s3 cp s3://mybucket/myfile .

La commande « aws s3 » utilisera par défaut téléchargement en plusieurs parties Lors du chargement d'un fichier dans un compartiment S3, le comportement du chargement en plusieurs parties ne peut pas être configuré via les variables d'environnement. Vous pouvez utiliser la commande « aws configure set » pour ajouter les paramètres de configuration dans le fichier de configuration AWS par défaut (« ~/aws/config »). Voici des exemples :

# Minimum file size that triggers multipart upload
aws configure set multipart_threshold 64MB

# Size of the parts (chunks) of the multipart upload
# bigger size => less parts
aws configure set multipart_chunksize 16MB

Pour obtenir la liste et la description de tous les paramètres de configuration disponibles pour l'interface de ligne de commande AWS, consultez : Paramètres du fichier de configuration de l'interface de ligne de commande AWS.

Pour plus d'informations sur les limites de téléchargement en plusieurs parties, consultez limites de téléchargement multipartie AWS.

Linux

Configuration du poste de travail

Configuration de Tmux

Pour installer tmux:

sudo apt update && sudo apt install tmux

Pour lancer tmux :

tmux

La touche de préfixe à utiliser avant les raccourcis clavier tmux est Ctrl+b.

Vous pouvez également exécuter des commandes tmux depuis votre terminal ou dans une session tmux en activant la ligne de commande avec Ctrl+b :.

Voici un exemple de commande que vous pourriez exécuter :

:set synchronize-pane

pour que toutes les fenêtres d'une même zone reçoivent les mêmes frappes au clavier.

Pour obtenir de l'aide, exécutez « man tmux » et consultez les sections suivantes :

  • RACCORDEMENTS DE TOUCHES PAR DÉFAUT - pour les raccourcis clavier par défaut
  • COMMANDES - pour les commandes prises en charge par tmux
  • OPTIONS - pour les options permettant de configurer l'apparence et le comportement de tmux
  • FENÊTRES ET VITRES - pour les commandes relatives aux paramètres des fenêtres et des volets
  • LIAISONS CLÉS - Commandes pour définir, lister et supprimer les raccourcis clavier
  • HOOKS - pour les hooks tmux
  • MODES - pour les options que vous pouvez utiliser pour personnaliser le style de l'interface tmux
  • LIGNE DE STATUT - pour plus d'informations et d'options concernant la ligne d'état de tmux (affichée par défaut en bas)
  • EXEMPLES - pour divers exemples tmux

Pour rendre permanentes certaines configurations tmux, vous pouvez les ajouter dans le fichier '~/.tmux.conf' :

bind-key S set synchronize-panes

Si vous êtes dans tmux, vous pouvez le faire recharger son fichier de configuration sans redémarrer :

tmux source-file ~/.tmux.conf
Configuration de Powerline-shell

Pour installer coque de ligne électrique:

pip install powerline-shell

# or 

git clone https://github.com/b-ryan/powerline-shell
cd powerline-shell
python setup.py install

Ensuite, ajoutez ceci à votre fichier de configuration '~/.bashrc' :

function _update_ps1() {
    PS1=$(powerline-shell $?)
}

if [[ $TERM != linux && ! $PROMPT_COMMAND =~ _update_ps1 ]]; then
    PROMPT_COMMAND="_update_ps1; $PROMPT_COMMAND"
fi

Ensuite, rechargez votre shell :

exec $SHELL

Pour obtenir la configuration requise pour d'autres types de shells, consultez ceci..

Vous pouvez ensuite personnaliser l'apparence de votre shell avec l'exemple de fichier de configuration suivant :

{
  "segments": [
    "virtual_env",
    "username",
    "hostname",
    "cwd",
    "ssh",
    "git",
    "jobs",
    "root"
  ],
   "mode": "patched",
   "theme": "default",
   "cwd": {
     "max_depth": 3
    },
   "hostname": {
     "colorize": "True"
   }
}

Placez ce fichier dans '~/.config/powerline-shell/config.json', après avoir créé les dossiers requis comme suit :

mkdir -p ~/.config/powerline-shell

Périphériques de blocs et système de fichiers

Recherche de fichiers

Recherche de fichiers et de répertoires spécifiques à partir d'un chemin système de fichiers racine :

# Searching for the 'history.log.4.gz' file from /
$ sudo find / -type f -name history.log.4.gz
/var/log/apt/history.log.4.gz

# Searching for files in /var/log whose names match the '.*/.*log\.[0-9]+\.gz' regex 
$ find /var/log -type f -regextype posix-extended -regex '.*/.*log\.[0-9]+\.gz'
/var/log/apt/term.log.4.gz
/var/log/apt/history.log.5.gz
/var/log/apt/term.log.8.gz
/var/log/apt/history.log.11.gz
/var/log/apt/history.log.7.gz
(...)

# Searching for directories named 'log' from /
$ sudo find / -type d -name log
/usr/lib/python3/dist-packages/cloudinit/log
/var/log
/snap/core20/2717/run/log
/snap/core20/2717/usr/lib/python3/dist-packages/cloudinit/log
/snap/core20/2717/var/log
/snap/core20/2769/run/log
/snap/core20/2769/usr/lib/python3/dist-packages/cloudinit/log
/snap/core20/2769/var/log
/run/log

Exécution d'une commande spécifique sur les résultats :

# Find history.log.4.gz from / and execute the 'ls -lah' command on the findings
$ sudo find / -type f -name history.log.4.gz -exec ls -lah {} \;
-rw-r--r-- 1 root root 967 Feb 20 21:01 /var/log/apt/history.log.4.gz

Suppression des résultats :

# Find history.log.4.gz from / and delete it 
$ sudo find / -type f -name history.log.4.gz -delete

Date et heure

Synchronisation de l'horloge système via NTP

Assurez-vous que le paquet « systemd-timesyncd » est installé et que le service « systemd-timesyncd.service » est en cours d'exécution :

$ dpkg -l | grep systemd-timesyncd
ii  systemd-timesyncd                249.11-0ubuntu3.19                      amd64        minimalistic service to synchronize local time with NTP servers

$ systemctl status systemd-timesyncd.service 
● systemd-timesyncd.service - Network Time Synchronization
     Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2026-06-25 23:20:42 CEST; 1 day 8h ago
       Docs: man:systemd-timesyncd.service(8)
   Main PID: 6354 (systemd-timesyn)
     Status: "Initial synchronization to time server 91.189.91.157:123 (ntp.ubuntu.com)."
      Tasks: 2 (limit: 2228)
     Memory: 1.3M
        CPU: 326ms
     CGroup: /system.slice/systemd-timesyncd.service
             └─6354 /lib/systemd/systemd-timesyncd

Vous pouvez ensuite lister les fuseaux horaires disponibles en exécutant la commande suivante :

timedatectl list-timezones

Pour définir le fuseau horaire, exécutez :

timedatectl set-timezone Africa/Abidjan

Vous pouvez ensuite vérifier en exécutant :

timedatectl status

Pour activer la synchronisation horaire via NTP, vous pouvez éventuellement définir des adresses personnalisées pour les serveurs NTP en exécutant :

timedatectl ntp-servers $network-interface $ntp-server-domain-name

Ensuite, activez la synchronisation de l'heure en exécutant :

timedatectl set-ntp true

Pour vérifier que NTP est correctement configuré, exécutez :

timedatectl status

Vous pouvez également afficher les serveurs NTP actuels et l'état de la synchronisation horaire en exécutant la commande suivante :

timedatectl timesync-status
timedatectl show-timesync

Systemd

Exécution d'un script personnalisé au démarrage

Voici le fichier d'unité systemd :

[Unit]
Description=Run my custom script at boot
After=network.target

[Service]
Type=oneshot
ExecStart="/path/to/myscript.sh"
RemainAfterExit=true

[Install]
WantedBy=multi-user.target

Pour en savoir plus sur systemd, consultez ceci..

Installation de programmes à partir de sources

Aperçu

Il faut d'abord s'assurer que les outils de développement, les en-têtes du noyau... nécessaires à la construction des paquets Linux sont installés (gcc, make...).

# Debian based distributions
sudo apt update && sudo apt install build-essential

# RedHat based distributions
yum groupinstall "Development Tools"

Une fois les prérequis installés et le code source téléchargé, la procédure de compilation et d'installation est identique quelle que soit la distribution. Dans le répertoire du code source, vous trouverez généralement les fichiers « configure » ​​et « Makefile ».

Configurer

Le script « configure » ​​sert à configurer le programme. Pour voir les options de personnalisation disponibles, exécutez :

./configure --help
Makefile

Le fichier « Makefile » contient les cibles « make » utilisées par le programme « make ». Ces cibles permettent aux développeurs de proposer aux utilisateurs certaines fonctionnalités de compilation de leurs programmes, par exemple compiler le programme avec les options par défaut (généralement avec la cible « all »), générer la documentation du programme dans différents formats, etc.

« Cibles de compilation » contient simplement une liste de commandes à exécuter pour obtenir une variante de compilation spécifique. Pour utiliser une cible de compilation spécifique pour la compilation du programme, il suffit d'exécuter :

make <target-name>

L'exécution de « make » est équivalente à celle de « make all » et suffit généralement à créer le fichier binaire du programme avec les options par défaut. Sinon, utilisez « configure » ​​avec les options de personnalisation souhaitées, puis exécutez « make » pour créer le fichier binaire.

Le fichier binaire du programme sera généralement créé dans le répertoire « src ». Vous pouvez l'utiliser directement depuis cet emplacement ou l'installer sur votre système à l'aide de la commande « make install ». Voici comment cela se passera la plupart du temps :

  • déployer le programme binaire à l'intérieur /usr/local/bin
  • déployer les bibliothèques de programmes à l'intérieur /usr/local/lib
  • déployer la documentation du programme à l'intérieur /usr/local/share
Exemple de contenu de Makefile

Voici un extrait de « Fixer des objectifs » tiré de boucle Code source du programme :

all:
        ./configure
        make

ssl:
        ./configure --with-openssl
        make

mingw32:
        $(MAKE) -C lib -f Makefile.m32
        $(MAKE) -C src -f Makefile.m32

mingw32-vclean mingw32-distclean:
        $(MAKE) -C lib -f Makefile.m32 vclean
        $(MAKE) -C src -f Makefile.m32 vclean
        $(MAKE) -C docs/examples -f Makefile.m32 vclean

(...)

cygwin:
        ./configure
        make

cygwin-ssl:
        ./configure --with-openssl
        make

amiga:
        cd ./lib && make -f makefile.amiga
        cd ./src && make -f makefile.amiga

netware:
        $(MAKE) -C lib -f Makefile.netware
        $(MAKE) -C src -f Makefile.netware

netware-clean:
        $(MAKE) -C lib -f Makefile.netware clean
        $(MAKE) -C src -f Makefile.netware clean
        $(MAKE) -C docs/examples -f Makefile.netware clean

(...)

netware-examples-%:
        $(MAKE) -C docs/examples -f Makefile.netware CFG=$@

netware-%:
        $(MAKE) -C lib -f Makefile.netware CFG=$@
        $(MAKE) -C src -f Makefile.netware CFG=$@

unix: all

unix-ssl: ssl

linux: all

linux-ssl: ssl

ca-bundle: lib/mk-ca-bundle.pl
        @echo "generate a fresh ca-bundle.crt"
        @perl $< -b -l -u lib/ca-bundle.crt

ca-firefox: lib/firefox-db2pem.sh
        @echo "generate a fresh ca-bundle.crt"
        ./lib/firefox-db2pem.sh lib/ca-bundle.crt

SSH

Proxy Jump

Configuration du client SSH pour le proxy jump

Le proxy SSH permet de se connecter de manière transparente à un serveur SSH final via un serveur SSH intermédiaire/proxy.

Voici un exemple de configuration client SSH permettant de se connecter au serveur 2 via le serveur 1. Vous pouvez ajouter d'autres configurations client SSH ici :

  • ~/.ssh/config - pour la configuration à portée utilisateur
  • /etc/ssh/ssh_config - pour la configuration à l'échelle du système

Nous ajoutons d'abord la configuration nécessaire pour se connecter au serveur intermédiaire/proxy (serveur1) :

Host server1
  Hostname 192.168.9.4    # hostname or IP address used to SSH into server1
  User didi             # username used to SSH into server1
  IdentityFile /home/didi/.ssh/id_rsa  # private key used to SSH into server1

Ensuite, nous ajoutons la configuration nécessaire pour se connecter au serveur final (serveur2) :

(...)

Host server2
  Hostname 10.2.3.4 
  ProxyCommand ssh -q -W %h:%p server1
  User dada  # username used for connecting to server2 from server1

La commande « ProxyCommand » dans la configuration ci-dessus indique au client SSH d'utiliser la configuration du serveur 1 pour se connecter à ce dernier avant de se connecter au serveur 2 depuis le serveur 1. Voici un aperçu détaillé du déroulement d'une connexion SSH au serveur 2 après la mise en place de cette configuration de proxy :

Connexion au serveur 1

Une fois la configuration du proxy en place, vous pouvez vous connecter au serveur 2 en exécutant :

ssh server2

Avant de vous connecter au serveur 2, assurez-vous :

  • L'utilisateur didi est présent sur le serveur 1.
  • Le serveur server1 est correctement configuré pour autoriser les connexions SSH avec la clé privée de l'utilisateur didi (« /home/didi/.ssh/id_rsa ») présente sur la machine à partir de laquelle la commande ssh est exécutée (machine locale).

Pour permettre à l'utilisateur didi de la machine locale de se connecter à server1 avec sa clé SSH privée, ajoutez la clé publique SSH associée dans server1, dans le répertoire personnel de l'utilisateur didi, dans le fichier des clés autorisées : ~/.ssh/authorized_keys.

Connexion au serveur 2

Se connecter au serveur 2 se fera avant de se connecter au serveur 1 en utilisant la configuration client SSH correspondante (hôte : serveur 1). Une connexion SSH sera ensuite établie depuis le serveur 1 après le transfert transparent de la clé privée requise.
('/home/didi/.ssh/id_rsa') vers server1.

La commande résultante sur server1 pour se connecter à server2 sera :

ssh -i <transferred-private-key> dada@10.2.3.4

Vous devez donc veiller à ce que :

  • L'utilisateur dada est présent sur le serveur2 (10.2.3.4).
  • Le serveur server2 est correctement configuré pour autoriser les connexions SSH avec la clé privée transférée (clé privée de l'utilisateur didi sur la machine locale).

Pour permettre à l'utilisateur dada de se connecter au serveur2 avec la clé privée transférée, ajoutez la clé publique SSH associée dans le fichier des clés autorisées du serveur2, dans le répertoire personnel de l'utilisateur dada : ~/.ssh/authorized_keys.

Passage par proxy sans configuration du client SSH
ssh -i local-private-key -J [intermediate-user@]intermediate-ssh-server [final-user@]final-ssh-server

Avant d'exécuter la commande, assurez-vous :

  • La machine locale peut se connecter au serveur SSH intermédiaire en utilisant la clé privée locale et l'utilisateur intermédiaire.

    • Cela signifie que la clé publique locale correspondante à la clé privée locale est présente sur le serveur SSH intermédiaire, dans le fichier `/home/intermediate-user/.ssh/authorized_keys`.
  • La machine locale peut se connecter à 'final-ssh-server' en utilisant 'local-private-key' et l'utilisateur 'final-user'.

    • Cela signifie que la clé publique locale correspondante à la clé privée locale est présente dans le serveur SSH final, dans le fichier `/home/final-user/.ssh/authorized_keys`.
  • Il n'est pas nécessaire de transférer la clé privée locale au serveur SSH intermédiaire ; cette opération est effectuée de manière sécurisée et transparente lors de l'utilisation de l'option « -J » pour le saut de proxy.

Bloquer l'accès shell des utilisateurs au proxy SSH

Configurez leurs entrées de clés publiques dans le fichier de clés autorisées (~/.ssh/authorized_keys) comme suit :

<username>:command="/sbin/nologin",no-pty ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCmSIZR/MBampHYZ7y9mVfxa.....

Transférer des fichiers

Synchronisation de fichiers via SSH avec rsync

Voici un exemple de script que vous pouvez utiliser pour synchroniser périodiquement des fichiers depuis des serveurs distants via SSH à l'aide de rsync :

#!/bin/bash

logger -t My data sync started
rsync -avr --exclude="file_to_exclude.cfg" -e "ssh -i /rsync_ssh_private_key -p $remote_server_ssh_port" mydata@${remote_server_ip}:/data/mydata_remote_src_dir/ /data/myapp_local_dst_dir/ > rsync_log_dir/mydata-$(date +%F-%Hh%M).txt
logger -t My data sync finished

Avant d'exécuter le script, assurez-vous que la clé SSH publique associée à la clé SSH privée '/rsync_ssh_private_key' est autorisée à se connecter au serveur distant et que le flux réseau du port SSH local vers le serveur distant est ouvert.

Exemple de configuration cron

Voici le contenu d'un exemple de fichier de configuration cron. Cette configuration cron exécutera le script rsync toutes les 6 heures à la minute 30.

30 */6 * * *   root    bash   /root/mydata_sync.sh

Bases de données relationnelles

MySQL

Installation du client et du serveur

Pour installer uniquement le client MySQL :

apt update && apt install mysql-client

Pour installer le serveur MySQL :

apt update && apt install mysql-server
Sécuriser l'installation
$ sudo mysql_secure_installation

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: y

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1

Skipping password set for root as authentication with auth_socket is used by default.
If you would like to use password authentication instead, this can be done with the "ALTER_USER" command.
See https://dev.mysql.com/doc/refman/8.0/en/alter-user.html#alter-user-password-management for more information.

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!
Authentification de l'utilisateur root
$ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.46-0ubuntu0.22.04.2 (Ubuntu)

Copyright (c) 2000, 2026, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| debian-sys-maint | localhost | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | auth_socket           |
+------------------+-----------+-----------------------+
5 rows in set (0.00 sec)

Sur Ubuntu, comme nous pouvons le voir ci-dessus, par défaut, l'utilisateur « root » de MySQL utilise le plugin « auth_socket » pour l'authentification et est configuré pour se connecter uniquement depuis la machine serveur (localhost).

Le socket d'authentification réussit à authentifier l'utilisateur « root » sans demander de mot de passe, à condition que l'utilisateur système exécutant le client MySQL soit « root » et qu'il existe un utilisateur MySQL portant le même nom et le même hôte (« root »@« localhost »).

Le principe sous-jacent est le suivant : si vous pouvez devenir l'utilisateur root Linux, vous contrôlez déjà la machine, donc exiger le mot de passe de l'utilisateur « root » MySQL est redondant.

Si vous souhaitez toujours passer de l'authentification par socket à l'authentification par mot de passe :

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MySuperPa@ssW0rd!';
Query OK, 0 rows affected (0.06 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.04 sec)

Maintenant, lorsque nous nous connectons sans mot de passe, nous obtenons une erreur :

$ mysql -u root
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

La connexion avec le mot de passe configuré fonctionne :

mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 14
Server version: 8.0.46-0ubuntu0.22.04.2 (Ubuntu)

Copyright (c) 2000, 2026, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Pour revenir à 'auth_socket' :

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH auth_socket;
Query OK, 0 rows affected (0.02 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.06 sec)
Connexion aux bases de données

Pour se connecter à une instance de base de données MySQL sur l'hôte « host » avec le nom d'utilisateur et le mot de passe :

mysql -u username -h host -p password

Pour éviter de transmettre le mot de passe dans la commande pour des raisons de sécurité :

mysql -u username -h host -p

Pour utiliser un fichier contenant des informations d'authentification :

mysql -u username -h host --defaults-extra-file=credentials_file

Voici un exemple de contenu pour credentials_file :

[client]
user = "username"
password = "password"
host = "localhost"
Affichage de la configuration du serveur

Pour afficher les paramètres de configuration du serveur MySQL actuellement en cours d'exécution :

mysqld --verbose --help | less

Pour définir un paramètre spécifique pour le serveur, utilisez 'my_param' (avec un trait de soulignement) dans le fichier de configuration ou '--my-param' sur la ligne de commande.

Gérer les utilisateurs

Voici Déclarations de gestion de compte MySQL Pour en savoir plus, consultez la documentation.

Pour créer un utilisateur :

mysql> CREATE USER 'username'@'host' IDENTIFIED BY 'password';
mysql> FLUSH PRIVILEGES;

Pour en savoir plus, consultez Création d'utilisateurs.

Pour supprimer un utilisateur :

mysql> DROP USER 'username'@'host';
mysql> FLUSH PRIVILEGES;

Pour en savoir plus, consultez Suppression d'utilisateurs.

Dans les commandes précédentes, « host » représente l’adresse IP ou le nom d’hôte de la machine source à partir de laquelle la connexion est initiée. Cela peut prendre la forme de localhost (pour les connexions initiées directement depuis le serveur) ou de 10.2.3.4. Pour correspondre à n’importe quelle adresse IP source, utilisez %.

Pour accorder un privilège spécifique à un utilisateur :

mysql> GRANT SELECT ON database.* TO 'username'@'%';
mysql> FLUSH PRIVILEGES;

La commande précédente accorde le privilège « SELECT » sur toutes les tables de la base de données à l'utilisateur « username ». Le caractère générique (*) peut être remplacé par le nom d'une table spécifique pour accorder le privilège uniquement à cette table. Plusieurs privilèges peuvent également être spécifiés en les séparant par une virgule. Voici la liste : privilèges MySQL disponibles.

Pour révoquer des privilèges spécifiques :

mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'username'@'host';
mysql> FLUSH PRIVILEGES;

Pour en savoir plus, consultez Révocation de privilège

Pour que les modifications apportées aux utilisateurs et aux privilèges prennent effet immédiatement :

mysql> FLUSH PRIVILEGES;

Cela garantit que MySQL actualise son cache en mémoire pour les tables 'mysql.*' (utilisateurs, privilèges, rôles) à partir du disque.

Gestion des sauvegardes

Pour créer une sauvegarde de 'mydb' :

mysqldump -u username mydb -p > mydb_backup.sql

Pour restaurer la sauvegarde :

mysql -u username mydb -p < mydb_backup.sql

Python

Gérer Python avec Pyenv

Configuration de Pyenv

En utilisant pyenv, nous pouvons installer les dernières versions de Python sur les distributions Linux qui ne les fournissent pas via leurs dépôts officiels.

Avant de suivre les instructions d'installation suivantes, installez le paquets prérequis.

Pour installer pyenv, exécutez :

$ curl https://pyenv.run | bash

Pour configurer votre shell afin qu'il charge automatiquement pyenv (exemple bash), ajoutez
Ajoutez les éléments suivants à '~/.bash_profile' s'il existe, sinon à '~/.profile' (pour les shells de connexion) ou à '~/.bashrc' (pour les shells interactifs) :

export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

Redémarrez votre terminal pour que les modifications soient prises en compte :

exec $SHELL

Pour mettre à jour pyenv, ses plugins, y compris la liste des versions Python disponibles :

pyenv update
Gestion des versions Python

Pour lister les versions de Python disponibles qui peuvent être installées :

pyenv install --list

Pour installer/désinstaller une version spécifique de Python :

pyenv install <python_version>
pyenv uninstall <python_version>

Exemple :

pyenv install 3.14.5

Pour définir une version spécifique de Python installée via pyenv comme version par défaut pour l'ensemble du système :

pyenv global <python_version>

Pour afficher la configuration Python actuelle pour l'ensemble du système :

$ pyenv global
system

« System » signifie que nous utilisons la version Python installée par défaut sur le système. Pour définir la version Python sur 3.14.5 par exemple pour l'ensemble du système :

pyenv global 3.14.5

Vérifier:

$ pyenv global
3.14.5

Rétablir la version Python par défaut du système :

pyenv global system
Gestion des environnements virtuels

Nous pouvons également gérer les environnements virtuels Python avec pyenv. Pour créer un environnement virtuel, exécutez :

pyenv virtualenv myvenv

Pour lister les environnements virtuels existants :

$ pyenv virtualenvs
3.14.5/envs/test (created from /home/gmkziz/.pyenv/versions/3.14.5)
test --> /home/gmkziz/.pyenv/versions/3.14.5/envs/test

Pour activer un environnement virtuel :

source /home/gmkziz/.pyenv/versions/3.14.5/envs/test/bin/activate

or

virtualenv_name=test
eval $(pyenv sh-activate $virtualenv_name)

Pour désactiver un environnement virtuel :

deactivate

or

virtualenv_name=test
eval $(pyenv sh-deactivate $virtualenv_name)

Enfin, pour supprimer un environnement virtuel :

$ virtualenv_name=test
$ pyenv virtualenv-delete $virtualenv_name
pyenv-virtualenv: remove /home/gmkziz/.pyenv/versions/3.14.5/envs/test? (y/N) y

Installation des outils DevOps

Ansible

Si vous devez installer l'une des dernières versions de Ansible, assurez-vous d'utiliser les dernières versions versions Python.

Même si vous utilisez un système d'exploitation qui ne fournit pas nativement les dernières versions de Python, vous pouvez les installer avec pyenv Voir Gestion des versions Python pour cela.

Ensuite, suivez les instructions d'installation sur Installation d'Ansible.

Helm

Suivez les instructions d'installation sur Installation de Helm.

Helmfile

Suivez les instructions d'installation sur Installation de Helmfile.

Kubectl et les plugins

Suivez les instructions d'installation et de configuration à l'adresse suivante :

Git

Initialisation

Créez un dossier et accédez-y. Exécutez ensuite la commande suivante pour indiquer à Git de commencer à suivre toutes les modifications apportées à ce dossier :

git init

Si vous souhaitez enregistrer les modifications dans un dépôt Git distant, assurez-vous d'en avoir créé un. Gitlab, Github ou votre plateforme préférée. Ensuite, copiez l'URL Git SSH ou HTTPS du dépôt distant et exécutez la commande suivante pour connecter votre dossier local à celui-ci :

git remote add origin https://gitlab.com/username/project-name.git

Le dépôt Git distant est désormais connecté au dossier local et est désigné par l'alias « origin », ce qui signifie simplement que nous pourrons utiliser « origin » pour faire référence à ce dépôt lors de l'exécution de commandes Git afin d'enregistrer des modifications à distance, par exemple.

Pour afficher les alias configurés, vous pouvez exécuter :

git remote -v

Gestion des modifications

État de Git

Toute modification effectuée dans un dossier suivi par Git sera enregistrée. Créons un nouveau fichier :

touch myfile.md
echo "Setting up a Git repository" > myfile.md

Git sait qu'un fichier a été créé. Nous pouvons le constater en exécutant la commande suivante :

git status
Git ajouter et valider

Pour enregistrer une modification effectuée dans un dépôt Git, il faut d'abord l'ajouter à la zone de préparation Git en exécutant la commande suivante :

git add myfile.md

Ensuite, nous pouvons créer l'enregistrement (un commit) en exécutant la commande suivante :

git commit -m "Initial commit"

Nous utilisons l'option '-m' pour spécifier un message pour l'enregistrement de modification.

Git journal et push

Pour consulter l'historique des commits, exécutez :

git log

Pour que les commits présents uniquement dans le dossier local soient également disponibles dans le dépôt Git distant, nous pouvons exécuter la commande suivante :

git push origin main

Cela téléchargera les enregistrements dans le dépôt distant représenté par l'alias « origin », dans la branche appelée « main ».

Gestion des branches et des étiquettes

Pour créer une branche :

git branch mybranch

Pour créer une branche et basculer directement vers cette branche :

git checkout -b mybranch

Pour créer une étiquette :

git tag mytag

Pour basculer uniquement vers une branche ou une étiquette existante :

git checkout mybranch

# or

git checkout mytag

Une étiquette (ou tag) est un instantané d'une branche à un point de commit précis. Normalement, elle ne devrait pas être modifiée et un push classique vers une étiquette ne fonctionnera pas. Cependant, si pour une raison particulière vous devez un jour mettre à jour une étiquette, c'est possible.

Commencez par consulter l'étiquette :

git checkout mytag

Ensuite, effectuez les modifications, indexez-les et validez-les (git add + git commit). Vous pourrez ensuite mettre à jour le contenu de l'étiquette dans le dépôt distant en exécutant :

git push origin HEAD:mytag --force
Extraction de données depuis des dépôts distants

sans affecter les modifications locales existantes

Pour récupérer les modifications du dépôt distant, exécutez :

git pull

Si vous avez déjà des modifications locales qui n'ont pas encore été validées (dans l'espace de travail Git), vous pouvez les mettre de côté avant de les récupérer en utilisant :

git stash

Ensuite, après l'extraction, utilisez la commande suivante pour restaurer les modifications précédemment mises de côté dans la zone de travail Git :

git stash pop
Suppression des commits

Pour supprimer le dernier commit tout en conservant les modifications dans la zone de travail (modifications non indexées) :

git reset --mixed HEAD~1

Pour supprimer le dernier commit tout en conservant les modifications dans la zone de préparation (modifications préparées) :

git reset --soft HEAD~1

Pour supprimer complètement le dernier commit :

git reset --hard HEAD~1

Vous pouvez également utiliser un sha de commit spécifique au lieu de 'HEAD~1', ce qui signifie le commit précédent HEAD.

Si la modification a déjà été envoyée au dépôt distant, vous pouvez utiliser la commande suivante pour également réécrire l'historique des modifications distantes :

git push --force

Récupération des commits d'autres branches

Pour sélectionner un commit spécifique d'une autre branche :

git cherry-pick <COMMIT_SHA>

Si vous avez des conflits à résoudre, résolvez-les, ajoutez-les à la zone de préparation avec « git add », puis continuez :

git chery-pick --continue

Gestion des sous-modules

Ajout d'un sous-module au projet
git submodule add git@git.example.com:my-project/ansible-role.git roles/ansible-role

Selon la version de Git que vous utilisez, il peut être nécessaire d'exécuter les commandes suivantes :

git submodule init
git submodule update

Pour plus de détails sur les commandes, exécutez :

git help submodule 

# or 

man git-submodule
Changement de branche du sous-module pour suivre les mises à jour

La branche suivie pour la mise à jour des sous-modules est la branche par défaut « master » ou « main ».

Pour mettre à jour votre sous-module avec les modifications d'une autre branche, ajoutez ce qui suit dans la section de configuration du sous-module du fichier '.gitmodules' :

branch = <BRANCH_NAME>

Ensuite, exécutez la commande suivante pour récupérer les modifications de la branche nouvellement configurée :

git submodule update --remote
Mise à jour des sous-modules du projet
git submodule init
git submodule update
git pull --recurse-submodule && git submodule update --remote

Pour plus de détails sur les commandes exécutées :

git help submodule

# and

git help pull
Suppression des sous-modules du projet

Commencez par supprimer les références au sous-module dans le fichier '.git/config' :

git submodule deinit <path_to_submodule>

Supprimer les fichiers sources du sous-module :

git rm <path_to_submodule>

Validation des modifications et nettoyage final :

git commit -m "Remove submodule"
rm -rf .git/modules/<path_to_submodule>

Gestion des secrets

Chiffrement de fichiers avec l'âge

Vous pouvez utiliser âge Pour chiffrer des fichiers, utilisez votre gestionnaire de paquets préféré pour installer age. Consultez documentation d'installation de l'âge Pour en savoir plus. Voici un exemple :

apt update && apt install age

Avant de chiffrer un fichier, je dois d'abord générer une paire de clés d'âge :

$ age-keygen 
# created: 2026-07-08T08:04:47+02:00
# public key: age14vda95227jg0j9e99phktkcp6yh7w5c47xs9pyzs2a7nxv5wvggs4xty6r
AGE-SECRET-KEY-1TLN540QJAGHCXV4J40V6C6PTTK5U2ZVDGQSR98Y4EDMKP6XDAP5SX0PGSA

ou avec la commande suivante pour enregistrer le résultat dans un fichier :

$ age-keygen -o age.key
Public key: age133k7cuausk7wy0tg34rtwsauyavzgtc59acflcmtqartjhqw6swq0hx67a

# Result

$ cat age.key 
# created: 2026-07-08T08:05:26+02:00
# public key: age133k7cuausk7wy0tg34rtwsauyavzgtc59acflcmtqartjhqw6swq0hx67a
AGE-SECRET-KEY-1YRJDQ363ELM57NZ4NXTKFGYLY50GWZ026UXS986M82ALTKQNF4DS778DXE

Le hashtag sert aux commentaires. La clé publique est commentée dans ce fichier, et les commentaires sont ignorés par age. Par conséquent, transmettre ce fichier à age ne fournira que la clé privée.

Voici un exemple de fichier que je souhaite chiffrer :

$ cat hello.txt 
hello

Je peux chiffrer ce fichier en utilisant ma clé privée d'âge comme suit :

$ age -e -i age.key hello.txt > hello.txt.age
$ cat hello.txt.age 
age-encryption.org/v1
-> X25519 hekluD+srYJz+DqP0ybJ3zKR1Yv2s2nV8ulUl1o1/0Q
sjC+4a4kizLTYILo4uqC7XK8BBqNt8nyXNovigx5sR0
--- 7Lo3Vt3MQvgWQC6xoU41VZhTuSs/tCh+/XpIHGu84t8
ϒ(8L$
:+Z  6U1

La commande `age` affiche toujours le résultat sur la sortie standard (stdout) par défaut. Il est donc nécessaire de rediriger les sorties vers des fichiers. Voici le résultat obtenu en exécutant la commande de chiffrement ci-dessus sans redirection :

$ age -e -i age.key hello.txt
age: error: refusing to output binary to the terminal
age: hint: did you mean to use -a/--armor?
age: hint: force anyway with "-o -"
age: report unexpected or unhelpful errors at https://filippo.io/age/report

Refus d'afficher du texte binaire dans le terminal. On peut également utiliser un format encodé en PEM pour la sortie en utilisant l'option « -a ». Avec ce format, age n'empêche pas l'affichage dans le terminal.

$ age -e -i age.key -a hello.txt
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBBeStMemd2dVRvckxXckZG
UFFjK2VDOVE2VWl6V3crbjJKcVlzNTllM0RRClgzd1FhaGFoU3JSRnlaWm1lYjR1
dTRjck5FZ2NOOGFzK3pDak1aOGJyaG8KLS0tIFhGaS9pTVZGTVZoWHA3TE9GTEhY
NWRCdTlpSFlVK1RNc2xoMmQrK29RYUUKOxhDYAqR0aqKlajbG0xhBSehC+X47Xic
GJMWBVskjvewt3/E35Q=
-----END AGE ENCRYPTED FILE-----

Pour déchiffrer le fichier, que ce soit au format binaire ou PEM, exécutez :

$ age -d -i age.key hello.txt.age
hello

Google Cloud

DNS en nuage

Créez un enregistrement CNAME DNS dans Cloud DNS
gcloud dns --project=myproject record-sets create _acme-challenge.mydomain.com. --zone="my-clouddns-zone" --type="CNAME" --ttl="300" --rrdatas="9yy23a46-90e1-55f7-a4tv-2zb1a21774bb.5.authorize.certificatemanager.goog."

Gestionnaire de certificat

Créer des certificats à partir de fichiers de certificats et de clés existants
gcloud certificate-manager certificates create mycert --private-key-file=key.pem --certificate-file=cert.pem --location=europe-west1
Liste des certificats

Pour lister les certificats :

gcloud certificate-manager certificates list 

La commande ci-dessus est équivalente à :

gcloud certificate-manager certificates list --location=global

Pour afficher les certificats qui ne possèdent pas de localisation globale, utilisez :

gcloud certificate-manager certificates list --location=$region
Générer des certificats gérés via un défi DNS

Demande d'autorisation DNS pour le certificat '*.mydomain.com' :

gcloud certificate-manager dns-authorizations create wildcard-mydomain-com --domain="mydomain.com"

Afficher l'entrée DNS à créer pour la vérification de la propriété du domaine :

gcloud certificate-manager dns-authorizations describe wildcard-mydomain-com

Une fois l'entrée DNS de défi créée, demandez la génération du certificat :

gcloud certificate-manager certificates create wildcard-mydomain-com --domains="*.mydomain.com,mydomain.com" --dns-authorizations=wildcard-mydomain-com

Afficher l'état de la génération du certificat :

gcloud certificate-manager certificates describe wildcard-mydomain-com

Moteur de calcul (machines virtuelles)

Cloner une machine virtuelle

Créer une image système de la machine virtuelle :

gcloud beta compute machine-images create my-vm-copy --project=my-project 
--source-instance=my-vm --source-instance-zone=europe-west1-b 
--storage-location=europe-west1

Pour créer une nouvelle machine virtuelle à partir de l'image système, il suffit de créer une machine virtuelle avec l'option '--source-machine-image=my-vm-copy', indiquant l'image système à utiliser pour créer la machine.

Planifiez l'arrêt et le démarrage des machines virtuelles.

Avec Terraform, Utilisez l' google_compute_resource_policy ressource pour créer la stratégie de planification d'instance. Supposons que nous appelions cette ressource my_schedule_policy par exemple.

Ensuite, associez la stratégie de planification nommée my_schedule_policy à la ressource du moteur de calcul :

resource "google_compute_instance" "instance" {
  (...)
  resource_policies = google_compute_resource_policy.my_schedule_policy.self_link
  (...)
}

Cloud SQL

Planifiez l'arrêt et le démarrage des instances CloudSQL avec Cloud Scheduler.

GCP Cloud Scheduler peut être utilisé pour planifier des tâches qui s'exécutent à des heures précises et interagir avec certaines ressources GCP comme Cloud Pub/Sub et App Engine.

Ces tâches peuvent également effectuer des requêtes HTTP et, par conséquent, interagir avec d'autres ressources GCP, comme Cloud SQL, via leurs API. Il est possible d'authentifier les requêtes HTTP avec un compte de service GCP.

Avec Terraform, Utilisez l' ressource google_cloud_scheduler_job Pour créer la tâche planifiée, voici des exemples de définitions de ressources pour arrêter et démarrer une base de données Cloud SQL :

resource "google_cloud_scheduler_job" "stop_cloud_sql_instance" {
  name        = var.stop_cloud_sql_instance_job_name
  description = var.stop_cloud_sql_instance_job_description
  schedule    = var.stop_cloud_sql_instance_job_schedule
  time_zone   = var.jstop_cloud_sql_instance_job_time_zone

  http_target {
    http_method = "PATCH"
    uri         = "https://sqladmin.googleapis.com/sql/v1beta4/projects/${var.project_id}/instances/${var.cloud_sql_instance_name}"
    headers = {
      "Content-Type"  = "application/json"
    }
    body = base64encode(jsonencode({
      settings = {
        activationPolicy = "NEVER" # Use "NEVER" to stop and "ALWAYS" to start the Cloud SQL instance
      }
    }))
    oauth_token {
      service_account_email = google_service_account.cloud_scheduler_service_account.email
    }
  }
  
  retry_config {
    retry_count          = 3
    max_retry_duration   = "600s"
    min_backoff_duration = "5s"
    max_backoff_duration = "60s"
  }
}

Le compte de service `cloud_scheduler_service_account` utilisé dans l'exemple précédent doit être ajouté au projet hébergeant l'instance Cloud SQL, avec le rôle `cloudscheduler.jobRunner`. Voici un extrait de code Terraform permettant de créer ce compte de service et de l'ajouter au projet cible avec le rôle approprié :

  • Créez un compte de service pour la tâche planifiée :
resource "google_service_account" "scheduler_service_account" {
  account_id   = var.service_account.name
  display_name = var.service_account.name
}

(...)
  • Ajoutez le compte de service du planificateur à my_gcp_project avec le rôle 'cloudscheduler.jobRunner' :
(...)

resource "google_project_iam_member" "roles" {
  project = "my_gcp_project"
  role    = "roles/cloudscheduler.jobRunner"
  member  = "serviceAccount:${resource.google_service_account.scheduler_service_account.email}"
}
restauration de base de données d'instance à instance
  • La version de l'instance de base de données à restaurer doit être identique à ou
    supérieure à la version de l'instance de base de données de sauvegarde

  • Toutes les bases de données contenues dans l'instance de restauration seront écrasées.
    (y compris la base de données des utilisateurs utilisée pour la connexion à l'instance)

export BACKUP_INSTANCE=""
export BACKUP_PROJECT=""

# Optionally create a backup on backup database instance
gcloud sql backups create -i $BACKUP_INSTANCE --project $BACKUP_PROJECT

# To list existing backups and asociated
# backup run IDs on backup instance
gcloud sql backups list -i $BACKUP_INSTANCE --project $BACKUP_PROJECT --limit 3

# Set BACKUP_ID
export BACKUP_ID=""

# Optionally set the value of BACKUP_ID 
# to the latest backup run ID
export BACKUP_ID="$(gcloud sql backups list -i $BACKUP_INSTANCE \
  --project $BACKUP_PROJECT --limit 1 \
  --format json | jq -r '.[].id' )"

# Set RESTORE_PROJECT and RESTORE_INSTANCE
export RESTORE_PROJECT=""
export RESTORE_INSTANCE=""
restauration d'instance à instance du même projet
gcloud sql backups restore $BACKUP_ID \
  --backup-instance=$BACKUP_INSTANCE \
  --restore-instance=$RESTORE_INSTANCE \
  --project=$RESTORE_PROJECT # project where backup and restore 
                         # instances reside
restauration d'instance à instance entre projets
gcloud sql backups restore $BACKUP_ID \
  --backup-instance=$BACKUP_INSTANCE \
  --backup-project=$BACKUP_PROJECT \
  --restore-instance=$RESTORE_INSTANCE \
  --project=$RESTORE_PROJECT
Restauration d'instance à instance via l'API
# restore_request.tpl file content

{     
    "restoreBackupContext": {         
        "backupRunId": $BACKUP_ID, 
        "project": "$BACKUP_PROJECT",
        "instanceId": "$BACKUP_INSTANCE"    
    } 
}

# Create request.json file
export TEMPLATE=restore_request.tpl
export BACKUP_ID=""
export BACKUP_PROJECT=""
export BACKUP_INSTANCE=""

cat $TEMPLATE | envsubst > request.json

# Restore instance settings
export RESTORE_INSTANCE=""
export RESTORE_PROJECT="" 

# Restore choosen BACKUP_ID to restore instance
curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json; charset=utf-8" \
  -d @request.json "https://sqladmin.googleapis.com/v1/projects/$RESTORE_PROJECT/instances/$RESTORE_INSTANCE/restoreBackup" | tee -a result.json

# See operation status
export OPERATION_NAME=$(cat result.json | jq -r '.name')
gcloud sql operations wait $OPERATION_NAME --project $RESTORE_PROJECT --timeout=1800

Kit de développement logiciel (SDK) Gcloud

  • Pour l'installation du SDK Google Cloud, consultez la documentation. ceci.

  • Pour l'installation des paquets snap sous Ubuntu, consultez : ceci.Cette méthode permet des mises à jour automatiques.

Versions et mises à niveau du SDK et de ses composants

Afficher la version du SDK et l'état des composants :

gcloud components list

Afficher les versions du SDK et des composants installés :

gcloud version 

Installer ou supprimer des composants pour la version actuelle du SDK :

gcloud components install $component_id
gcloud components remove $component_id

Mise à jour du SDK et des versions des composants installés :

gcloud components update [--version=$version]

Restaurer le SDK ou ses composants à la version précédente :

gcloud components update --version=$previous_version

Conteneurs

Se connecter aux registres

Connexion Docker au registre d'artefacts Google Cloud

Avec compte utilisateur :

gcloud auth configure-docker gcr.io

Avec la clé du compte de service :

cat sac.json | docker login -u _json_key --password-stdin https://gcr.io

Les

Ajout d'un seul fichier au système de fichiers conteneurisé à l'aide de volumes
(...)
      volumes:
        - name: app-config
          configMap:
            name: app-config
            items: # we want the file inside the container to be called .env
            - key: config.env
              path: .env
      containers:
      - name: app
        volumeMounts:
          - name: app-config
            mountPath: /app/config/.env
            subPath: .env # this creates the /app/config/.env and keep the old files

Voici le résultat:

#----------------------#
# With 'subPath: .env' #
#----------------------#

/app $ ls -lah config/
total 24K
drwxr-xr-x    1 www-data www-data    4.0K Oct 10 14:59 .
drwxr-xr-x    1 www-data www-data    4.0K Oct  9 15:07 ..
-rw-r--r--    1 root     www-data     377 Oct 10 14:59 .env # <= a file
-rwxr-xr-x    1 www-data www-data    3.0K Oct  9 15:07 config.inc.php
-rwxr-xr-x    1 www-data www-data     629 Oct  9 15:07 config_env.php

# Accessing the mounted file 
/app $ cat config/.env
MYVAR=VALUE

#-------------------------#
# Without 'subPath: .env' #
#-------------------------#

/app $ ls -lah config/
total 24K    
drwxr-xr-x    1 www-data www-data    4.0K Oct 10 15:13 .
drwxr-xr-x    1 www-data www-data    4.0K Oct  9 15:07 ..
drwxrwsrwx    3 root     www-data    4.0K Oct 10 15:13 .env # <= a directory
-rwxr-xr-x    1 www-data www-data    3.0K Oct  9 15:07 config.inc.php
-rwxr-xr-x    1 www-data www-data     629 Oct  9 15:07 config_env.php

# Accessing the mounted file
/app $ cat config/.env/.env
MYVAR=VALUE

Le Monitoring

Surveillance des machines virtuelles

Règles d'alerte Prometheus pour le processeur, la RAM et les disques

Prérequis : déployer Prometheus exportateur de nœuds Exportateur sur les machines cibles.

- name: MyApp # alerting rules group name
  rules:
  - alert: "Warning on servers filesystem"
    expr: (100 - ((node_filesystem_avail_bytes{fstype=~"ext4",instance=~"machine-name.*"} * 100) / node_filesystem_size_bytes{fstype=~"ext4",instance=~"machine-name.*"})) > 75
    for: 5m
    labels:
      severity: warning
    annotations:
      alert: "Servers FS Warning"
      value: "Filesystem {{ $labels.mountpoint }} usage is {{ $value }}%"

  - alert: "Warning on servers RAM"
    expr: (node_memory_MemAvailable_bytes{instance=~"machine-name.*"} / node_memory_MemTotal_bytes{instance=~"machine-name.*"}) * 100 < 20 # Available RAM under 20%
    for: 5m
    labels:
      severity: warning
    annotations:
      alert: "Servers RAM pressure Warning" 
      value: "Available RAM is under 20%. Current value is : {{ $value }}%"

  - alert: "Warning on servers CPU load"
    expr: 100 - (avg by(gce_instance) (rate(node_cpu_seconds_total{instance=~"machine-name.*", mode="idle"}[5m])) * 100) > 85
    for: 5m
    labels:
      severity: warning
    annotations:
      alert: "Servers CPU load Warning"
      value: "CPU load > 85%. Current value is : {{ $value }}%"
Règles d'alerte Prometheus pour les processus

Conditions préalables:

  • déployer le Prométhée exportateur de processus exportateur sur machines cibles

  • créer le fichier de configuration de l'exportateur de processus ' /config.yml'

# Process exporter config file used to select 
# the processes whose metrics will be exported
process_names:
  # One way
  - comm:
    - mysqld # name of the process found in /proc/<PID>/comm
  # Another way
  - name: ".pm2" # custom process name that will be visible in exported metrics 
    cmdline:
    - 'PM2.*God Daemon.*' # command line used by the process printed by
                          # the ps aux | grep -i "pattern" command
  • Exécutez le binaire de l'exportateur avec '-config.path' /config.yml' pour indiquer le chemin d'accès au fichier de configuration à utiliser

Voici un exemple de série temporelle exportée que nous pourrions utiliser pour envoyer des alertes lorsqu'un des processus configurés n'est pas en cours d'exécution :

namedprocess_namegroup_num_procs{groupname="mysqld"} 1

Voici un exemple de règle d'alerte Prometheus :

- name: MyApp # alerting rules group name
  rules:
  - alert: "Mysqld process is missing"
    expr: namedprocess_namegroup_num_procs{instance=~"machine-name.*",groupname="mysqld"} < 1
    for: 5m
    labels:
      severity: critical
    annotations:
      alert: "Mysqld process is missing"
      value: "No process {{ $labels.groupname }} running : {{ $value }}"

Surveillance des applications Kubernetes

Par le biais de kube-state-metrics

Il peut être utile d'avoir métriques-état-kube déployés au sein de votre cluster afin de pouvoir obtenir les métriques listées à Métriques exposées par kube-state-metrics pour des ressources Kubernetes spécifiques.

Voici quelques idées de surveillance minimales que vous pouvez utiliser pour superviser vos applications Kubernetes, avec des requêtes PromQL/MetricsSQL associées. métriques-état-kube métrique:

  • Surveillez le nombre de vos pods de réplication : recevez une alerte lorsque le nombre de pods de réplication pour votre déploiement ou ressource StatefulSet est inférieur à la valeur attendue.
# Monitor deployment replicas
kube_deployment_status_replicas_available{exported_namespace="myapp"} < kube_deployment_spec_replicas{exported_namespace="myapp"}
  • Surveiller les redémarrages des conteneurs Pods : recevoir une alerte lorsqu’un conteneur à l’intérieur de votre Pod a redémarré.
# Monitor Pods containers restarts
kube_pod_container_status_restarts_total{exported_namespace="myapp"} > 0
  • Surveillance des CrashLoopBackOffs : alerte lorsqu’un conteneur Pod est en état CrashLoopBackOff :
# Monitor CrashLoopBackOff
kube_pod_container_status_waiting_reason{exported_namespace="myapp",reason="CrashLoopBackOff"} > 0

Voici quelques exemples de métriques qu'il peut être utile de visualiser à l'aide de tableaux de bord de métriques :

  • kube_pod_container_status_running: le nombre de conteneurs de votre application en cours d'exécution (kube-state-metrics)

  • kube_pod_container_status_restarts_total: le nombre de conteneurs de votre application qui ont redémarré (kube-state-metrics)