


Écrire et relire une automatisation d'infrastructure Ansible sans affaiblir la sécurité
À utiliser quand une IA écrit ou modifie une automatisation d'infrastructure Ansible. Elle passe les lint et contrôles de sécurité sans avertissement, garde les secrets hors du dépôt, teste le réseau de bas en haut, prouve que les tests trouvent le bug et ne signale que les tests lancés.
Pour utiliser ces règles d'IA
## Faire passer la sécurité et la stabilité d'abord, et ne changer que ce qui est demandé
Traitez l'automatisation d'infrastructure comme du code critique pour la sécurité : une petite erreur de configuration peut affaiblir silencieusement la confidentialité, le contrôle d'accès, le routage ou la disponibilité du service.
- Préférez la stabilité au volume de fonctionnalités, la sécurité à la commodité et la clarté à l'ingéniosité.
- Résolvez exactement le problème demandé. Séparez les corrections sans rapport et les fonctionnalités spéculatives dans d'autres travaux.
- Testez les hypothèses en exécutant l'automatisation concernée avant de déclarer une modification terminée.
- Résistez à l'ajout de dépendances. Chaque dépendance élargit la surface d'attaque et la charge de maintenance.
- Suivez les modèles existants du dépôt avant d'introduire de nouvelles abstractions ou options de configuration.
- Traitez chaque nouvelle option comme une surface de test supplémentaire ; ne l'ajoutez que si les utilisateurs ont un besoin démontré.
- Utilisez des déploiements neufs pour les tests de comportement lorsque l'état conservé pourrait masquer des défauts.
## Passer tous les lint et contrôles de sécurité sans aucun avertissement
Exécutez le contrôle qualité local complet du dépôt avant la révision. Il doit couvrir l'analyse de la configuration, du YAML et du langage, l'analyse du shell, l'analyse statique de sécurité, les contrôles de syntaxe des playbooks et les tests unitaires pertinents.
Aucun avertissement n'est acceptable dans l'intégration continue. Dans une automatisation sensible à la sécurité, des constats apparemment cosmétiques peuvent masquer des modèles cassés, des permissions de fichiers dangereuses ou une véritable régression au milieu d'un bruit récurrent.
Résolvez les constats dans cet ordre :
1. Corrigez le problème sous-jacent.
2. Si la règle est incorrecte pour le dépôt, ajoutez-la à la liste d'autorisation de la configuration de l'outil responsable et expliquez pourquoi.
3. Utilisez une suppression en ligne uniquement en dernier recours, en nommant la règle exacte et en documentant l'exception.
Ne transférez pas les constats vers une liste permanente d'avertissements. Une règle doit réussir ou être explicitement ignorée avec une justification durable.
Les contrôles obligatoires courants comprennent :
- Commencer les documents YAML par `---` et mettre entre guillemets les clés ambiguës des flux de travail lorsque l'analyseur l'exige.
- Préférer des conditions d'échec explicites comme `failed_when` à un usage large de `ignore_errors`.
- Utiliser un espacement Jinja2 cohérent.
- Spécifier `mode` pour chaque tâche de fichier ou de répertoire au lieu de dépendre de `umask`.
- Mettre les variables de shell entre guillemets et activer une gestion stricte des erreurs du shell.
- Traiter les suppressions d'analyse statique comme des exceptions à réviser, pas comme des raccourcis.
Avant de soumettre une modification, examinez la différence, consignez les contrôles exécutés et confirmez que l'intégration continue effectuera les mêmes validations essentielles.
## Vérifier les entrées tôt et garder les secrets hors du dépôt
Validez les entrées avant les opérations coûteuses ou qui modifient l'état. Rejetez les collections vides, les configurations absentes, les adresses mal formées, les versions incompatibles et les permissions incohérentes au premier point fiable.
- Définissez explicitement les modes des fichiers et répertoires.
- Échouez en cas d'erreur de permission, d'authentification, de cryptographie ou de frontière de sécurité. Réservez les avertissements aux comportements réellement facultatifs.
- Rendez les erreurs exploitables en indiquant la condition en échec et la mesure corrective sûre.
- Appliquez le moindre privilège : réduisez au minimum les permissions, comptes, identifiants conservés et capacités de processus.
- Utilisez des valeurs par défaut sûres, une cryptographie forte, des règles de pare-feu strictes, une journalisation minimale et une rétention minimale des données.
- Ne placez jamais de mots de passe, clés privées, jetons d'accès ou identifiants de fournisseurs dans la gestion des sources.
- Réagissez rapidement aux vulnérabilités de sécurité confirmées et vérifiez le comportement mis à jour.
- Évitez les solutions de contournement non documentées. Consignez leur raison d'être et référencez leur problème en amont afin que les responsables puissent les retirer ultérieurement en toute sécurité.
Recherchez un modèle établi dans la base de code avant d'ajouter une tâche, une condition, un chemin de fournisseur ou un module. Réutilisez le flux de contrôle établi, sauf si des preuves montrent qu'il ne convient pas.
## Éviter les erreurs courantes dans les boucles Ansible et les modèles Jinja2
Ne remplacez pas mécaniquement une itération ancienne par `loop`. Certaines formes anciennes aplatissent les listes imbriquées, tandis que `loop` les conserve. Vérifiez la forme obtenue de l'élément et confirmez que les fichiers ou ressources attendus sont créés.
- Transmettez une liste directement à `loop` ; n'enveloppez pas une liste existante dans une autre.
- Combinez explicitement les listes lorsque la construction précédente aplatissait plusieurs entrées.
- Évitez les barres finales dans les variables de chemin afin d'empêcher les séparateurs en double.
- Pour les commandes et gestionnaires en lecture seule, définissez `changed_when: false` afin de conserver des rapports d'état exacts.
- Utilisez `failed_when: false` uniquement lorsque l'échec de la commande est explicitement attendu et sûr ; ne masquez pas les échecs sans rapport.
Avec l'évaluation native de Jinja2 :
- Les conditions exigent de véritables booléens, pas des chaînes comme `"true"` et `"false"`.
- Transmettez directement les variables aux fonctions de recherche ; n'imbriquez pas une expression de modèle dans une autre.
- Analysez explicitement le texte JSON lorsqu'une recherche renvoie le contenu d'un fichier.
- Rappelez-vous que `default()` ne remplace pas une chaîne vide sauf si son option pour les valeurs fausses est activée.
- Remplacez les compréhensions de listes complexes générées par des modèles par des boucles d'automatisation ordinaires et une accumulation explicite.
- Utilisez des tests pour les prédicats booléens et des filtres pour les transformations de données.
Testez les modèles avec les filtres réels du cadre d'automatisation ou avec des simulations fidèles. La validité syntaxique seule ne démontre pas le comportement en mode natif.
## Diagnostiquer les services réseau couche par couche, en partant des ports en écoute
Diagnostiquez l'automatisation réseau depuis la couche incertaine la plus basse au lieu de supposer que tout symptôme de connectivité est un échec de routage.
1. Confirmez que les sockets TCP et UDP attendus écoutent à l'adresse et au port prévus.
2. Examinez l'état du service et de l'unité de socket à la recherche d'avertissements de configuration.
3. Vérifiez les paramètres réseau nécessaires du noyau.
4. Testez la résolution de noms directement auprès du résolveur configuré.
5. Ensuite seulement, examinez les règles de pare-feu, de traduction d'adresses et de routage par stratégie.
Pour les services activés par socket, configurez l'unité de socket plutôt que la seule configuration du service. Effacez les écouteurs hérités si nécessaire, définissez les écouteurs de flux et de datagrammes, puis redémarrez le socket après les modifications. Désactiver le socket peut rompre les dépendances du service.
Tenez délibérément compte des différences entre plateformes :
- Les systèmes de pare-feu peuvent réordonner les règles ; fixez ou vérifiez celui dont l'automatisation attend le comportement.
- Les hôtes à plusieurs connexions réseau peuvent nécessiter une interface de sortie explicite pour la traduction d'adresses.
- Préférez un masquage simple avec interface spécifiée à une complexité inutile de traduction de source lorsqu'il répond au besoin.
- Ajoutez conditionnellement des indicateurs de compatibilité après avoir détecté la version de l'outil installé.
- Placez les points de terminaison IPv6 entre crochets lorsque la syntaxe hôte-port l'exige.
- Vérifiez la résolution de noms avant de repenser les règles de routage ou de traduction.
Gardez les règles réseau simples et testez le flux de paquets au lieu de déduire la réussite du résultat d'une tâche.
## Prouver que chaque test de régression échoue quand le bug revient
Un test de régression doit démontrer qu'il détecte le défaut qu'il prétend empêcher.
1. Écrivez un test ciblé sur le cas d'échec.
2. Introduisez temporairement le défaut ou modifiez la condition concernée.
3. Confirmez que le nouveau test échoue pour la raison prévue.
4. Restaurez l'implémentation correcte et confirmez que le test réussit.
5. Documentez la régression exacte contre laquelle le test protège.
Lorsque le comportement dépend de modèles, de chemins de fichiers, de permissions, de règles de pare-feu ou de formes de collections, testez le résultat observable plutôt que le seul texte généré. Vérifiez, selon le cas, les fichiers créés, les modes effectifs, les valeurs analysées, l'état des écouteurs, le flux de paquets ou la sortie produite.
Mettez à jour les tests existants lorsqu'une modification change les chemins ou le comportement. Ne supposez pas qu'un test réussi est significatif avant d'avoir démontré sa sensibilité à l'échec.
## Déployer sans questions interactives et ne signaler que les contrôles réellement faits
L'automatisation destinée à l'intégration continue ou aux agents doit prendre en charge un chemin entièrement non interactif.
- Toute invite doit être contournée lorsque sa variable est prédéfinie au moyen d'un paramètre ou d'une variable d'environnement approuvés.
- Documentez l'ensemble complet des variables principales, leurs types, valeurs par défaut et finalité.
- Séparez les identifiants propres aux fournisseurs de la configuration ordinaire et n'acceptez ces identifiants que par des canaux de secrets approuvés.
- Exigez des variables de confirmation explicites pour les modes de déploiement locaux ou à fort impact.
- Assurez-vous que les fonctionnalités facultatives ont des valeurs booléennes explicites afin que les exécutions sans interface ne s'interrompent pas faute d'entrée.
- Testez le chemin non interactif dans un environnement propre présentant des conditions représentatives de plusieurs interfaces et adresses.
Avant l'achèvement, exécutez tous les outils d'analyse, contrôles de syntaxe, tests unitaires pertinents et un nouveau déploiement ou test d'intégration équivalent. Examinez la différence pour détecter les corrections sans rapport, les dépendances injustifiées, les suppressions masquées, les modes de fichiers absents, les secrets et les comportements non documentés. Signalez les preuves exactes recueillies et ne déclarez pas la réussite du déploiement si seuls des contrôles statiques ont été exécutés.
