Ansible : Automatisation et Configuration Management

Ansible : Automatisation et Configuration Management

Ansible : Automatisation et Configuration Management

Ansible est un outil d’automatisation puissant qui simplifie la gestion de configuration, le déploiement d’applications et l’orchestration d’infrastructure. Ce guide vous accompagne dans la maîtrise d’Ansible.

Introduction à Ansible

Avantages Clés

  • Agentless : Pas besoin d’installer d’agent sur les machines cibles
  • Idempotent : Exécution sûre et répétable
  • Simple : Syntaxe YAML lisible et intuitive
  • Extensible : Large écosystème de modules

Architecture

Control Node (Ansible)
    ↓ SSH/WinRM
Managed Nodes (Serveurs cibles)

Installation et Configuration

Installation sur Ubuntu

# Mise à jour du système
sudo apt update

# Installation d'Ansible
sudo apt install ansible

# Vérification de l'installation
ansible --version

Configuration SSH

# Génération de clés SSH
ssh-keygen -t rsa -b 4096

# Copie de la clé publique
ssh-copy-id user@target-server

# Test de connexion
ssh user@target-server

Inventaire et Configuration

Fichier d’Inventaire

# inventory.ini
[webservers]
web1.example.com
web2.example.com

[databases]
db1.example.com
db2.example.com

[production:children]
webservers
databases

[webservers:vars]
http_port=80
max_clients=200

Configuration Ansible

# ansible.cfg
[defaults]
inventory = inventory.ini
remote_user = ansible
private_key_file = ~/.ssh/id_rsa
host_key_checking = False
retry_files_enabled = False

[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s

Modules Essentiels

Gestion des Packages

# Installation de packages
- name: Install web server
  apt:
    name: nginx
    state: present
    update_cache: yes

# Installation de plusieurs packages
- name: Install multiple packages
  apt:
    name:
      - nginx
      - mysql-server
      - php-fpm
    state: present

Gestion des Services

# Démarrage et activation d'un service
- name: Start and enable nginx
  systemd:
    name: nginx
    state: started
    enabled: yes

# Redémarrage conditionnel
- name: Restart nginx if config changed
  systemd:
    name: nginx
    state: restarted
  when: nginx_config.changed

Gestion des Fichiers

# Copie de fichier
- name: Copy nginx config
  copy:
    src: nginx.conf
    dest: /etc/nginx/nginx.conf
    backup: yes
  notify: restart nginx

# Template avec variables
- name: Generate config from template
  template:
    src: app.conf.j2
    dest: /etc/app/app.conf
    owner: app
    group: app
    mode: '0644'

Playbooks Avancés

Structure d’un Playbook

---
- name: Configure web servers
  hosts: webservers
  become: yes
  vars:
    http_port: 80
    max_clients: 200
  
  tasks:
    - name: Install nginx
      apt:
        name: nginx
        state: present
    
    - name: Start nginx service
      systemd:
        name: nginx
        state: started
        enabled: yes

Utilisation des Handlers

# Playbook avec handlers
---
- name: Configure nginx
  hosts: webservers
  become: yes
  
  tasks:
    - name: Install nginx
      apt:
        name: nginx
        state: present
    
    - name: Copy nginx config
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      notify:
        - restart nginx
        - reload nginx
  
  handlers:
    - name: restart nginx
      systemd:
        name: nginx
        state: restarted
    
    - name: reload nginx
      systemd:
        name: nginx
        state: reloaded

Rôles Ansible

Structure d’un Rôle

roles/
  nginx/
    tasks/
      main.yml
    handlers/
      main.yml
    templates/
      nginx.conf.j2
    files/
      index.html
    vars/
      main.yml
    defaults/
      main.yml
    meta/
      main.yml

Exemple de Rôle

# roles/nginx/tasks/main.yml
---
- name: Install nginx
  apt:
    name: nginx
    state: present

- name: Copy nginx config
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
  notify: restart nginx

- name: Start nginx
  systemd:
    name: nginx
    state: started
    enabled: yes

Utilisation des Rôles

# site.yml
---
- name: Configure web infrastructure
  hosts: webservers
  become: yes
  roles:
    - common
    - nginx
    - ssl-certificates

Variables et Templates

Définition des Variables

# group_vars/webservers.yml
nginx_port: 80
nginx_user: www-data
nginx_worker_processes: auto

# host_vars/web1.example.com.yml
nginx_worker_connections: 1024
server_name: web1.example.com

Template Jinja2

# templates/nginx.conf.j2
user ;
worker_processes ;

events {
    worker_connections ;
}

http {
    server {
        listen ;
        server_name ;
        
        location / {
            root /var/www/html;
            index index.html;
        }
    }
}

Conditions et Boucles

Conditions

- name: Install package on Ubuntu
  apt:
    name: nginx
    state: present
  when: ansible_distribution == "Ubuntu"

- name: Install package on CentOS
  yum:
    name: nginx
    state: present
  when: ansible_distribution == "CentOS"

Boucles

- name: Create multiple users
  user:
    name: ""
    state: present
  loop:
    - alice
    - bob
    - charlie

- name: Install packages
  apt:
    name: ""
    state: ""
  loop:
    - { name: nginx, state: present }
    - { name: apache2, state: absent }

Vault et Sécurité

Chiffrement avec Ansible Vault

# Créer un fichier chiffré
ansible-vault create secrets.yml

# Éditer un fichier chiffré
ansible-vault edit secrets.yml

# Chiffrer un fichier existant
ansible-vault encrypt passwords.yml

# Déchiffrer un fichier
ansible-vault decrypt passwords.yml

Utilisation des Secrets

# secrets.yml (chiffré)
database_password: "super_secret_password"
api_key: "secret_api_key"

# Playbook utilisant les secrets
- name: Configure database
  mysql_user:
    name: app_user
    password: ""
    state: present

Bonnes Pratiques

Organisation des Projets

ansible-project/
├── ansible.cfg
├── inventory/
│   ├── production
│   └── staging
├── group_vars/
├── host_vars/
├── roles/
├── playbooks/
└── vault/

Tests et Validation

# Validation de la syntaxe
- name: Check if nginx is running
  uri:
    url: "http://"
    method: GET
  delegate_to: localhost

# Tests avec assert
- name: Verify nginx is listening
  wait_for:
    port: 80
    host: ""
    timeout: 30

Intégration CI/CD

Pipeline GitLab CI

# .gitlab-ci.yml
stages:
  - validate
  - deploy

validate:
  stage: validate
  script:
    - ansible-playbook --syntax-check site.yml
    - ansible-lint site.yml

deploy:
  stage: deploy
  script:
    - ansible-playbook -i inventory/production site.yml
  only:
    - main

Conclusion

Ansible transforme la gestion d’infrastructure en permettant :

  • Automatisation complète des déploiements
  • Standardisation des configurations
  • Réduction des erreurs manuelles
  • Accélération des livraisons

Maîtriser Ansible est essentiel pour tout professionnel DevOps souhaitant optimiser ses processus d’infrastructure.


Découvrez nos autres guides DevOps pour approfondir vos compétences en automatisation et orchestration.

Partager cet article :