documentation/infrastructure/outils/ansible.md

8.8 KiB

Ansible

Ansible est un moyen de créer des configurations de serveur et de les déployer. Il permet ainsi l'accélération du déploiement de certains services et de permettre de les réinstaller en cas de problèmes.

Cette documentation n'étant pas exhaustive, il sera nécessaire de faire des tours dans les dossiers d'ansible et dans la documentation officielle d'ansible.

Prérequis

La configuration d'ansible du crans nécessite un certain nombre de prérequis.

Installation d'Ansible

Pour utiliser l'Ansible du crans, il faut installer Ansible sur votre machine personnelle. Il est possible de le faire avec la commande :

sudo apt install ansible

Ou équivalent pour les autres gestionnaires de paquets

Accès au LDAP

Pour faciliter le déploiement, il est possible (et nécessaire) d'utiliser le ldap pour configurer les machines. Ceci nécessite l'installation du paquet python correspondant

sudo apt install python3-ldap

Ou équivalent pour les autres gestionnaires de paquets.

Ensuite, il faut donner l'accès au ldap à votre machine avec la commande :

ssh -L 1636:wall-e.adm.crans.org:636 wall-e.adm.crans.org

Accès au pass

Certains fichiers de configuration contiennent des secrets. Ceux-ci sont alors dans le pass du crans. Il est donc nécessaire d'installer le pass du crans comme indiqué sur le git.

Configuration de ssh

Il faudra copier coller cette configuration ssh dans ~/.ssh/config en remplaçant [pseudo]:

Host *.adm.crans.org
    User _[pseudo]
    ProxyJump _[pseudo]@hodaur.crans.org

Création d'un fichier de configuration

Architecture

Pour bien comprendre comment configurer ansible, il faut d'abord comprendre l'architecture du git Ansible du crans :

  • hosts : est un fichier qui contient les machines et qui les regroupent en groupe. Cela permet d'exécuter les configurations correspondantes au groupe de la machine directement.
  • all.yml : est juste un fichier contenant tous les playbook déjà configurés. En particulier, il permet de ré-executé toutes les configurations.
  • group_vars : est un dossier qui contient les variables utiles pour exécuter une configuration d'un groupe donné
  • host_vars : est un dossier contenant les variables qui sont spécifiques à chaque machine. Par exemple, la configuration réseau.
  • plays : est un dossier qui contient le pont entre tout les éléments déjà mentionnés. Il s'agit du fichier que l'on va exécuter. Il contient le (ou les) groupe qui va être concerné par son exécution. Il va aussi dire qu'elles seront les rôles à exécuter mais aussi définir de potentielles variables.
  • roles : il s'agit du dossier qui contient l'ensemble des fichiers de configurations ainsi que les commandes à exécuter.

💡 Pour utiliser des variable de groupe, il faut que la machine soit dans le groupe correspondant dans hosts

Configuration basique

Pour commencer, il va falloir ajouter une configuration qui ne dépend pas (ou presque) de la machine. Il s'agit du playbook root. Celui-ci contient toutes les instructions pour initialiser les éléments essentiels d'une machinei au crans. Par exemple, les backups, le monitoring, le ssh ou encore les nounous.

Pour ajouter cette configuration il suffit de suivre les étapes suivantes :

  • ajouter la machine dans hosts, dans la catégorie crans_vm s'il s'agit d'une vm.
  • ajouter la configuration réseau dans host_vars (dans un fichier du même nom que la machine).

Voici une configuration possible issue de la vm voyager :

---
interfaces:
  adm: ens18
  srv_nat: ens19

loc_unattended:
  automatic_reboot: true

loc_needrestart:
  override: []

C'est bon la configuration est prête ! Il faut dès lors la déployer. Pour cela, vous devez exécuter la commande :

plays/root.yml -l [machine à déployer].adm.crans.org --check

ATTENTION :

  • Le --check sert à vérifier que la configuration fonctionne et donc n'effectue aucune modification. De manière général, il est préférable de vérifier le fonctionnement de la configuration avant de la déployer. Cependant, et comme on peut le constater dans le playbook root, des erreurs peuvent avoir lieu bien que la configuration fonctionne. Cela vient du fait que certains fichiers de configuration ont besoin d'un paquet qui doit être installer au préalable pour être écrit.
  • Si la machine que vous cherchez à déployer est fraîchement installer, la procédure change légèrement car vous n'avez pas encore de compte sur la machine. Il est alors nécessaire de faire un tour sur la documentation appropriée.

:hint: Lorsqu'il sera demandé "BECOME PASSWORD", entrez votre mot de passe.

Configuration du service

Le machine que vous déployez aura, a priori, une configuration qui lui sera propre car lié à un service spécifique qu'elle hébergera. Pour cela, il est nécessaire de créer votre propre configuration. Pour cela, il convient de suivre les étapes suivantes :

  • ajoutez la machine aux groupes appropriés
  • Si besoin : créer un groupe dans hosts contenant le machine.
  • (facultatif) Si vous avez créer un nouveau groupe : créer un fichier dans group_vars. contenant les variables qui seront à utiliser dans la configuration. ATTENTION : ce fichier devra avoir le même nom que le groupe précédemment défini.
  • Si vous avez besoin de secrets : créer dans le pass un fichier dans crans/ansible contenant les secrets qui seront utilisés dans la configuration
  • créer un fichier dans plays contenant a minima :
    • une entête disant comment exécuter le fichier (#!/usr/bin/env ansible-playbook) (suivi de ---)
    • le groupe sur lequel il s'exécute (hosts:)
    • les rôles à exécuter (roles:)
  • écrire le rôles à exécuter

Ce dernier point mérite de s'y attarder.

Pour créer un rôle, il faut créer un dossier (le rôle) contenant un autre dossier minimum : tasks. Ce dernier contiendra les fichiers qui exécuteront les commandes. Pour écrire ces fichiers, vous pourrez vous aidez de la documentation d'Ansible. Si vous avez besoin d'effectuer une tâche qui n'est pas prise en charge par le module par défaut d'Ansible, il est possible d'utiliser d'autres collections présentent sur cette documentation. Il sera alors nécessaire d'installer ces paquets selon la procédure décrite dans la documentation.

Cependant, dans les rôles, vous serez amené⋅e à écrire des fichiers complets. Ceci seront contenu dans le dossier templates. Celui-ci pourra contenir des variables du groupe prédéfini ({{ fichier.variable }}) ou des secrets ({{ vault.fichier.variable }}). Pour la clarté, ces fichiers auront le même chemin dans templates que sur la machine une fois déployée. Il est aussi possible de faire des boucles avec la syntaxe :

{% for variable in liste %}

...

{% endfor %}

Pour plus d'information sur la syntaxe des templates, référez vous à la documentation de jinja

Enfin, lors de la configuration, il peut-être nécessaire d'exécuter des opérations qui auront lieux UNIQUEMENT en cas de changement. Ceci seront dans le dossier handlers. Par exemple, redémarrer nginx après modification des fichiers de configuration. Pour plus d'information sur les handlers, vous pouvez jeter un œil sur cette documentation.

Voici un bref récapitulatif de la structure d'un dossier de roles :

roles/[service]/
├── handlers
│   └── main.yml
├── tasks
│   └── main.yml
└── templates
    └── [des templates]

Ces propos sont très abstraits et probablement peu limpides. Si vous êtes dans ce cas, regardez un fichier de configuration quelconque en même temps pour vous familiarisez avec la structure et le fonctionnement ainsi que la syntaxe. Cependant, vous devriez avoir les clés pour comprendre les fichiers de configuration !

Configurer le reverseproxy

Si votre service nécessite de recevoir une connexion depuis l'extérieur, il faut alors dire que l'on souhaite en recevoir. Ceci passe alors par Hodaur (le reverseproxy). Pour cela il suffit de :

  • ajouter dans group_vars/reverseproxy.yml le site dont il est question dans la catégorie reverseproxy_sites. Voici un exemple de ce qu'il faut ajouter - {from: helloworld.crans.org, to: 172.16.10.131}
  • exécuter le playbook reverseproxy (plays/reverseproxy -l hodaur.adm.crans.org --check)