14 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.
Si vous avez un nixos ou le gestionnaire de paquets nix, vous pouvez utiliser le
shell.nix
présent dans le git du ansible du crans.
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. Si vous utilisez le
shell.nix
, alors l'installation de python3-ldap
est déjà effectuée.
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
Glossaire
- playbook : un playbook est un système de gestion et de déploiement de configurations sur des machines de manière simple, reproductible et réutilisable. Un playbook peut-être appliquer sur des machines ou des groupes de machines.
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 machine 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égoriecrans_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'applique (
hosts:
) - les rôles à exécuter (
roles:
)
- une entête disant comment exécuter le fichier
(
- é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 !
Configuration des backups
Bien qu'ansible configure par défaut les backups, quelques actions sont nécéssaires. Pour ce qui est des backups sous borg, elles seront automatiquement configurer et aucune action n'est requise. Pour les backups sous restics, il peut être nécessaire de faire les actions qui suivent.
Configuration de base
Génération des secrets
Les backups sous restic nécessite la génération de secrets dans le pass pour chaque machine (plus de détail dans la documentation de restic). Cela lui confère une sécurité accrue (plus que la configuration de borg).
Si la machine que vous cherchez à configurer a déjà eu des backus sous restic, alors il est fort probable que rien ne soit à faire à ce stade.
Si la machine est neuve (ou n'a jamais eu de backups restic), vous devez générer
2 secrets. Pour être sûr⋅e qu'il n'y ait pas de problèmes, on utilisera les
minuscules, majuscules et chiffres. En particulier, aucuns symboles ou caractères
spéciaux ne seront utilisés. Vous devrez générer un mot de passe avec 64
caractères (rest_password
) et un de 256 caractères (repo_password
). Il faut
alors les ajouter dans le pass dans le fichier ansible/restic
. Ajouter alors
la machine selon le format :
<nom machine>:
rest_password: <mdp de 64 caractères>
repo_password:
base: <mdp de 256 caractères>
Ensuite, il faut dire à thot
que vous souhaitez utiliser le rest_password
que vous venez de générer. Pour cela, vous devez vous ssh sur thot
et éxécuter
la commande :
$ sudo su
# cd /backup
# htpasswd -B .htpasswd <nom machine>
Puis le secret vous sera demandé (puis re-demandé pour confirmer).
Configuration dans Ansible
Par défaut, sont backupé /var
et /etc
. Si cela ne convient pas, il est
possible de modifier cela en ajoutant (au besoin) dans
host_vars/<nom machine>
:
loc_restic:
config:
base:
# pour exclure des chemins
to_exclude:
- <premier chemins>
- <deuxième chemins>
# pour ajouter des chemins
to_backup:
- /etc
- /var
- <un autre chemin>
# changer la rétention des backups
retention:
- [--keep-daily, <int>]
- [--keep-weekly, <int>]
- etc
Enfin, vous pourrez appliquer la configuration ansible à l'aide de la commande :
plays/restic_client.yml -l <nom machine>.adm.crans.org --check
Pensez à retirer le
--check
une fois que vous aurez vérifier que tout s'est bien passé !
Configuration de backup supplémentaire
Il est possible que la machine que vous déployez nécessite d'effectuer d'autres
backups, mais vous souhaitez les rendre indépendantes des backups de base comme
c'est le cas pour tealc
et cameron
(à l'heure où ces lignes ont été
rédigées).
Génération d'un nouveau secret
Comme mentionner dans la partie précédente, des secrets sont nécessaires pour le
fonctionnement de restic. Si vous êtes ici, c'est que vous avez déjà un
rest_password
et un repo_password
. Il faut alors générer un autre
repo_password
(256 caractères avec minuscules, majuscules et chiffres) et le
placer dans le pass. Vous devriez avoir quelque chose qui ressemble à :
<nom machine>:
rest_password: <mdp de 64 caractères>
repo_password:
base: <mdp de 256 caractères>
<un nom>: <le mdp de 256 caractères que vous venez de générer>
Configuration dans Ansible
Vous devez alors annoncer à ansible ce qui doit être backupé. Ajoutez alors, si
la variable n'est pas là ou complétez sinon, dans
host_vars/<nom machine>.adm.crans.org
:
loc_restic:
config:
<un nom>: # le même nom que dans le pass
# chemins à exclure
to_exclude:
- <premier chemins>
- <deuxième chemins>
# chemins à inclure
to_backup:
- <un chemin>
- <un autre chemin>
# changer la rétention des backups
retention:
- [--keep-daily, <int>]
- [--keep-weekly, <int>]
- etc
Enfin, vous pourrez appliquer la configuration ansible à l'aide de la commande :
plays/restic_client.yml -l <nom machine>.adm.crans.org --check
Pensez à retirer le
--check
une fois que vous aurez vérifier que tout s'est bien passé !
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égoriereverseproxy_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
)