man ansible
Ansible — Cheat Sheet
Référence rapide pour l'automatisation avec Ansible : inventaires, playbooks, modules courants, variables et Vault.
Référence rapide pour l’automatisation avec Ansible : inventaires, playbooks, modules courants, variables et Vault.
Concepts clés
| Concept | Description |
|---|---|
| Inventory | Liste des hôtes/groupes à gérer |
| Playbook | Fichier YAML décrivant les tâches à exécuter |
| Task | Unité d’action (module + paramètres) |
| Role | Ensemble structuré de tâches réutilisables |
| Handler | Tâche déclenchée par notify (ex: restart service) |
| Variable | Valeur réutilisable (host_vars, group_vars, defaults) |
| Fact | Variable collectée automatiquement sur l’hôte |
| Template | Fichier Jinja2 rendu sur les hôtes cibles |
| Vault | Chiffrement des données sensibles |
Commandes ad-hoc
# Syntaxe de baseansible <hôtes> -m <module> -a "<arguments>"
# Ping de connectivité (module ping)ansible all -m pingansible webservers -m ping
# Exécuter une commande shellansible all -m shell -a "uptime"ansible all -m command -a "uname -r"
# Copier un fichieransible all -m copy -a "src=/local/file dest=/remote/path"
# Gestion de paquetsansible all -m apt -a "name=nginx state=present" --becomeansible all -m dnf -a "name=nginx state=absent" --become
# Redémarrer un serviceansible webservers -m service -a "name=nginx state=restarted" --become
# Gather factsansible all -m setupansible all -m setup -a "filter=ansible_os_family"ansible all -m setup -a "filter=ansible_*_mb" # mémoire
# Commandes utilesansible all --list-hosts # lister les hôtes ciblésansible all -m ping -o # sortie compacte (one-liner)ansible webservers -m ping -u alice # avec un utilisateur SSH spécifiqueInventaire
Format INI
# inventory/hosts
[webservers]web01.domain.tldweb02.domain.tld ansible_user=ubuntu
[dbservers]db01.domain.tld ansible_port=2222
[lxc]lxc-nginx ansible_host=10.0.0.10 ansible_user=rootlxc-db ansible_host=10.0.0.11
[homelab:children]webserverslxc
[homelab:vars]ansible_user=adminansible_ssh_private_key_file=~/.ssh/homelab_ed25519Format YAML
# inventory/hosts.ymlall: children: webservers: hosts: web01.domain.tld: web02.domain.tld: ansible_user: ubuntu dbservers: hosts: db01.domain.tld: ansible_port: 2222 vars: ansible_user: admin ansible_python_interpreter: /usr/bin/python3Variables d’inventaire
inventory/├── hosts.yml├── group_vars/│ ├── all.yml # variables pour tous les hôtes│ ├── webservers.yml # variables pour le groupe webservers│ └── webservers/ # dossier de variables pour webservers│ ├── vars.yml│ └── vault.yml # variables chiffrées└── host_vars/ ├── web01.yml # variables spécifiques à web01 └── web02.ymlPlaybooks
Structure de base
---- name: Configurer les serveurs web hosts: webservers become: true gather_facts: true
vars: nginx_port: 80 app_user: www-data
pre_tasks: - name: Mettre à jour le cache APT apt: update_cache: true cache_valid_time: 3600
tasks: - name: Installer nginx apt: name: nginx state: present
- name: Déployer la configuration template: src: nginx.conf.j2 dest: /etc/nginx/nginx.conf mode: '0644' notify: Redémarrer nginx
- name: S'assurer que nginx est démarré service: name: nginx state: started enabled: true
handlers: - name: Redémarrer nginx service: name: nginx state: restarted
post_tasks: - name: Vérifier que nginx répond uri: url: http://localhost status_code: 200Conditions et boucles
# Condition when- name: Installer sur Debian uniquement apt: name: vim state: present when: ansible_os_family == "Debian"
- name: Redémarrer si le noyau a changé reboot: when: kernel_update.changed
# Boucles- name: Créer plusieurs utilisateurs user: name: "{{ item.name }}" groups: "{{ item.groups }}" state: present loop: - { name: alice, groups: sudo } - { name: bob, groups: docker }
- name: Installer des paquets apt: name: "{{ item }}" state: present loop: - nginx - curl - git
# with_items (ancien style, toujours supporté)- name: Créer des répertoires file: path: "{{ item }}" state: directory with_items: - /opt/app - /opt/app/logs - /opt/app/dataRegister et debug
- name: Vérifier si un fichier existe stat: path: /etc/myapp/config.yml register: config_file
- name: Créer la config si absente copy: src: config.yml dest: /etc/myapp/config.yml when: not config_file.stat.exists
- name: Afficher le résultat debug: msg: "Le fichier existe : {{ config_file.stat.exists }}"
- name: Afficher une variable debug: var: ansible_default_ipv4.address
- name: Afficher un message formaté debug: msg: "OS : {{ ansible_distribution }} {{ ansible_distribution_version }}"Modules courants
Fichiers et répertoires
# file — créer, supprimer, définir les permissions- file: path: /opt/app state: directory # directory | file | link | absent owner: appuser group: appuser mode: '0755' recurse: true # pour les répertoires
# copy — copier depuis le contrôleur- copy: src: fichier.conf dest: /etc/app/fichier.conf owner: root mode: '0644' backup: true # sauvegarder l'ancienne version
# template — fichier Jinja2- template: src: app.conf.j2 dest: /etc/app/app.conf mode: '0644'
# fetch — récupérer depuis l'hôte distant- fetch: src: /var/log/app.log dest: ./logs/{{ inventory_hostname }}/ flat: false
# lineinfile — modifier une ligne dans un fichier- lineinfile: path: /etc/ssh/sshd_config regexp: '^PasswordAuthentication' line: 'PasswordAuthentication no' backup: true
# blockinfile — insérer un bloc- blockinfile: path: /etc/hosts block: | 10.0.0.10 lxc-nginx nginx.internal 10.0.0.11 lxc-db db.internalGestion des paquets
# apt (Debian/Ubuntu)- apt: name: nginx state: present # present | absent | latest update_cache: true cache_valid_time: 3600
- apt: name: - nginx - curl - git state: present
# dnf / yum (RedHat/CentOS)- dnf: name: nginx state: present
# package — module générique (auto-détecte)- package: name: nginx state: presentServices et systemd
- service: name: nginx state: started # started | stopped | restarted | reloaded enabled: true
- systemd: name: nginx state: restarted daemon_reload: true # équivalent systemctl daemon-reload enabled: true
- systemd: daemon_reload: true # juste recharger les units sans toucher au serviceUtilisateurs et groupes
- user: name: alice uid: 1001 groups: - sudo - docker append: true # ajouter aux groupes sans retirer les autres shell: /bin/bash home: /home/alice create_home: true state: present
- group: name: devs gid: 2000 state: present
- authorized_key: user: alice key: "{{ lookup('file', '~/.ssh/id_ed25519.pub') }}" state: presentCommandes
# command — pas de shell (pas de pipes, redirections)- command: /usr/bin/myapp --init args: chdir: /opt/myapp
# shell — avec shell complet (pipes, etc.)- shell: "ps aux | grep nginx | grep -v grep" register: nginx_procs
# script — exécuter un script local- script: scripts/init.sh args: chdir: /opt/appRôles
Structure d’un rôle
roles/└── nginx/ ├── defaults/ │ └── main.yml # variables par défaut (surchargeables) ├── vars/ │ └── main.yml # variables fixes (non surchargeables) ├── tasks/ │ └── main.yml # tâches principales ├── handlers/ │ └── main.yml # handlers ├── templates/ │ └── nginx.conf.j2 # templates Jinja2 ├── files/ │ └── index.html # fichiers statiques ├── meta/ │ └── main.yml # dépendances du rôle └── README.mdUtiliser un rôle
# Dans un playbook- hosts: webservers roles: - nginx - { role: nginx, nginx_port: 8080 } # avec variables - role: nginx vars: nginx_port: 8080 when: deploy_nginx | default(true)Ansible Galaxy
ansible-galaxy install geerlingguy.nginx # installer un rôleansible-galaxy install -r requirements.yml # depuis un fichieransible-galaxy list # rôles installésansible-galaxy remove geerlingguy.nginx # supprimer
# requirements.yml# roles:# - name: geerlingguy.nginx# version: 3.0.0# - src: https://github.com/user/role# name: mon-roleAnsible Vault
# Chiffrer un fichieransible-vault encrypt group_vars/all/vault.yml
# Déchiffreransible-vault decrypt group_vars/all/vault.yml
# Modifier un fichier chiffréansible-vault edit group_vars/all/vault.yml
# Chiffrer une valeur (inline)ansible-vault encrypt_string 'MonSecret' --name 'db_password'
# Voir sans déchiffreransible-vault view group_vars/all/vault.yml
# Changer le mot de passe du vaultansible-vault rekey group_vars/all/vault.yml
# Utiliser le vault dans un playbookansible-playbook site.yml --ask-vault-passansible-playbook site.yml --vault-password-file ~/.vault_pass# group_vars/all/vault.yml (chiffré)vault_db_password: "MonSuperSecret"vault_api_key: "ma-cle-api"
# group_vars/all/vars.yml (clair)db_password: "{{ vault_db_password }}"api_key: "{{ vault_api_key }}"ansible-playbook — Options courantes
ansible-playbook site.yml # exécuteransible-playbook site.yml -i inventory/hosts.yml # inventaire expliciteansible-playbook site.yml --check # dry-run (simulation)ansible-playbook site.yml --diff # voir les différencesansible-playbook site.yml --check --diff # simulation + diff
ansible-playbook site.yml -l webservers # limiter aux webserversansible-playbook site.yml -l web01,web02 # hôtes spécifiquesansible-playbook site.yml -t nginx # seulement le tag nginxansible-playbook site.yml --skip-tags deploy # exclure un tagansible-playbook site.yml --start-at-task "Déployer la config"
ansible-playbook site.yml -v # verbeuxansible-playbook site.yml -vvv # très verbeux (debug)ansible-playbook site.yml -e "env=production" # variable extraansible-playbook site.yml -e @vars/prod.yml # variables depuis fichier
ansible-playbook site.yml --become # sudoansible-playbook site.yml --become-user=rootansible-playbook site.yml -u alice # utilisateur SSHTemplates Jinja2
{# nginx.conf.j2 #}
user {{ app_user }};worker_processes {{ ansible_processor_vcpus }};
http { server { listen {{ nginx_port | default(80) }}; server_name {{ inventory_hostname }};
{% if ssl_enabled %} listen 443 ssl; ssl_certificate {{ ssl_cert_path }}; {% endif %}
{% for location in nginx_locations %} location {{ location.path }} { proxy_pass {{ location.backend }}; } {% endfor %} }}| Filtre Jinja2 | Usage |
|---|---|
{{ var | default('val') }} |
Valeur par défaut |
{{ var | upper }} |
Majuscules |
{{ var | lower }} |
Minuscules |
{{ list | join(', ') }} |
Joindre une liste |
{{ var | bool }} |
Convertir en booléen |
{{ var | int }} |
Convertir en entier |
{{ var | to_json }} |
Sérialiser en JSON |
{{ var | regex_replace('a', 'b') }} |
Remplacer par regex |
Bonnes pratiques
- Utiliser
--check --diffavant toute exécution sur la production. - Structurer le code en rôles dès qu’un playbook dépasse une dizaine de tâches.
- Toujours chiffrer les secrets avec Ansible Vault — jamais de mots de passe en clair dans Git.
- Nommer les tâches de manière descriptive (pas
Install packagemaisInstaller nginx pour le reverse proxy). - Utiliser
state: present/absentplutôt que des commandes shell pour les modules idempotents. - Tester les rôles avec Molecule avant de les pousser.
# ansible.cfg — configuration projet[defaults]inventory = inventory/roles_path = roles/host_key_checking = Falseretry_files_enabled = Falsestdout_callback = yamlinterpreter_python = auto_silent
[privilege_escalation]become = Truebecome_method = sudobecome_user = root