tech:bonnes_pratiques_ansible_-_annexes
Différences
Ci-dessous, les différences entre deux révisions de la page.
| tech:bonnes_pratiques_ansible_-_annexes [2025/11/25 11:08] – créée Jean-Baptiste | tech:bonnes_pratiques_ansible_-_annexes [2025/11/25 12:48] (Version actuelle) – modification externe 127.0.0.1 | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | < | ||
| + | {{tag> | ||
| + | |||
| + | {{tag> | ||
| + | # Bonnes pratiques Ansible - annexes | ||
| + | |||
| + | Voir : | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | |||
| + | |||
| + | |||
| + | ## Principes | ||
| + | |||
| + | Zen de Python | ||
| + | |||
| + | https:// | ||
| + | |||
| + | ~~~python | ||
| + | import this | ||
| + | ~~~ | ||
| + | |||
| + | |||
| + | ## Plan | ||
| + | |||
| + | * Bonnes pratiques propres à Ansible 1 | ||
| + | * Idempotent | ||
| + | * Ansible-lint | ||
| + | * Bonnes pratiques propres à Ansible 2 | ||
| + | * Bonnes pratiques IT | ||
| + | * Logs | ||
| + | * Proterger les secrets | ||
| + | * Assert sur les cibles | ||
| + | * Bonnes pratiques code | ||
| + | * DRY | ||
| + | * Ne pas réinventer le roue | ||
| + | * Pas de code spacelift | ||
| + | * Controler tous les inputs | ||
| + | * Faire les contrôle de plus tôt possible. | ||
| + | |||
| + | |||
| + | |||
| + | ## Fichiers | ||
| + | |||
| + | ~~~bash | ||
| + | find . -type f -wholename " | ||
| + | find . -type f -wholename " | ||
| + | ~~~ | ||
| + | |||
| + | |||
| + | * Garder une arborescence similaire aux petits textes : le chemin doit contenir le nom de rôles ou du playbook | ||
| + | * Une référence unique. Un seul rôle (ou un seul playbook) fait appel directement à ce fichier. | ||
| + | * Si deux roles ou besoin de ce même fichier : créer un 3em rôle et faire un dépendance de rôle. | ||
| + | |||
| + | |||
| + | ## DRY | ||
| + | |||
| + | Factoriser - Éviter de dupliquer du code - Don't Repeat Yourself (DRY) (RA_GEN_N3) | ||
| + | Dans la mesure du possible, seulement se répéter est mieux que d' | ||
| + | Car "à la pureté, privilégie l' | ||
| + | * En créant des rôles en les appelant avec des arguments / variables | ||
| + | * '' | ||
| + | * En utilisant import* et include* (attention aux notify avec include) | ||
| + | * En utilsant '' | ||
| + | |||
| + | |||
| + | ## Classification | ||
| + | |||
| + | * Ne pas utiliser de module obsolète “Deprecated” (RA_QUA_N2) | ||
| + | * Les noms de tâche devraient être uniques (RA_QUA_N3) | ||
| + | * Si pas besoin des facts : mettre gather_facts à false (RA_PERF_N3) | ||
| + | * Si besoin de facts récuper seulement les facts utiles (RA_PERF_N3) | ||
| + | * Playbook pouvant fonctionner un Dry-Run (--check) (RA_TEST_N2) | ||
| + | * Ne pas utilisez ignore_errors: | ||
| + | * Éviter d’utiliser delegate_to surtout, dans les rôles (RA_QUA_N1) | ||
| + | * Pour les templates et les fichiers, systématiquement sauf si non applicable mettre en commentaire que ce fichier est géré par Ansible. (RA_QUA_N1) | ||
| + | * Ne pas utiliser M(vars_prompt) (remplacé par les “Surveys” et extra-vars) (RA_QUA_N1) | ||
| + | * Ne pas utiliser M(pause) sans timeout (RA_QUA_N1) | ||
| + | * Utiliser des inventaires dynamiques (If you have an external source of truth) (RA_QUA_N3) | ||
| + | * Larger Host Counts - Consider setting “forks” on a job template to larger values to increase parallelism of execution runs. Voir : Strategy, Mitogen, Slicing, Async (Asynchronous) (RA_PERF_N3) | ||
| + | * Ne pas mettre les facts des nœuds dans la base de données - Ne pas activer “Enable Fact Storage” Le cache des facts doit être sur les managed_hosts et non coté serveur (RA_GEN_N1) | ||
| + | * Ne pas faire de command: ansible-galaxy ni de shell: ansible-galaxy, | ||
| + | * Pour les facts (facts caching) (RA_PERF_N3) | ||
| + | * Assert extra_var, controler les inputs des utilisateurs (RA_SEC_N1) | ||
| + | * Assert sur les cibles (RA_SEC_N2) | ||
| + | * Utiliser un logiciel de gestion de versions tel que Git (RA_GEN_N1) Use Source Control https:// | ||
| + | * Utiliser SonarQube ou équivalent (RA_GEN_N4) | ||
| + | * Utiliser l' | ||
| + | * Remplacer les tabulations par 2 espaces (A config si ce n'est pas le cas dans l'IDE) (RA_GEN_N1) | ||
| + | * DRY - Factoriser - Éviter de dupliquer du code - Don't Repeat Yourself (DRY) (RA_GEN_N3) Dans la mesure du possible, seulement se répéter est mieux que d' | ||
| + | * Mettre les become_user: | ||
| + | * Utiliser no_log: true pour les taches utilisant des secrets (RA_SEC_N1) | ||
| + | * Pour les données sensibles utiliser ansible-vault ou les Crendential AWX (RA_SEC_N1) | ||
| + | * Mettre en cache les facts (fact_caching) (mais sur les noeuds, pas en DB) (RA_PERF_N3) | ||
| + | * Eviter de boucler innutilement - vérifier si le module prends des listes (RA_PERF_N2) | ||
| + | * Nommer les templates Jinja avec l’extension j2 (RA_CONV_REQ) | ||
| + | * Préférer les variables a plat plutôt que les variables dictionnaires (RA_CONV_OPT) | ||
| + | * De préférence nommer la variable de boucle (loop_var) à la place d' | ||
| + | * ? Pour les roles contenants beaucoup de fichiers dans “files/ | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ## Bonnes pratiques IT | ||
| + | |||
| + | |||
| + | Tester les playbooks sur un environnement hors prod. | ||
| + | * https:// | ||
| + | |||
| + | Mettre en place des tests unitaires : | ||
| + | * https:// | ||
| + | * Molecule | ||
| + | |||
| + | |||
| + | Utiliser le cache que cela est possible : | ||
| + | * Pour les facts (facts caching) (RA_PERF_N3) | ||
| + | * Mais éviter " | ||
| + | * Pour les inventaires (cache_plugin, | ||
| + | |||
| + | ~~~ini | ||
| + | [inventory] | ||
| + | cache = True | ||
| + | cache_plugin = memory | ||
| + | cache_timeout = 1800 | ||
| + | ~~~ | ||
| + | |||
| + | |||
| + | |||
| + | ## Idempotence | ||
| + | |||
| + | Si Appel API -> Changed (par défaut) | ||
| + | |||
| + | |||
| + | Utiliser les **handlers** pour redémarrer les services | ||
| + | Mais attention avec les modules (import*), les handlers ne sont pas déclenchés par défaut. Faire '' | ||
| + | |||
| + | |||
| + | ## Fichiers | ||
| + | |||
| + | * Devraient être dans < | ||
| + | |||
| + | |||
| + | |||
