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.
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.
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
etconteneur-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) :
-
Dans le dossier de vos
Documents
, créez le dossiertp-ansible
: -
Créez un fichier
Dockerfile
dans le dossiertp-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 :
-
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. -
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. -
mkdir /var/run/sshd
: Crée le répertoire/var/run/sshd
qui est nécessaire pour que le serveur SSH puisse fonctionner correctement. -
echo 'root:YOUR_PASSWORD' | chpasswd
: Change le mot de passe de l'utilisateur root à la valeurYOUR_PASSWORD
. Vous devez remplacerYOUR_PASSWORD
par un mot de passe réel avant de construire l'image. -
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.
-
Construisez une image à partir de ce
Dockerfile
:docker build -t my-debian-ssh .
-
Vérifiez la présence de votre image, avec la commande :
docker images
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.
-
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 -
Vérifiez le bon fonctionnement de vos conteneurs, avec la commande :
docker ps -a
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 :
- Installer le client SSH sur le serveur Ansible.
- Générer une paire de clés SSH sur le serveur Ansible.
- Installer le serveur SSH sur tous les serveurs cibles.
- Copier la clé publique SSH du serveur Ansible vers les serveurs cibles.
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.
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
-
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.
-
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.
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 commandeecho
à 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.
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 fichierauthorized_keys
.
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 fichierauthorized_keys
doit appartenir à l'utilisateurroot
et au grouperoot
./root/.ssh/authorized_keys
est le fichier dont vous changez la propriété.
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
etconteneur-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
etconteneur-web-3
, en remplaçantconteneur-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.
Cette commande doit être saisie dans le conteneur Ansible.
Vous ne devriez pas être invité à saisir un mot de passe.
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