1. Présentation#

Ansible est un outil d’automatisation IT open-source développé par Red Hat. C’est un outil d’orchestration et de gestion de configuration qui permet d’automatiser des tâches répétitives sur des serveurs ou des équipements réseau.

Ses points forts :

  • Agentless : pas besoin d’installer un agent sur les machines cibles — il passe par SSH (ou WinRM pour Windows)
  • Simple à prendre en main : les instructions s’écrivent en YAML, dans des fichiers appelés playbooks
  • Idempotent : exécuter un playbook plusieurs fois produit toujours le même résultat sans effets de bord

Ce qu’on peut faire avec :

  • Déployer et configurer des serveurs
  • Installer et mettre à jour des logiciels
  • Gérer des utilisateurs, des fichiers, des services
  • Provisionner de l’infrastructure cloud (AWS, Azure, GCP…)
  • Configurer des équipements réseau (Cisco, MikroTik via des modules communautaires, etc.)

Concepts clés :

  • Inventory : la liste des machines à gérer
  • Playbook : le fichier YAML qui décrit les tâches à exécuter
  • Module : une brique fonctionnelle (ex. apt, copy, service, user…)
  • Role : un ensemble de tâches réutilisables et organisées

Par rapport à d’autres outils Ansible se distingue de Puppet ou Chef par son absence d’agent et sa courbe d’apprentissage plus douce. Il est souvent comparé à Terraform, mais les deux sont complémentaires : Terraform provisionne l’infrastructure, Ansible la configure.

2. Installation#

Via pipx#

sudo apt install pipx
pipx ensurepath
pipx install --include-deps ansible*

Via ppa sur Ubuntu#

sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install ansible

3. Initialisation d’un projet#

3.1 Création de la structure du projet ansible :#

mkdir -p <NOM DU PROJET>/{docs,inventories,playbooks,roles,vagrant,wrapper}

3.2 Création d’un role ansible dans le projet :#

ansible-galaxy init ./roles/default

4. Architecture du projet#

4.1 <NOM DU PROJET>/docs#

Ce dossier permet de mettre toutes les documentations liées au projet ANSIBLE.

4.2 <NOM DU PROJET>/inventories#

Ce dossier contient les fichiers hosts ainsi que toutes les variables liées aux instances spécifiées dans les fichiers hosts

4.2.1 Structure du fichier hosts#

[nom_groupe]
nom_host ansible_host=<adresse IP> ansible_user=<user> ansible_ssh_private_key_file=</chemin/private_key>
nom_host_ssh_config

Dans le fichier hosts vous pouvez aussi mettre un hostname présent dans votre fichier ~/.ssh/config. Ansible prend en compte toutes les configuration que vous avez mis dans ce fichier.

4.2.2 Variables#

Les variables ansible peuvent être utilisées dans les playbooks et les roles. Elles peuvent être très utiles pour la gestion de secrets (mot de passe, clés, …) ou simplement de définir des valeurs spécifiques en fonction des hosts. Il est possible de définir des variables pour des groupes de hosts ou juste pour un host.

Pour cela il faut créer un dossier group_vars ou host_vars dans le dossier inventories.

  • Pour les variables de groupe, les fichiers doivent être nommés comme le nom du groupe : si le groupe est nom_groupe alors le fichier doit se nommer group_vars/nom_groupe.md
  • Pour les variables de hôte, les fichiers doivent être nommé comme le nom de l’hôte : si l’hôte est nom_host alors le fichier doit se nommer host_vars/nom_host.md

Les fichiers ont pour syntaxe le yaml :

interface: eno1
vlan: 2328
address: 172.16.8.5/22

4.2.3 Fichier de configuration Ansible#

<NOM DU PROJET>/inventories/ansible.cfg:

[defaults]
inventory = hosts
roles_path = ../roles
host_key_checking = False
nocows = True
allow_world_readable_tmpfiles = True

[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no

5. Les playbooks#

Les playbooks sont dans le dossier playbooks/ et permettent d’appeler les différents rôles. La structure est la suivante :

---
- hosts: all,!localhost # tous les hôtes sauf localhost
  become: true          # spécifie à Ansible de faire une élévation de privilège
  roles:                # liste des rôles à exécuter
    - role: base
    - role: docker

6. Les commandes#

6.1 Création d’un rôle#

ansible-galaxy init ./roles/default

6.2 Lancement d’un playbook#

cd inventories/
ansible-playbook ../playbooks/gitlab-update.yml

6.3 Lister les hosts joignables du fichier host#

ansible-inventory --list
{
    "_meta": {
        "hostvars": {
            "localhost": {
                "ansible_connection": "local"
            },
            "nom_host": {
                "interface": "eno1",
                "vlan": 2328,
                "address": "172.16.8.5/22"
            }
        }
    },
    "all": {
        "children": [
            "ungrouped",
            "local",
            "user",
            "root"
        ]
    },
    "local": {
        "hosts": [
            "localhost"
        ]
    },
    "nom_groupe": {
        "hosts": [
            "nom_host",
            "nom_host_ssh_config"
        ]
    }
}

7. Exemples#

7.1 Rôle d’installation de docker sur debian#

- name: Dépendances
  apt:
    name:
      - gpg
      - curl
      - apt-transport-https
      - git
      - vim
      - htop
    state: latest
  become: true

- name: Ajouter la clé GPG de Docker
  apt_key:
    url: https://download.docker.com/linux/debian/gpg
    state: present
  become: true

- name: Ajouter la clé GPG de Docker
  get_url:
    url: https://download.docker.com/linux/debian/gpg
    dest: /etc/apt/keyrings/docker.asc
    mode: '0444'

- name: Ajouter le dépôt Docker
  apt_repository:
    repo: deb [arch=amd64] https://download.docker.com/linux/debian {{ distrib }} stable
    state: present
  become: true

- name: Installer Docker
  apt:
    name:
      - docker-ce
      - docker-ce-cli
      - containerd.io
    state: latest
  become: true

- name: Ajouter l'utilisateur au groupe docker
  user:
    name: "{{ current_user }}"
    groups: docker
    append: yes
  become: true

- name: Activer et démarrer Docker
  systemd:
    name: docker
    enabled: yes
    state: started
  become: true

7.2 Utilisation de la sortie d’une commande#

- name: Mise à jour des paquets
  apt:
    upgrade: yes
    update_cache: yes
  become: true
  register: apt_upgrade

- name: Affichage
  debug:
    msg: "{{ apt_upgrade.stdout }}"

8. Ressources#