Ansible
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_groupealors le fichier doit se nommergroup_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_hostalors le fichier doit se nommerhost_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 }}"