Skip to content
Snippets Groups Projects
README.md 4.17 KiB
Newer Older
# Recettes Ansible du Cr@ns
Grizzly's avatar
Grizzly committed

me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
Ensemble des recettes de déploiement Ansible pour les serveurs du Crans.
Pour les utiliser, vérifiez que vous avez au moins Ansible 2.7.
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed

## Ansible 101
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed

Si vous n'avez jamais touché à Ansible avant, voilà une rapide introduction.

**Inventory** : c'est le fichier `hosts` d'inventaire.
Il contient la définition de chaque machine et le regroupement.

Quand on regroupe avec un `:children` en réalité on groupe des groupes.

Fardale's avatar
Fardale committed
Chaque machine est annoncée avec son hostname. Il faut pouvoir SSH sur cette machine
avec ce hostname, car c'est ce qu'Ansible fera.
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed

**Playbook** : c'est une politique de déploiement.
Il contient les associations des rôles avec les machines.

L'idée au Crans est de regrouper par thème. Exemple, le playbook `monitoring.yml`
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
va contenir toutes les définitions machines-rôles qui touchent au monitoring.
Cela permet de déployer manuellement tout le monitoring sans toucher au reste.

**Rôle** : un playbook donne des rôles à des machines. Ces rôles sont tous dans
Fardale's avatar
Fardale committed
le dossier `roles/`. Un rôle installe un service précis sur un serveur.
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed

Il est préférable d'être atomique sur les rôles plutôt d'en coder un énorme
qui sera difficilement maintenable.

*Exemples de rôle* : activer les backports pour ma version de Debian, installer NodeJS,
déployer un serveur prometheus, déployer une node prometheus…

Fardale's avatar
Fardale committed
**Tâche** : un rôle est composé de tâches. Une tâche effectue une et une seule
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
action. Elle est associée à un module Ansible.

*Exemples de tâche* : installer un paquet avec le module `apt`, ajouter une ligne dans
un fichier avec le module `lineinfile`, copier une template avec le module `template`

Une tâche peut avoir des paramètres supplémentaires pour la réessayer quand elle plante,
récupérer son résultat dans une varible, mettre une boucle dessus, mettre des conditions…

N'oubliez pas d'aller lire l'excellent documentation de RedHat sur tous les modules
d'Ansible !

### Gestion des groupes de machines

Maxime Bombar's avatar
Maxime Bombar committed
Pour la majorité des groupes on retrouve ce qu'il y avait dans BCFG2
(`crans_vm`, `crans`…).
Pour la liste complète, je vous invite à lire le fichier `hosts`.
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed

Néanmoins grâce au système de facts d'Ansible, les groupes suivants ont été
remplacés par une condition :

  * pour tester les versions de Debian,

    ```YAML
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
    ansible_lsb.codename == 'stretch'
    ```

  * pour tester si c'est un CPU Intel x86_64,

    ```YAML
    ansible_processor[0].find('Intel') != -1
    and ansible_architecture == 'x86_64'
    ```
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed

Pour les fonctions (`proxy-server`, `dhcp-dynamique`…) il a été choisi
de ne pas faire de groupe particulier mais plutôt de sélectionner/enlever
les machines pertinentes directement dans les playbooks.
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed

me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
### Lister tout ce que sait Ansible sur un hôte

me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
Lors du lancement d'Ansible, il collecte un ensemble de faits sur les serveurs
qui peuvent ensuite être utilisés dans des variables.
Pour lister tous les faits qu'Ansible collecte nativement d'un serveur
on peut exécuter le module `setup` manuellement.

me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
```
ansible zamok.adm.crans.org -m setup
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
```
### Filtrer un objet Python

Ansible fournit le filtre `json_query` qui va utiliser
le module python `jmespath`. Il est puissant et permet entre autre
de filtrer la sortie de l'API Re2o.

## Exécution d'Ansible

### Configurer la connexion au vlan adm

Envoyer son agent SSH peut être dangereux
([source](https://heipei.io/2015/02/26/SSH-Agent-Forwarding-considered-harmful/)).

On va utiliser plutôt `ProxyJump`.
Dans la configuration SSH :

```
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
# Use a proxy jump server to log on all Crans inventory
Host 10.231.136.* *.adm.crans.org *.borne.crans.org
    ProxyJump thot.crans.org
```

Il faut sa clé SSH configurée sur le serveur que l'on déploit.
```bash
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
ssh-copy-id zamok.adm.crans.org
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
### Lancer un Playbook Ansible
Il faut `python3-netaddr` et `python3-jmespath` sur sa machine.
Pour tester le playbook `base.yml` :
```bash
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
./base.yml --check
```

Vous pouvez ensuite enlever `--check` si vous voulez appliquer les changements !

Vous pouvez aussi avoir un mode étape par étape avec `--step`.
Si vous avez des soucis de fingerprint ECDSA, vous pouvez ignorer une
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
première fois (dangereux !) : `ANSIBLE_HOST_KEY_CHECKING=0 ./...`.