TP - Préparation du lab Ansible avec des conteneurs Incus
Installation de Ansible
- Installez Ansible au niveau du système avec
pipen lançant:
sudo apt install ansible
- Affichez la version pour vérifier que c'est bien la dernière stable.
ansible --version
- Traditionnellement lorsqu'on veut vérifier le bon fonctionnement d'une configuration on utilise
ansible all -m ping. Que signifie-t-elle ?
Réponse
- Lancez la commande précédente. Que ce passe-t-il ?
Réponse
ansible all -m ping
Cette commande renvoie une erreur car all ne matche aucun hôte.
- Utilisez en plus l'option
-vvvpour mettre en mode très verbeux. Ce mode est très efficace pour débugger lorsqu'une erreur inconnue se présente. Que se passe-t-il avec l'inventaire ?
Réponse
`ansible all -m ping -vvv
ansible essaye de trouver un inventaire c'est à dire une liste de machine à contacter et cherche par défaut le fichier /etc/ansible/hosts. Comme il ne trouve rien il crée un inventaire implicite contenant uniquement localhost.
- Testez l'installation avec la commande
ansibleen vous connectant à votre machinelocalhostet en utilisant le moduleping.
Réponse
ansible localhost -m ping
La commande échoue car ssh n'est pas configuré sur l'hote mais la machine est contactée (sortie en rouge). Nous allons dans la suite créer des machines de lab avec ssh installé.
- Ajoutez la ligne
hotelocal ansible_host=127.0.0.1 ansible_connection=localdans l'inventaire par défaut (le chemin est indiqué dans). Et pinguer hotelocal.
Autocomplete
sudo apt install python3-argcomplete
# ou python3 -m pip install --user argcomplete
activate-global-python-argcomplete --user
Explorer LXD / Incus
LXD est une technologie de conteneurs actuellement promue par Canonical (ubuntu) qui permet de faire des conteneur linux orientés systèmes plutôt qu'application. Par exemple systemd est disponible à l'intérieur des conteneurs contrairement aux conteneurs Docker.
Incus est le successeur de LXD, abandonné par ses devs à cause des choix de Canonical.
Affichez la liste des conteneurs avec
incus list. Aucun conteneur ne tourne.Maintenant lançons notre premier conteneur
almalinuxavecincus launch images:almalinux/8/amd64 almalinux1.Listez à nouveau les conteneurs lxc.
Ce conteneur est un almalinux minimal et n'a donc pas de serveur SSH pour se connecter. Pour lancez des commandes dans le conteneur on utilise une commande LXC pour s'y connecter
incus exec <non_conteneur> -- <commande>. Dans notre cas nous voulons lancer bash pour ouvrir un shell dans le conteneur :incus exec almalinux1 -- bash.Nous pouvons installer des logiciels dans le conteneur comme dans une VM. Pour sortir du conteneur on peut simplement utiliser
exit.Un peu comme avec Docker, LXC utilise des images modèles pour créer des conteneurs. Affichez la liste des images avec
incus image list. Trois images sont disponibles l'image almalinux vide téléchargée et utilisée pour créer almalinux1 et deux autres images préconfiguréeubuntu_ansibleetalmalinux_ansible. Ces images contiennent déjà la configuration nécessaire pour être utilisée avec ansible (SSH + Python + Un utilisateur + une clé SSH).Supprimez la machine almalinux1 avec
incus stop almalinux1 && incus delete almalinux1-->
Nous avons besoin d'images Linux configurées avec SSH, Python et un utilisateur de connexion (disposant idéalement d'une clé ssh configurée pour éviter d'avoir à utiliser un mot de passe de connection)
Configurer manuellement des images prêtes pour Ansible
Facultatif : Configurer un conteneur pour Ansible manuellement
Si vous devez refaire les travaux pratiques from scratch (sans la VM de TP actuelle et le script de génération lxd.sh), vous pouvez générer les images LXD pour la suite avec les instructions suivantes:
- Connectez vous dans le conteneur avec la commande
incus execprécédente. Une fois dans le conteneur lancez les commandes suivantes:
Pour almalinux
# installer SSH
yum update -y && yum install -y openssh-server sudo
systemctl start sshd
# verifier que python2 ou python3 est installé
python --version || python3 --version
## Attention copiez cette commande bien correctement
# configurer sudo pour être sans password
sed -i 's@\(%wheel.*\)ALL@\1 NOPASSWD: ALL@' /etc/sudoers
# Créer votre utilisateur de connexion
useradd -m -s /bin/bash -G wheel votreprenom
# Définission du mot de passe
passwd votreprenom
exit
Pour ubuntu
# installer SSH
apt update && apt install -y openssh-server sudo
# verifier que python2 ou python3 est installé
python --version || python3 --version
## Attention copiez cette commande bien correctement
# configurer sudo pour être sans password
sed -i 's@\(%sudo.*\)ALL@\1 NOPASSWD: ALL@' /etc/sudoers
# Créer votre utilisateur de connexion
useradd -m -s /bin/bash -G sudo votreprenom
# Définission du mot de passe
passwd votreprenom
exit
Copier la clé ssh à l'intérieur
Maintenant nous devons configurer une identité (ou clé) ssh pour pouvoir nous connecter au serveur de façon plus automatique et sécurisée. Cette clé a déjà été créé pour votre utilisateur stagiaire. Il reste à copier la version publique dans le conteneur.
- On copie notre clé dans le conteneur en se connectant en SSH avec
ssh_copy_id:
incus list # permet de trouver l'ip du conteneur
ssh-copy-id -i ~/.ssh/id_ed25519 stagiaire@<ip_conteneur>
ssh stagiaire@<ip_conteneur>
Exporter nos conteneurs en image pour pouvoir les multiplier
LXD permet de gérer aisément des snapshots de nos conteneurs sous forme d'images (archive du systeme de fichier + manifeste).
Nous allons maintenant créer snapshots opérationnels de base qui vont nous permettre de construire notre lab d'infrastructure en local.
incus stop almalinux1
incus publish --alias almalinux_ansible_ready almalinux1
incus image list
On peut ensuite lancer autant de conteneur que nécessaire avec la commande launch:
incus launch almalinux_ansible_ready almalinux2 almalinux3
- Une fois l'image exportée faite supprimez les conteneurs.
incus delete almalinux1 almalinux2 almalinux3 --force
Lancer et tester les conteneurs
Créons à partir des images du remotes un conteneur ubuntu et un autre almalinux:
incus launch ubuntu_ansible ubu1
incus launch almalinux_ansible almalinux1
- Pour se connecter en SSH nous allons donc utiliser une clé SSH appelée
id_ed25519qui devrait être présente dans votre dossier~/.ssh/. Vérifiez cela en lançantls -l /home/stagiaire/.ssh.
- Essayez de vous connecter à
ubu1etalmalinux1en ssh pour vérifier que la clé ssh est bien configurée et vérifiez dans chaque machine que le sudo est configuré sans mot de passe avecsudo -i.
Créer un projet de code Ansible pour tester la connection à nos machines
Lorsqu'on développe avec Ansible il est conseillé de le gérer comme un véritable projet de code :
- versionner le projet avec Git
- Ajouter tous les paramètres nécessaires dans un dossier pour être au plus proche du code. Par exemple utiliser un inventaire
inventory.cfgouhostset une configuration locale au projetansible.cfg
Nous allons créer un tel projet de code pour la suite du tp1
- Créez un dossier projet
tp1sur le Bureau.
Facultatif
- Initialisez le en dépôt git et configurez git:
cd tp1
git config --global user.name "<votre nom>"
git config --global user.email "<votre email>"
git init
- Ouvrez Visual Studio Code.
- Installez l'extension Ansible dans VSCode.
- Ouvrez le dossier du projet avec
Open Folder...
Un projet Ansible implique généralement une configuration Ansible spécifique décrite dans un fichier ansible.cfg
- Ajoutez à la racine du projet un tel fichier
ansible.cfgavec à l'intérieur:
[defaults]
inventory = ./inventory.cfg
roles_path = ./roles
host_key_checking = false # nécessaire pour les labs ou on créé et supprime des machines constamment avec des signatures SSH changées.
# stdout_callback = yaml
# bin_ansible_callbacks = True
- Créez le fichier d'inventaire spécifié dans
ansible.cfget ajoutez à l'intérieur notre nouvelle machinehote1. Il faut pour cela lister les conteneurs lxc lancés.
incus list # récupérer l'ip de la machine
Générez une clé si elle n'existe pas avec ssh-keygen.
On va copier cette clé à distance avec ssh-copy-id.
Créez et complétez le fichier inventory.cfg d'après ce modèle:
ubu1 ansible_host=<ip>
[all:vars]
ansible_user=stagiaire
- Dans le dossier du projet, essayez de lancer la commande ad-hoc
pingsur cette machine :ansible all -m ping