Aller au contenu principal

Gérer des serveurs avec Ansible

Notre mission consiste à configurer le conteneur Ansible pour qu'il puisse gérer 3 conteneurs cibles.

Il faut donc tout d'abord, créer 3 nouveaux conteneurs Debian en utilisant Docker.

attention

Dans le cas de conteneurs basés sur des images comme debian, si aucun processus de premier plan n'est spécifié, le conteneur s'arrêtera immédiatement après son démarrage car l'image de base ne définit pas de processus démon par défaut.

Qu'est ce qu'un processus démon sous Linux ?

Sous Linux (et les systèmes d'exploitation de type UNIX) un processus démon est un processus d'arrière-plan qui s'exécute sans être directement contrôlé par un utilisateur.

Les démons sont souvent lancés au démarrage du système et restent en fonctionnement jusqu'à ce que le système soit arrêté.

Ils effectuent diverses tâches systèmes ou de réseau, souvent liées à l'administration du système, comme la gestion des connexions réseau, l'impression, la gestion des courriels, la planification de tâches (cron), et bien d'autres services.

Le terme "démon" est un jeu de mots basé sur le concept du démon de la mythologie, qui est un esprit qui sert et effectue des tâches pour son maître.

astuce

Pour résoudre le problème des conteneurs qui ne restent pas actif, il suffit de créer un fichier Dockerfile pour personnaliser l'image du conteneur et y installer un serveur SSH.

Création de 3 conteneurs Debian

Nous allons créer 3 conteneurs cibles : conteneur-web-1, conteneur-web-2 et conteneur-web-3 qui seront gérés par Ansible.

Pour démarrer le serveur SSH dans un conteneur et le garder en vie, nous allons créer un fichier Dockerfile afin de personnaliser l'image du conteneur et y installer un serveur SSH et Python3 (qui est utilisé par Ansible) :

  1. Dans le dossier de vos Documents, créez le dossier tp-ansible :

  2. Créez un fichier Dockerfile dans le dossier tp-ansible :

    FROM debian:latest

    RUN apt update && \
    apt install -y openssh-server python3 && \
    mkdir /var/run/sshd && \
    echo 'root:YOUR_PASSWORD' | chpasswd && \
    sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

    # Ajoutez ici d'autres configurations si nécessaire

    EXPOSE 22
    CMD ["/usr/sbin/sshd", "-D"]

    Remplacez YOUR_PASSWORD par le mot de passe que vous souhaitez définir pour l'utilisateur root.

Explication des lignes de ce Dockerfile

FROM debian:latest

Cette instruction indique que l'image de base à utiliser est la dernière version de Debian. Lorsque vous allez créer votre conteneur, il commencera par cette image comme point de départ.

RUN apt update && \
apt install -y openssh-server python3 && \
mkdir /var/run/sshd && \
echo 'root:YOUR_PASSWORD' | chpasswd && \
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

Cette instruction RUN exécute plusieurs commandes dans le shell du conteneur, séparées par des && pour qu'elles s'exécutent successivement :

  1. apt update : Met à jour la liste des paquets disponibles et de leurs versions. C'est une bonne pratique de le faire avant d'installer de nouveaux paquets.

  2. apt install -y openssh-server python3 : Installe le serveur SSH (openssh-server) et Python 3 (python3). L'option -y signifie "oui" à toutes les invites pendant l'installation, ce qui permet à l'installation de se dérouler sans intervention manuelle.

  3. mkdir /var/run/sshd : Crée le répertoire /var/run/sshd qui est nécessaire pour que le serveur SSH puisse fonctionner correctement.

  4. echo 'root:YOUR_PASSWORD' | chpasswd : Change le mot de passe de l'utilisateur root à la valeur YOUR_PASSWORD. Vous devez remplacer YOUR_PASSWORD par un mot de passe réel avant de construire l'image.

  5. sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config : Modifie le fichier de configuration de SSH pour permettre à l'utilisateur root de se connecter via SSH. Par défaut, le login root est souvent désactivé pour des raisons de sécurité.

EXPOSE 22

Cette instruction indique que le conteneur écoutera sur le port 22, qui est le port par défaut pour les connexions SSH.

CMD ["/usr/sbin/sshd", "-D"]

Cette instruction définit la commande par défaut qui sera exécutée lorsque le conteneur démarre. Ici, elle démarre le serveur SSH avec l'option -D, qui indique au démon SSH de ne pas se détacher et de rester en premier plan. Cela est nécessaire dans un conteneur Docker car si le processus principal (PID 1) se termine, le conteneur s'arrête.

  1. Construisez une image à partir de ce Dockerfile :

    docker build -t my-debian-ssh .
  2. Vérifiez la présence de votre image, avec la commande :

    docker images
astuce

Afin de réutiliser facilement cette image (plus tard sur d'autres machines) vous pouvez l'envoyer sur le Docker Hub, à l'aide du tutoriel Les images Docker.

  1. Lancez vos conteneurs en utilisant cette nouvelle image :

    docker run -d --name conteneur-web-1 my-debian-ssh
    docker run -d --name conteneur-web-2 my-debian-ssh
    docker run -d --name conteneur-web-3 my-debian-ssh
  2. Vérifiez le bon fonctionnement de vos conteneurs, avec la commande :

    docker ps -a
info

Avec cette configuration, le serveur SSH sera le processus de premier plan dans le conteneur, et il restera actif indéfiniment, empêchant le conteneur de s'arrêter immédiatement.

Configuration de la connexion par clé SSH

Pour permettre au serveur Ansible de communiquer avec les serveurs cibles via SSH, il suffit de suivre ces étapes :

  1. Installer le client SSH sur le serveur Ansible.
  2. Générer une paire de clés SSH sur le serveur Ansible.
  3. Installer le serveur SSH sur tous les serveurs cibles.
  4. Copier la clé publique SSH du serveur Ansible vers les serveurs cibles.

attention

Dans notre configuration, le serveur Ansible est considéré comme un poste client qui va se connecter (via le protocole SSH) aux serveurs cibles.

Installer le client SSH sur le serveur Ansible

Sur le conteneur Ansible

1. Connectez-vous à votre conteneur Ansible.

Comment se connecter au conteneur Ansible ?

  • Si le conteneur est arrêté, le démarrer avec la commande :
docker start ansible-controle
  • Une fois le conteneur démarré, vous pouvez vous y connecter avec une session interactive en utilisant :
docker exec -it ansible-controle /bin/bash

La commande docker exec permet d'exécuter une commande dans un conteneur en cours d'exécution. L'option -it permet d'ouvrir une session interactive (-i pour "interactive" et -t pour allouer un pseudo-TTY), et /bin/bash lance un shell Bash dans le conteneur, vous permettant d'interagir avec lui.

2. Installez le client SSH.

Comment installer le client SSH ?

apt update 
apt install openssh-client

Saisir la touche Entrée pour valider les options par défaut.

3. Générez une paire de clés SSH.

La commande ssh-keygen permet de créer une paire de clés SSH (une clé privée et une clé publique).

Comment générer une paire de clés SSH ?

ssh-keygen -t rsa -b 4096

Lorsque vous exécutez ssh-keygen, appuyez simplement sur Entrée pour utiliser les valeurs par défaut et ne pas définir de passphrase.


Copier la clé publique SSH

Ensuite, il suffit de copier la clé publique SSH du serveur Ansible vers les serveurs cibles.

Rappel

Dans notre configuration, le serveur Ansible est considéré comme un poste client qui va se connecter (via le protocole SSH) aux serveurs cibles.

1. Connectez-vous à votre conteneur Ansible.

Comment se connecter au conteneur Ansible ?

  • Si le conteneur est arrêté, le démarrer avec la commande :
docker start ansible-controle
  • Une fois le conteneur démarré, vous pouvez vous y connecter avec une session interactive en utilisant :
docker exec -it ansible-controle /bin/bash

La commande docker exec permet d'exécuter une commande dans un conteneur en cours d'exécution. L'option -it permet d'ouvrir une session interactive (-i pour "interactive" et -t pour allouer un pseudo-TTY), et /bin/bash lance un shell Bash dans le conteneur, vous permettant d'interagir avec lui.

2. Copiez la clé publique SSH du conteneur Ansible vers chaque conteneur cible.

Vous pouvez le faire en affichant et en copiant la clé publique, puis en la collant manuellement dans le fichier authorized_keys de chaque conteneur cible :

cat ~/.ssh/id_rsa.pub

Copiez le contenu affiché.

3. Ajoutez la clé publique au fichier authorized_keys sur chaque conteneur cible.

Sur chaque conteneur cible, ajoutez la clé publique au fichier authorized_keys de l'utilisateur ansible avec les commandes suivantes :

docker exec -it conteneur-web-1 /bin/bash
mkdir -p /root/.ssh/
echo 'clé_publique' >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
chown root:root /root/.ssh/authorized_keys
exit
Explication des commandes pour l'accès SSH au conteneur avec root sans mot de passe

  1. docker exec -it conteneur-web-1 /bin/bash

    • docker exec est une commande qui permet d'exécuter une commande à l'intérieur d'un conteneur Docker qui est déjà en cours d'exécution.
    • -i signifie "interactif", ce qui garantit que l'entrée standard (stdin) reste ouverte pour la commande que vous exécutez dans le conteneur.
    • -t alloue un pseudo-TTY, ce qui rend l'interaction avec le processus exécuté plus conviviale (par exemple, cela permet d'utiliser un shell de manière interactive).
    • conteneur-web-1 est le nom ou l'ID du conteneur Docker dans lequel vous souhaitez exécuter la commande.
    • /bin/bash est la commande exécutée dans le conteneur, dans ce cas, il s'agit de démarrer une session shell bash.
  2. mkdir -p /root/.ssh/

  • mkdir est une commande qui crée un nouveau répertoire.
  • -p est une option qui permet de créer des répertoires parents si nécessaire ; cela signifie que si le répertoire /root n'existe pas, ou si le sous-répertoire .ssh n'existe pas, mkdir va les créer.
  1. echo 'clé_publique' >> /root/.ssh/authorized_keys
  • echo est une commande qui affiche une ligne de texte.
  • 'clé_publique' est la clé publique SSH que vous souhaitez ajouter (vous devez remplacer ce texte par la clé publique réelle).
  • >> est un opérateur de redirection qui ajoute la sortie de la commande echo à la fin du fichier spécifié, sans écraser le contenu existant du fichier.
  • /root/.ssh/authorized_keys est le fichier qui contient la liste des clés publiques SSH autorisées pour une connexion sans mot de passe au compte root à l'intérieur du conteneur.
  1. chmod 600 /root/.ssh/authorized_keys
  • chmod est une commande qui change les permissions d'un fichier ou d'un répertoire.
  • 600 définit les permissions de sorte que seul le propriétaire (dans ce cas, root) a le droit de lire et d'écrire dans le fichier. Personne d'autre ne peut lire ou écrire dans ce fichier, ce qui est une pratique de sécurité recommandée pour le fichier authorized_keys.
  1. chown root:root /root/.ssh/authorized_keys
  • chown est une commande qui change le propriétaire et le groupe d'un fichier ou d'un répertoire.
  • root:root indique que le fichier authorized_keys doit appartenir à l'utilisateur root et au groupe root.
  • /root/.ssh/authorized_keys est le fichier dont vous changez la propriété.
  1. exit
  • exit est une commande qui termine la session shell en cours, dans ce cas, elle vous fait sortir du shell interactif dans le conteneur Docker et vous ramène à votre shell hôte local.

  • Remplacez 'clé_publique' par la clé que vous avez copiée.

  • Répétez ces commandes pour conteneur-web-2 et conteneur-web-3.


Tester la connexion par clé SSH

Après avoir suivi ces étapes, votre conteneur Ansible devrait être capable de se connecter aux 3 autres conteneurs sans mot de passe en utilisant la clé SSH.

1. Récupérez l'adresse IP des 3 conteneurs.

Vous pouvez afficher l'adresse IP d'un conteneur avec la commande suivante :

docker inspect nom-du-conteneur

Par exemple :

docker inspect conteneur-web-1

Répétez cette étape pour conteneur-web-2 et conteneur-web-3, en remplaçant conteneur-web-1 par le nom approprié.

Tester une adresse IP avec la commande ping

Sous Debian (et la plupart des distributions Linux), la commande ping est généralement incluse par défaut car elle fait partie du package iputils-ping.

Dans un conteneur debian la commande ping n'est pas installée par défaut.

Vous pouvez installer la commande ping en utilisant la commande suivante :

sudo apt-get update
sudo apt-get install iputils-ping

2. Testez la connexion à chacun des 3 conteneurs à partir du conteneur Ansible.

Vous pouvez tester la connexion SSH avec la commande suivante depuis le conteneur Ansible :

ssh root@ip_du_conteneur_cible

Remplacez ip_du_conteneur_cible par l'adresse IP réelle du conteneur cible.

attention

Cette commande doit être saisie dans le conteneur Ansible.

Vous ne devriez pas être invité à saisir un mot de passe.

astuce

Puisque c'est le même utilisateur root sur les 2 machines (le client et le serveur), vous n'êtes pas obligés de préciser le nom de l'utilisateur lors de la connexion SSH :

ssh ip_du_conteneur_cible

Test de mémorisation/compréhension


Quelle commande permet de vérifier la présence de l'image construite à partir du Dockerfile ?


Quel fichier est modifié pour permettre la connexion root via SSH ?


Quelle est la raison pour laquelle un conteneur basé sur debian peut s'arrêter immédiatement après son démarrage ?


Quelle commande est utilisée pour construire une image Docker à partir d'un Dockerfile ?


Quelle commande est utilisée pour afficher l'adresse IP d'un conteneur Docker?


Quelle option est utilisée avec `docker exec` pour ouvrir une session interactive dans un conteneur?


Pourquoi doit-on exposer le port 22 dans le Dockerfile pour le conteneur SSH?


Quelle commande est utilisée pour générer une paire de clés SSH sur le serveur Ansible?