Ansible pour débutants : automatisez votre infrastructure en 30 minutes

Ansible pour débutants : automatisez votre infrastructure en 30 minutes

Vous avez 20 serveurs à configurer. Ils nécessitent tous les mêmes paquets, les mêmes utilisateurs et les mêmes règles de pare-feu. Vous pourriez vous connecter manuellement à chacun d'eux via SSH, ou bien créer un seul playbook Ansible et le laisser effectuer les tâches en parallèle sur l'ensemble de votre parc. Ansible est l'outil d'automatisation qui transforme les tâches répétitives d'administrateur système en code. Ce guide vous permettra de créer un playbook fonctionnel en 30 minutes, de A à Z.

Qu'est-ce qu'Ansible et pourquoi devriez-vous vous en soucier ?

Ansible est un outil d'automatisation informatique open source développé par Red Hat. Il permet de définir l'état souhaité de votre infrastructure dans des fichiers YAML appelés playbooks , puis d'appliquer cet état à un nombre quelconque de serveurs via SSH, sans nécessiter d'agents . Principaux avantages :

  • Sans agent — seuls SSH et Python sont requis sur les nœuds gérés
  • Idempotent — exécuter deux fois le même playbook est sans risque ; Ansible ne modifie que ce qui doit l’être.
  • YAML lisible par l'humain — les playbooks servent à la fois de code et de documentation
  • Bibliothèque de modules massive — des milliers de modules intégrés pour toutes les tâches imaginables
  • Logiciel libre et gratuit — Licence Apache 2.0

Installation

Ansible s'exécute depuis votre nœud de contrôle (votre ordinateur portable ou un serveur d'administration). Installez-le sur ce nœud, et non sur vos nœuds gérés.

# Ubuntu/Debian
apt install pipx
pipx install --include-deps ansible

# macOS
brew install ansible

# RHEL/AlmaLinux
dnf install ansible

# Verify
ansible --version

Mise en place de votre inventaire

Le fichier d'inventaire indique à Ansible quels serveurs gérer. Créez un fichier nommé inventory.ini :

[webservers]
web01 ansible_host=192.168.1.10
web02 ansible_host=192.168.1.11

[databases]
db01 ansible_host=192.168.1.20

[all:vars]
ansible_user=ubuntu
ansible_ssh_private_key_file=~/.ssh/id_ed25519
ansible_python_interpreter=/usr/bin/python3

Tester la connectivité

ansible all -i inventory.ini -m ping

Vous devriez voir pong sur chaque hôte. Si ce n'est pas le cas, vérifiez l'accès SSH et l'installation de Python sur les hôtes distants.

Votre premier guide de jeu

Créez setup.yml — un playbook qui configure vos serveurs web :

---
- name: Configure web servers
  hosts: webservers
  become: yes  # Run tasks with sudo

  tasks:
    - name: Update apt cache
      apt:
        update_cache: yes
        cache_valid_time: 3600

    - name: Install required packages
      apt:
        name:
          - nginx
          - ufw
          - fail2ban
          - curl
        state: present

    - name: Enable and start nginx
      systemd:
        name: nginx
        state: started
        enabled: yes

    - name: Allow HTTP traffic
      ufw:
        rule: allow
        port: "80"
        proto: tcp

    - name: Allow HTTPS traffic
      ufw:
        rule: allow
        port: "443"
        proto: tcp

    - name: Enable UFW
      ufw:
        state: enabled
        policy: deny

Exécuter le plan de jeu

ansible-playbook -i inventory.ini setup.yml

# Dry-run first (check mode) - shows what WOULD change
ansible-playbook -i inventory.ini setup.yml --check

Variables et modèles

Il est déconseillé de coder les valeurs en dur. Utilisez des variables :

---
- name: Configure nginx vhost
  hosts: webservers
  become: yes
  vars:
    server_name: "example.com"
    app_port: 8080

  tasks:
    - name: Deploy nginx config
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/sites-available/{{ server_name }}
        owner: root
        group: root
        mode: '0644'
      notify: reload nginx

  handlers:
    - name: reload nginx
      systemd:
        name: nginx
        state: reloaded

Le fichier modèle nginx.conf.j2 utilise la syntaxe Jinja2 :

server {
    listen 80;
    server_name {{ server_name }};
    location / {
        proxy_pass http://127.0.0.1:{{ app_port }};
    }
}

Rôles — Organisation de l'automatisation complexe

Pour les configurations plus complexes, organisez vos tâches en rôles . Un rôle est un ensemble réutilisable et partageable de tâches, de variables, de modèles et de gestionnaires.

# Create a role structure
ansible-galaxy init roles/nginx

# Resulting structure:
roles/nginx/
  tasks/main.yml
  handlers/main.yml
  templates/
  vars/main.yml
  defaults/main.yml

Ensuite, faites référence au rôle dans votre plan de jeu :

---
- name: Configure web servers
  hosts: webservers
  become: yes
  roles:
    - nginx
    - fail2ban
    - common

Ansible Vault — Protection des secrets

Ne stockez jamais les mots de passe ni les clés API en clair. Utilisez Ansible Vault pour chiffrer les variables sensibles :

# Create an encrypted variables file
ansible-vault create secrets.yml

# Encrypt an existing file
ansible-vault encrypt vars/passwords.yml

# Run playbook with vault
ansible-playbook playbook.yml --ask-vault-pass
# Or with a vault password file
ansible-playbook playbook.yml --vault-password-file ~/.vault_pass

Exemple pratique : Déployer une pile LEMP complète

---
- name: Deploy LEMP stack
  hosts: webservers
  become: yes

  tasks:
    - name: Install packages
      apt:
        name: [nginx, php8.2-fpm, mariadb-server, python3-pymysql]
        state: present
        update_cache: yes

    - name: Start services
      systemd:
        name: "{{ item }}"
        state: started
        enabled: yes
      loop:
        - nginx
        - php8.2-fpm
        - mariadb

    - name: Create database
      community.mysql.mysql_db:
        name: myapp
        state: present
        login_unix_socket: /var/run/mysqld/mysqld.sock

    - name: Create database user
      community.mysql.mysql_user:
        name: appuser
        password: "{{ db_password }}"
        priv: "myapp.*:ALL"
        state: present
        login_unix_socket: /var/run/mysqld/mysqld.sock

Aller plus loin

  • Ansible Galaxy — des milliers de rôles communautaires prêts à l'emploi : ansible-galaxy install geerlingguy.docker
  • AWX / Ansible Tower — Interface utilisateur web et planification pour Ansible à grande échelle (AWX est gratuit, Tower est la version entreprise)
  • Inventaire dynamique — extraction automatique des listes de serveurs auprès des fournisseurs de cloud (AWS, Azure, GCP)
  • Molecule — testez vos rôles Ansible avec des tests automatisés

Conclusion

Ansible est un investissement des plus judicieux pour votre boîte à outils d'administrateur système. En 30 minutes, automatisez des tâches qui nécessitaient auparavant des heures de sessions SSH répétitives. Commencez simplement : choisissez une tâche répétitive que vous effectuez chaque semaine et créez un playbook pour l'automatiser. Vous ne pourrez plus vous en passer.

⚙️ Quelle a été votre première automatisation avec Ansible ? Partagez vos playbooks dans les commentaires. Pour plus de guides d'automatisation d'infrastructure couvrant Terraform, Puppet et bien plus encore, consultez RootPilot .