Aller au contenu
Infrastructure as Code medium

Steampunk Spotter (5.12+) : analyse Ansible cloud, lint étendu, recommandations

12 min de lecture

logo Steampunk Spotter

Steampunk Spotter est un analyseur statique Ansible cloud développé par XLAB Steampunk (Slovénie) qui complète ansible-lint avec des règles que ce dernier n’a pas : compatibilité multi-versions Ansible, détection de modules dépréciés/renommés/déplacés entre collections, scoring de qualité, et récriture automatique d’anti-patterns courants. Le service est freemium (compte gratuit pour usage individuel, plans payants pour équipes/CI). Cette page documente la version 5.12.0 d’avril 2026, testée sur AlmaLinux 10.

  • Installer Spotter via pipx et l’authentifier (token vs user/password).
  • Scanner un playbook, un rôle ou une collection — interpréter les résultats (HINT / WARNING / ERROR).
  • Choisir le bon --display-level et --profile selon le contexte (dev / pre-merge / CI bloquante).
  • Réécrire automatiquement certains anti-patterns avec --rewrite.
  • Intégrer Spotter dans une CI GitHub Actions ou GitLab CI.
  • Comparer Spotter à ansible-lint — quand préférer lequel.
ÉlémentVérification
Python 3.10+python3 --version
pipx installépipx --version
Compte Spotter (gratuit)app.spotter.steampunk.si
Connectivité Internet sortante vers api.spotter.steampunk.sicurl -I https://api.spotter.steampunk.si/
Fenêtre de terminal
pipx install steampunk-spotter
spotter --version
# 5.12.0

L’install crée un binaire ~/.local/bin/spotter qui pointe vers le venv pipx isolé. Pas de pollution Python globale, mises à jour atomiques avec pipx upgrade steampunk-spotter.

Rendez-vous sur app.spotter.steampunk.si/register, créez un compte gratuit (validation email obligatoire). Le plan Community suffit pour un usage individuel : 100 scans/mois, 1 organisation, accès à la majorité des règles.

Fenêtre de terminal
# Méthode 1 : login interactif (génère un token côté serveur, le stocke localement)
spotter login
# → Username/Password ou Token
# Méthode 2 : variable d'environnement (recommandée pour CI/CD)
export SPOTTER_TOKEN="eyJhbGc..."
spotter scan playbook.yml
# Méthode 3 : flag CLI (debug ponctuel uniquement, jamais en production)
spotter scan -t "eyJhbGc..." playbook.yml

Récupérer un token : interface web → My SettingsAPI TokensNew Token. Donnez un nom explicite (ci-github, laptop-bob) pour pouvoir révoquer ciblé plus tard.

Fenêtre de terminal
spotter scan playbook.yml

Sortie typique (texte coloré, niveaux HINT / WARNING / ERROR avec liens vers la doc) :

Check results:
playbook.yml:5:7: WARNING: [W1100] Use of with_items is discouraged. Consider using loop instead.
playbook.yml:5:7: HINT: [H1900] (rewritable) Required collection community.general is missing from requirements.yml.
Scan summary:
Spotter took 1.888 s to scan your input.
It resulted in 0 error(s), 1 warning(s) and 1 hint(s).
Can rewrite 1 file(s) with 1 change(s).
Overall status: WARNING

Chaque ligne suit le format <fichier>:<ligne>:<col>: <niveau>: [<id>] <message>. Les ID (W1100, H1900, E1300) sont stables et permettent de skip/enforce ciblé.

Fenêtre de terminal
# Plusieurs rôles ou collections d'un coup
spotter scan path/to/role1 path/to/role2 path/to/collection/
# Un répertoire entier (tous les .yml détectés)
spotter scan ansible-project/
Fenêtre de terminal
# N'afficher que les ERROR (mode strict pour CI bloquante)
spotter scan --display-level error playbook.yml
# Afficher WARNING + ERROR (skip les hints en pre-merge)
spotter scan --display-level warning playbook.yml

Les 3 niveaux :

  • HINT — suggestion (ex: pinning manquant, optimisation possible).
  • WARNING — pratique discutable (ex: with_items legacy, state: latest).
  • ERROR — bug ou faille (ex: module inexistant, paramètre obsolète, secret en clair).
Fenêtre de terminal
# Profil par défaut (équilibré)
spotter scan playbook.yml
# Profil sécurité (focus secrets, sudoers, no_log, supply chain)
spotter scan --profile security playbook.yml
# Profil complet (tous les checks, peut être verbeux)
spotter scan --profile full playbook.yml
Fenêtre de terminal
# Scanner contre Ansible 2.18 (pour valider compatibilité descendante)
spotter scan -a 2.18 playbook.yml
# Désactiver la détection auto (utile en CI sur runner sans Ansible)
spotter scan --no-ansible-version playbook.yml

L’option -a [2.0, 2.19] est puissante : Spotter détecte alors les modules/options qui n’existent pas encore dans cette version mineure. Idéal pour des collections publiées qui doivent supporter requires_ansible: ">=2.18".

Fenêtre de terminal
# Désactiver des checks par ID (à justifier en commentaire YAML !)
spotter scan --skip-checks E1300,H1900 playbook.yml
# Forcer des checks même si désactivés par défaut
spotter scan --enforce-checks E001,W400 playbook.yml

Anti-pattern : skip systématique sans documenter le pourquoi. Préférer un commentaire # noqa: E1300 — légitime parce que ... à côté de la ligne fautive.

Fenêtre de terminal
spotter scan --rewrite playbook.yml

Spotter applique les fixes pour les checks marqués (rewritable) dans la sortie. Exemples typiques :

  • with_itemsloop:
  • Modules legacy renommés (yum:ansible.builtin.dnf:)
  • FQCN incomplets (copy:ansible.builtin.copy:)
  • Ajout de community.general dans requirements.yml quand un module y appartient

Toujours git diff après --rewrite pour valider — l’auto-correction n’est jamais 100 % infaillible.

Pour un projet partagé, créer un fichier de config réutilisable :

Fenêtre de terminal
spotter config set ./spotter.yml
spotter config get # affiche la config active
spotter config clear # remet à zéro

Format spotter.yml (équivalent JSON disponible) :

ansible_version: "2.18"
display_level: warning
profile: security
skip_checks:
- event: W003
fqcn: ansible.builtin.uri
enforce_checks:
- event: E005
fqcn: community.crypto.x509_certificate

Avec ce fichier versionné dans le repo, toute l’équipe scanne avec les mêmes règles sans devoir mémoriser les flags CLI.

# .github/workflows/ci.yml — extrait Spotter
name: CI
on: [push, pull_request]
permissions: {}
jobs:
spotter-scan:
runs-on: ubuntu-24.04
permissions:
contents: read
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: '3.12'
- name: Install Spotter
run: pipx install steampunk-spotter
- name: Scan
env:
SPOTTER_TOKEN: ${{ secrets.SPOTTER_TOKEN }}
run: |
spotter scan \
--origin ci \
--display-level warning \
--profile security \
--sarif spotter.sarif \
playbook.yml
- uses: github/codeql-action/upload-sarif@<SHA40>
if: always()
with:
sarif_file: spotter.sarif

Bonnes pratiques CI :

  • --origin ci — Spotter taggue le scan comme provenant de CI (utile pour le filtrage côté UI).
  • --sarif — export au format SARIF que GitHub Code Scanning consomme nativement (alertes inline sur la PR).
  • Token via GitHub Secrets, jamais en clair dans le workflow.
  • Pinning par SHA des actions (zizmor compliant).
# .gitlab-ci.yml — extrait
spotter-scan:
stage: lint
image: python:3.12-slim
variables:
SPOTTER_TOKEN: $SPOTTER_TOKEN_MASKED # variable masquée GitLab
script:
- pip install steampunk-spotter
- spotter scan --origin ci --display-level warning playbook.yml
only:
- merge_requests
Critèreansible-lintSpotter
ModèleCLI local pureCloud (token requis)
CoûtGratuit, open-sourceFreemium
Règles~100 règles (profile production)~300+ règles
Multi-version AnsiblePas natifNatif (-a 2.18)
Modules renommés/déplacésLimitéExcellent (BD à jour côté serveur)
Scoring qualitéNonOui (note globale par scan)
Auto-fix--fix (basique)--rewrite (étendu)
Historique scansNon (chaque run isolé)Oui (UI web)
Intégration GitHub Code ScanningVia pluginsNatif (SARIF)
ConfidentialitéLocal 100 %Code envoyé au cloud

Stratégie recommandée 2026 :

  1. ansible-lint --profile production dans la CI bloquante — base mandatory, gratuit, local.
  2. Spotter en scan pre-merge sur des PR significatives — détecte ce qu’ansible-lint laisse passer.
  3. Spotter --rewrite ponctuellement pour migration de masse (ex: collection renommée upstream).
SymptômeCauseFix
Error: you are not logged in!Pas de token configuréspotter login ou export SPOTTER_TOKEN=...
Scan lent (>10 s) sur petit playbookLatence cloudPréférer ansible-lint en dev, Spotter en CI/pre-merge
Quota mensuel atteintPlan Community = 100 scans/moisUpgrade ou réserver Spotter aux scans CI
Faux positifs H1900 collection missingrequirements.yml pas dans le path scannéScanner le dossier projet plutôt qu’un fichier isolé
ansible_version non détectéPas de ansible-core sur le runner CIForcer avec -a 2.18
  • Spotter v5.12+ : analyseur Ansible cloud freemium, complète ansible-lint (multi-version, modules renommés, scoring).
  • Installation pipx non négociable — pas de pollution Python globale.
  • Token via env var/secret manager uniquement — jamais en clair.
  • --profile security pour focus sécurité, --rewrite pour migration assistée.
  • Stratégie 2026 : ansible-lint en CI bloquante (gratuit, local) + Spotter en pre-merge (détection avancée).
  • Conscience cloud : Spotter envoie votre code à un service tiers — peser sur du code propriétaire.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn