⚙️ Ansible

Playbooks, modules, inventaires, rôles

Aide-mémoire

Ansible — Aide-mémoire

Commandes de base

# Tester la connectivité (ping module)
ansible all -i inventory.ini -m ping
ansible webservers -i inventory.ini -m ping

Exécuter une commande ad-hoc

ansible all -m shell -a "uptime" ansible all -m shell -a "df -h"

Lancer un playbook

ansible-playbook -i inventory.ini playbook.yml

Playbook en mode dry-run (check)

ansible-playbook -i inventory.ini playbook.yml --check

Voir les changements détaillés

ansible-playbook -i inventory.ini playbook.yml --diff

Limiter à un groupe ou un host

ansible-playbook -i inventory.ini playbook.yml --limit webservers ansible-playbook -i inventory.ini playbook.yml --limit 192.168.1.10

Passer des variables

ansible-playbook playbook.yml -e "env=prod version=1.2"

Verbosité (1 à 4)

ansible-playbook playbook.yml -v ansible-playbook playbook.yml -vvvv

Inventaire (inventory.ini)

# Hosts simples
192.168.1.10
192.168.1.11 ansible_user=ubuntu ansible_port=2222

Groupes

[webservers] web1.example.com web2.example.com ansible_host=192.168.1.20

[dbservers]

db1.example.com

Groupe de groupes

[production:children] webservers dbservers

Variables de groupe

[webservers:vars] ansible_user=deploy ansible_ssh_private_key_file=~/.ssh/id_rsa http_port=80

Inventaire YAML (inventory.yml)

all:
  vars:
    ansible_user: ubuntu
  children:
    webservers:
      hosts:
        web1:
          ansible_host: 192.168.1.10
        web2:
          ansible_host: 192.168.1.11
    dbservers:
      hosts:
        db1:
          ansible_host: 192.168.1.20

Structure d'un playbook

---
  • name: Configurer les serveurs web
hosts: webservers become: true # sudo vars: app_port: 8080 app_name: "mon-app"

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émarrer et activer nginx

service: name: nginx state: started enabled: true

- name: Déployer la configuration

template: src: templates/nginx.conf.j2 dest: /etc/nginx/sites-available/{{ app_name }} owner: root group: root mode: "0644" notify: Recharger nginx

handlers:

- name: Recharger nginx service: name: nginx state: reloaded

Modules courants

# Gestion des paquets
  • apt:
name: ["nginx", "curl", "git"] state: present # present / absent / latest

Exécuter une commande

  • command: /usr/bin/monscript.sh
  • shell: "echo $HOME > /tmp/test"

Copier un fichier

  • copy:
src: fichier.txt dest: /etc/app/fichier.txt owner: root mode: "0644"

Template Jinja2

  • template:
src: config.j2 dest: /etc/app/config.conf

Service

  • service:
name: nginx state: started | stopped | restarted | reloaded enabled: true

Utilisateur

  • user:
name: deploy groups: sudo shell: /bin/bash create_home: true

Ligne dans un fichier

  • lineinfile:
path: /etc/ssh/sshd_config regexp: "^PermitRootLogin" line: "PermitRootLogin no"

Créer un dossier

  • file:
path: /opt/app state: directory owner: app mode: "0755"

Git clone / pull

  • git:
repo: https://github.com/user/repo.git dest: /opt/app version: main

Variables de faits (debug)

  • debug:
msg: "L'IP est {{ ansible_default_ipv4.address }}"

Conditionnel

  • name: Installer sur Debian seulement
apt: name: nginx state: present when: ansible_os_family == "Debian"

Boucle

  • name: Créer les utilisateurs
user: name: "{{ item }}" state: present loop: - alice - bob - charlie

Roles — Structure

roles/
  mon-role/
    tasks/
      main.yml       # tâches principales
    handlers/
      main.yml       # handlers
    templates/
      nginx.conf.j2  # templates Jinja2
    files/
      app.conf       # fichiers statiques
    vars/
      main.yml       # variables (priorité haute)
    defaults/
      main.yml       # variables (priorité basse / overridables)
    meta/
      main.yml       # dépendances de rôles

Variables et Jinja2

# Définir des variables
vars:
  app_port: 8080
  app_hosts:
    - web1
    - web2
  config:
    timeout: 30
    debug: false

Utiliser une variable

  • debug: msg="{{ app_port }}"
  • debug: msg="{{ config.timeout }}"
  • debug: msg="{{ app_hosts[0] }}"

Conditions Jinja2

  • name: Tâche conditionnelle
debug: msg="C'est Ubuntu" when: ansible_distribution == "Ubuntu"

Filtre Jinja2

  • debug: msg="{{ app_name | upper }}"
  • debug: msg="{{ liste | join(', ') }}"
  • debug: msg="{{ valeur | default('par défaut') }}"

ansible.cfg

[defaults]
inventory          = ./inventory.ini
remote_user        = ubuntu
private_key_file   = ~/.ssh/id_rsa
host_key_checking  = False
retry_files_enabled = False
stdout_callback    = yaml

[privilege_escalation]

become = True become_method = sudo
🔧 Ouvrir tools.rdr-it.com — application complète →

Plus de 40 outils AdminSys gratuits · SSL · DNS · Docker · Nginx · SSH · Mermaid · et plus