This repository has been archived on 2024-03-03. You can view files and clone it, but cannot push or open issues or pull requests.
adlin/tutorial/ansible/ansible.md

8.0 KiB

\newpage

Automatiser la configuration de son SI

Aujourd'hui, vous n'avez qu'une seule machine à administrer, et déjà, j'ai pu entendre des soupirs lorsque vous avez dû configurer ENCORE CE RÉSEAU DE $&%#. Imaginez maintenant que vous ayez à en administrer 10, 100, 1000 ou encore davantage !

Comme tout bon paresseux sys. admin qui se respecte, sans plus attendre, vous allez vouloir automatiser toutes ces actions rébarbatives. Comme de très nombreuses personnes sont passées par là avant vous, il existe un grand nombre de solutions pour gérer les configurations d'un parc de machines. Parmi les plus connues, citons : Puppet, Chef, SaltStack ou encore Ansible.

Introduction à Ansible

Ansible est une solution de gestion de configuration. Basé sur Python et YAML, sa principale particularité est de ne pas nécessité de daemon sur les machines qu'il va gérer : tout se fait exclusivement via SSH, à partir de la machine d'un administrateur, possédant Ansible.

Son installation est très simple, car les dépendances sont minimes et l'outil n'a pas besoin de base de données pour fonctionner : tout va se faire à partir d'une arborescence de fichiers, qui sera gérée par Git.

Commencez par installer Ansible, sur une machine distincte de la machine virtuelle démarrée : la machine hôte sera parfaitement adaptée à cette tâche, d'autant plus que l'installation de la plate-forme est propre et légère : vous ne risquez pas de vous retrouver avec une usine à gaz impossible à retirer.

Consultez la procédure d'installation pour votre distribution ici.

Résultat attendu

À la fin de cette partie, vous devez être en mesure de pouvoir déployer une nouvelle machine, identique à celle que vous venez de configurer, à partir d'une ISO et d'un nouveau disque.

Maintenant que vous savez vous connecter au réseau et formater un disque, vous pouvez ajouter les options adlin.format=/dev/sda et adlin.net=easy à la ligne de commande du noyau afin de, respectivement, formater le disque /dev/sda si la partition racine n'est pas trouvée, et obtenir une adresse IP par DHCP. Vous pourrez ainsi très facilement tester vos recettes.

Mon première commande

Inventaire

Comme il sera bientôt question de maintenir plusieurs machines, la première chose à faire consiste à les inventorier.

Commençons par créer un répertoire, qui contiendra l'ensemble de nos configurations à destination d'Ansible. Dans ce répertoire, créons un fichier d'inventaires hosts, contenant l'IP de notre machine :

```yaml all: hosts: 192.168.0.106 ```

Vous pouvez lancer une autre machine virtuelle à ce stade et ajouter son IP sur une nouvelle ligne du fichier hosts.

Plus tard, c'est dans ce fichier que vous pourrez créer des groupes de machines (par exemple pour regrouper les serveurs web, les bases de données, etc.) ou donner des caractéristiques spécifiques à vos machines.

ping

Lancez ensuite la commande suivante :

``` 42sh$ ansible --inventory-file hosts all --module-name ping --user root --ask-pass 192.168.0.106 | SUCCESS => { "changed": false, "ping": "pong" } ```

Vous devriez avoir un retour similaire à celui-ci, indiquant simplement que la connexion a bien été effectuée et que le nécessaire est bien installé sur la machine distance.

Confort

Une des premières choses que nous devrions faire, est d'installer notre clef SSH sur les machines, pour éviter d'avoir à taper le mot de passe à chaque test.

Si vous avez bien suivi jusqu'ici, vous savez qu'il ne faut pas utiliser le compte root directement ! Pas d'inquiétude, tout est prévu dans Ansible : retirer l'option --user root si votre nom d'utilisateur local est identique que celui dans la machine virtuelle, ou adaptez l'option en conséquence.

Et ajoutez les options --become et --ask-become-pass (utilisez --sudo et --ask-sudo-pass pour les vieilles versions) :

``` ansible --inventory-file hosts all -m ping -u bruce --become --ask-become-pass ```

Les modules

Les modules Ansible ont généralement deux missions distinctes :

  • récupérer des informations en allant les extraire sur chaque machine ;
  • pousser des nouvelles informations pour atteindre un état précis.

Lorsque les informations récupérées montrent que l'état est déjà atteint, aucune modification n'est faite sur la machine, on parle d'idempotence.

À noter cependant que lorsque l'on retire un état de notre recette, il est conservé tel quel sur la machine. Par exemple, si un utilisateur toto est créé suite à l'application d'une recette décrivant l'utilisateur toto ; si l'on supprime la description, l'utilisateur ne sera pas supprimé des machines sur lequel la recette aura été appliquée. Pour qu'il soit supprimé, il faut modifier la description pour signaler que cet utilisateur ne doit pas exister. À l'application de cette nouvelle recette, si un tel utilisateur est trouvé, il sera donc supprimé.

Collecte du mercredi

Parmi les modules de base, le module setup permet de récupérer un grand nombre de caractéristiques de la machine distance, voyez plutôt :

``` ansible -i hosts all -m setup ```

Les informations récupérées (quelque soit le module), sont ensuite accessible dans des variables afin de permettre de compléter des modèles ou pour faire de l'exécution conditionnelle d'état (par exemple on pourra utiliser la variable ansible_facts.ansible_distribution pour distinguer les gestionnaires de paquets).

Ma première recette

Un livre de recettes (playbook dans le vocabulaire d'Ansible), regroupe les descriptions des états que l'on souhaite obtenir sur un groupe de machines données.

Par exemple, voici à quoi pourrait ressembler un tel recueil :

```yaml --- - hosts: webservers remote_user: root

tasks:

  • name: ensure nginx is at the latest version apt: name=nginx state=latest

  • name: write the apache config file template: src=/srv/httpd.j2 dest=/etc/httpd.conf

  • hosts: databases remote_user: root

    tasks:

    • name: ensure postgresql is at the latest version yum: name=postgresql state=latest
    • name: ensure that postgresql is started service: name=postgresql state=started
</div>

On filtre d'abord sur les hôtes concernés par la configuration, on donne
ensuite des paramètres qui seront utilisées pour chaque tâche et enfin on
décrit les tâches.

Le guide de référence pour connaître toutes les syntaxes possibles est
disponible dans [la documentation
d'Ansible](http://docs.ansible.com/ansible/latest/playbooks.html).


### Exécution d'un *Playbook*

Placer le contenu dans un fichier YAML, par exemple `playbook.yml`, non loin du
fichier `hosts` créé à la section précédentes, puis lancez :

<div lang="en-US">
ansible-playbook -i hosts playbook.yml
</div>


### Coup de pouce

Voici à quoi ressemblerait votre premier playbook créant l'utilisateur
`adeline` :

<div lang="en-US">
```yaml
---
- hosts: all
  remote_user: root

  tasks:
  - name: ensure adeline as an account
    user:
	  name: adeline
	  state: present
	  shell: /bin/fish
	  groups: sudo
	  append: yes

La création de l'utilisateur se fait à l'aide du module user.

À vous maintenant, à l'aide des modules à votre disposition de copier vos fichiers de configuration à leur place et avec les bons droits (authorized_keys, .bashrc, ...). Installez également les paquets que vous aviez installé à la main (client DHCP, htop, ...).