agentsclimarketplace

Ansible playbook builder

Skill WhiteMuush/Your-Claude-DevOps-Teacher/skills/ansible-playbook-builder

Automatisation d'infrastructure avec Ansible, playbooks, roles, inventaires, vault et modules. Se déclenche avec "Ansible", "playbook", "ansible-playbook", "Ansible role", "Ansible vault", "automatisation serveur".From its SKILL.md

Install
npx -y skills add WhiteMuush/Your-Claude-DevOps-Teacher --skill ansible-playbook-builder

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
  • 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

7.1 KB, ~1.9k tokens by cl100k_base, as published. Nobody here has run it

Ansible Playbook Builder

Workflow

1. Analyser l'infrastructure cible

Recenser : systèmes d'exploitation (RHEL/Ubuntu/Debian), accès SSH (clé ou bastion), utilisateur de connexion (ansible_user), privilèges sudo.

Critères de décision, inventaire statique vs dynamique :

  • < 20 hôtes stables → inventaire statique INI/YAML
  • Cloud (AWS, Azure, GCP) ou infra éphémère → plugin dynamique (amazon.aws.ec2, azure.azcollection.azure_rm)

2. Structurer l'inventaire

# inventories/production/hosts.ini
[web]
web01.prod.example.com ansible_user=deploy
web02.prod.example.com ansible_user=deploy

[db]
db01.prod.example.com ansible_user=deploy

[all:vars]
ansible_ssh_private_key_file=~/.ssh/id_ed25519
inventories/
  production/
    hosts.ini
    group_vars/
      all.yml          # variables communes
      web.yml          # variables groupe web
    host_vars/
      db01.prod.example.com.yml
  staging/
    hosts.ini
    group_vars/

Tester la connectivité avant tout playbook :

ansible all -i inventories/production/hosts.ini -m ping

3. Concevoir les playbooks

Structure minimale production-ready :

# site.yml
---
- name: Configure web servers
  hosts: web
  become: true
  gather_facts: true
  tags: [web]

  pre_tasks:
    - name: Ensure Python3 is present
      raw: apt-get install -y python3
      changed_when: false

  roles:
    - role: common
    - role: nginx
      vars:
        nginx_port: 443

  post_tasks:
    - name: Verify nginx is responding
      uri:
        url: "https://{{ ansible_fqdn }}"
        status_code: 200
      delegate_to: localhost

Commandes courantes :

# Dry-run avec diff
ansible-playbook -i inventories/production/hosts.ini site.yml --check --diff

# Exécution ciblée par tag
ansible-playbook site.yml -i inventories/production/hosts.ini --tags nginx

# Limiter à un hôte
ansible-playbook site.yml -i inventories/production/hosts.ini --limit web01.prod.example.com

# Verbose pour debug
ansible-playbook site.yml -vvv

4. Développer les roles

Structure standard à respecter :

roles/nginx/
  tasks/
    main.yml
    install.yml
    configure.yml
  handlers/
    main.yml          # notify: Restart nginx
  templates/
    nginx.conf.j2
  files/
    dhparam.pem
  defaults/
    main.yml          # variables surchargeables (priorité basse)
  vars/
    main.yml          # variables internes (priorité haute)
  meta/
    main.yml          # dépendances, galaxy_info

defaults/main.yml, toujours documenter :

# Port d'écoute HTTP
nginx_http_port: 80
# Port d'écoute HTTPS (0 = désactivé)
nginx_https_port: 443
# Nombre de workers (auto = nb CPUs)
nginx_worker_processes: auto

Handler exemple :

# handlers/main.yml
- name: Restart nginx
  service:
    name: nginx
    state: restarted
  listen: Restart nginx

5. Sécuriser avec Ansible Vault

# Chiffrer un fichier de secrets
ansible-vault encrypt inventories/production/group_vars/all/vault.yml

# Éditer un fichier chiffré
ansible-vault edit inventories/production/group_vars/all/vault.yml

# Exécuter avec le mot de passe vault
ansible-playbook site.yml --vault-password-file ~/.vault_pass.txt
# ou via variable d'environnement CI/CD
ANSIBLE_VAULT_PASSWORD_FILE=~/.vault_pass.txt ansible-playbook site.yml

Convention de nommage, préfixe vault_ pour les variables chiffrées :

# group_vars/all/vars.yml (clair)
db_password: "{{ vault_db_password }}"

# group_vars/all/vault.yml (chiffré)
vault_db_password: "S3cr3t!"

6. Templates Jinja2

{# templates/nginx.conf.j2 #}
worker_processes {{ nginx_worker_processes }};

server {
    listen {{ nginx_https_port }} ssl;
    server_name {{ ansible_fqdn }};

    {% for location in nginx_locations %}
    location {{ location.path }} {
        proxy_pass {{ location.backend }};
    }
    {% endfor %}
}

Filtres utiles :

# Convertir en majuscules
- debug: msg="{{ env | upper }}"
# Valeur par défaut
- debug: msg="{{ timeout | default(30) }}"
# Joindre une liste
- debug: msg="{{ groups['web'] | join(',') }}"

7. Tester les playbooks

# Lint (ansible-lint >= 6)
pip install ansible-lint
ansible-lint site.yml

# Syntaxe seule
ansible-playbook --syntax-check site.yml

# Test de role avec Molecule (driver Docker)
pip install molecule molecule-docker
cd roles/nginx
molecule init scenario --driver-name docker
molecule test   # create → converge → verify → destroy

molecule/default/verify.yml minimal :

- name: Verify nginx
  hosts: all
  tasks:
    - name: Check nginx service is running
      service_facts:
    - assert:
        that: "'nginx' in services and services['nginx'].state == 'running'"

8. Orchestrer les déploiements

Rolling update :

- hosts: web
  serial: "25%"        # 25% des hôtes à la fois
  max_fail_percentage: 0
  roles:
    - nginx

Intégration CI/CD (GitHub Actions) :

- name: Deploy to production
  run: |
    ansible-playbook -i inventories/production/hosts.ini site.yml \
      --vault-password-file <(echo "$VAULT_PASS") \
      --diff
  env:
    VAULT_PASS: ${{ secrets.ANSIBLE_VAULT_PASS }}

Garde-fous / Anti-patterns / Pièges

Anti-patternRisqueCorrection
shell: rm -rf /tmp/{{ app }}Idempotence cassée + risque injectionfile: path=... state=absent
command: service nginx restartNon-idempotentModule service + handler
Variables en clair dans gitFuite de secretsAnsible Vault obligatoire
ignore_errors: true systématiqueErreurs silencieuses en prodGérer explicitement les cas d'échec
gather_facts: false par défautPerte des variables ansible_*Désactiver seulement si perf critique et bien documenté
Pas de --check avant prodChangements imprévusToujours dry-run sur staging d'abord
become: true sur tout le playbookSurface d'attaque élargiebecome: true uniquement sur les tâches qui le nécessitent

Bonnes pratiques 2026

  • Collections > rôles communautaires : utiliser ansible.posix, community.general, community.docker via requirements.yml + ansible-galaxy collection install -r requirements.yml.
  • ansible.cfg versionné dans le dépôt : [defaults] host_key_checking = True, forks = 10, callback_whitelist = profile_tasks.
  • Épingler la version Ansible dans le CI (pip install ansible-core==2.17.*) pour éviter les régressions.
  • Pas de boucle with_items → remplacer par loop (syntaxe moderne depuis Ansible 2.5).
  • changed_when et failed_when explicites sur les modules command/shell inévitables.
  • Secrets rotation : intégrer HashiCorp Vault ou AWS Secrets Manager via le lookup community.hashi_vault.vault_read plutôt que Ansible Vault seul pour les environnements multi-équipes.

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.