tech:bonnes_pratiques_ansible
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| tech:bonnes_pratiques_ansible [2025/10/29 14:12] – Jean-Baptiste | tech:bonnes_pratiques_ansible [2025/11/20 16:27] (Version actuelle) – Jean-Baptiste | ||
|---|---|---|---|
| Ligne 74: | Ligne 74: | ||
| Éviter d' | Éviter d' | ||
| Privilégier **M(command)** à **M(shell)** \\ | Privilégier **M(command)** à **M(shell)** \\ | ||
| - | Si variables Jinja en argument à M(command) ou M(shell) : utiliser '' | + | Si variables Jinja en argument à M(shell) : utiliser '' |
| Pour **M(command)**, | Pour **M(command)**, | ||
| * '' | * '' | ||
| Ligne 108: | Ligne 108: | ||
| === Ansible-lint | === Ansible-lint | ||
| - | Ne pas utiliser de module obsolète " | + | Ne pas utiliser de module obsolète " |
| Corriger le code pour chaque avertissement. | Corriger le code pour chaque avertissement. | ||
| Ligne 114: | Ligne 114: | ||
| Nommer chaque tâche | Nommer chaque tâche | ||
| - | Les noms de tâche devraient être uniques | + | Les noms de tâche devraient être uniques |
| Conformité ansible-lint | Conformité ansible-lint | ||
| Conformité indentation yamllint | Conformité indentation yamllint | ||
| + | |||
| + | Préciser le owner/ | ||
| + | |||
| Ligne 150: | Ligne 153: | ||
| * Une référence unique. Un seul rôle (ou un seul playbook) fait appel directement à ce fichier. | * 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. | * Si deux roles ou besoin de ce même fichier : créer un 3em rôle et faire un dépendance de rôle. | ||
| + | |||
| == Bonnes pratiques propres à Ansible II | == Bonnes pratiques propres à Ansible II | ||
| + | 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) | ||
| + | |||
| + | <code yaml> | ||
| + | - name: Get minimal facts | ||
| + | ansible.builtin.setup: | ||
| + | gather_subset: | ||
| + | - ' | ||
| + | - distribution | ||
| + | </ | ||
| - | Playbook pouvant fonctionner un Dry-Run ('' | + | Playbook pouvant fonctionner un Dry-Run ('' |
| * '' | * '' | ||
| Ne pas utilisez '' | Ne pas utilisez '' | ||
| - | Préferez " | + | Préferez " |
| + | Éviter d’utiliser '' | ||
| + | |||
| + | |||
| + | 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) | ||
| + | |||
| + | Exemple : | ||
| + | '' | ||
| + | <code yaml> | ||
| + | ansible_managed: | ||
| + | </ | ||
| + | |||
| + | |||
| + | === Pièges | ||
| + | |||
| + | ==== Run_once | ||
| + | |||
| + | |||
| + | |||
| + | run_once will be executed at each serial execution in the play. That means, if you choose serial = 1, it will be asked to confirm as many times as the quantity of targets on the play. | ||
| + | |||
| + | Check Ansible docs: https:// | ||
| + | |||
| + | When used together with serial, tasks marked as run_once will be run on one host in each serial batch. If the task must run only once regardless of serial mode, use '' | ||
| + | |||
| + | Attention aux slicing ! | ||
| + | |||
| + | |||
| + | |||
| + | === Limiter l' | ||
| + | |||
| + | <code yaml> | ||
| + | - name: Installation d'un logiciel sur plusieurs serveurs avec throttle | ||
| + | ansible.builtin.apt: | ||
| + | name: nginx | ||
| + | state: present | ||
| + | async: 600 # Exécution en mode asynchrone avec un délai maximum de 10 minutes | ||
| + | poll: 5 # Vérification toutes les 5 secondes | ||
| + | throttle: 3 # Limite à 3 installations simultanées | ||
| + | when: inventory_hostname in groups[' | ||
| + | </ | ||
| - | Éviter d’utiliser '' | ||
| Ligne 172: | Ligne 226: | ||
| * https:// | * https:// | ||
| - | Ne pas utiliser '' | + | Ne pas utiliser '' |
| - | Ne pas utiliser '' | + | Ne pas utiliser '' |
| - | Utiliser des inventaires dynamiques (If you have an external source of truth) | + | Utiliser des inventaires dynamiques (If you have an external source of truth) (RA_QUA_N3) |
| * single source of truth (SSOT) architecture, | * single source of truth (SSOT) architecture, | ||
| Ligne 182: | Ligne 236: | ||
| Variable Management for Inventory - Keeping variable data along with the hosts and groups definitions (see the inventory editor) is encouraged, rather than using group_vars/ and host_vars/ | Variable Management for Inventory - Keeping variable data along with the hosts and groups definitions (see the inventory editor) is encouraged, rather than using group_vars/ and host_vars/ | ||
| - | Autoscaling - Using the “callback” feature to allow newly booting instances to request configuration is very useful for auto-scaling scenarios or provisioning integration. | + | Autoscaling - Using the “callback” feature to allow newly booting instances to request configuration is very useful for auto-scaling scenarios or provisioning integration.$ |
| - | 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) | + | 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 utiliser Verbosity à 4 ou 5. Eviter d' | Ne pas utiliser Verbosity à 4 ou 5. Eviter d' | ||
| - | Eviter le cache des facts coté serveur (Enable Fact Storage) | + | Ne pas mettre les facts des nœuds dans la base de données - Ne pas activer " |
| + | Le cache des facts doit être sur les managed_hosts et non coté serveur (RA_GEN_N1) | ||
| + | |||
| + | Ne pas faire de '' | ||
| + | |||
| Ligne 206: | Ligne 265: | ||
| Utiliser le cache que cela est possible : | Utiliser le cache que cela est possible : | ||
| - | * Pour les facts (facts caching) | + | * Pour les facts (facts caching) (RA_PERF_N3) |
| * Mais éviter " | * Mais éviter " | ||
| * Pour les inventaires (cache_plugin, | * Pour les inventaires (cache_plugin, | ||
| Ligne 221: | Ligne 280: | ||
| Éviter le code spaghetti | Éviter le code spaghetti | ||
| - | Assert extra_var, controler les inputs des utilisateurs | + | Assert extra_var, controler les inputs des utilisateurs |
| - | Assert sur les cibles | + | Assert sur les cibles |
| Faire les contrôle de plus tôt possible. | Faire les contrôle de plus tôt possible. | ||
| Ligne 231: | Ligne 290: | ||
| Playbook dédié : '' | Playbook dédié : '' | ||
| - | Utiliser un logiciel de gestion de versions tel que Git | + | Utiliser un logiciel de gestion de versions tel que Git (RA_GEN_N1) |
| Use Source Control https:// | Use Source Control https:// | ||
| - | Utiliser l' | + | Utiliser l' |
| - | Remplacer les tabulations par 2 espaces (A config si ce n'est pas le cas dans l'IDE) | + | Remplacer les tabulations par 2 espaces (A config si ce n'est pas le cas dans l'IDE) (RA_GEN_N1) |
| - | Factoriser - Éviter de dupliquer du code - Don't Repeat Yourself (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' | Dans la mesure du possible, seulement se répéter est mieux que d' | ||
| Car "à la pureté, privilégie l' | Car "à la pureté, privilégie l' | ||
| Ligne 244: | Ligne 303: | ||
| * '' | * '' | ||
| * En utilisant import* et include* (attention aux notify avec include) | * En utilisant import* et include* (attention aux notify avec include) | ||
| + | * En utilsant '' | ||
| + | |||
| + | Utiliser SonarQube ou équivalent (RA_GEN_N4) | ||
| + | |||
| - | Utiliser SonarQube ou équivalent | ||
| Petits textes | Petits textes | ||
| * Utiliser le charset '' | * Utiliser le charset '' | ||
| * Convertir le charset '' | * Convertir le charset '' | ||
| - | * Devrait être dans ''< | + | * Devrait être dans ''< |
| Encodage fichier | Encodage fichier | ||
| Ligne 258: | Ligne 320: | ||
| - | === Utiliser les modules déjà | + | === Utiliser les modules déjà |
| Ligne 369: | Ligne 432: | ||
| You cannot use loops on ' | You cannot use loops on ' | ||
| </ | </ | ||
| - | |||
| - | |||
| - | |||
| - | |||
| Ligne 379: | Ligne 438: | ||
| == Sécurité | == Sécurité | ||
| - | Mettre les '' | + | Mettre les '' |
| Ligne 390: | Ligne 449: | ||
| * community.general.syslog_json | * community.general.syslog_json | ||
| - | Utiliser '' | + | Utiliser '' |
| + | |||
| + | Pour les données sensibles utiliser ansible-vault ou les Crendential AWX (RA_SEC_N1) | ||
| Troubleshooting untrusted templates | Troubleshooting untrusted templates | ||
| Ligne 407: | Ligne 468: | ||
| * https:// | * https:// | ||
| - | * Mettre en cache les facts (fact_caching) | + | * Mettre en cache les facts (fact_caching) (mais sur les noeuds, pas en DB) (RA_PERF_N3) |
| * Analyser les temps d’exécution anormalement long '' | * Analyser les temps d’exécution anormalement long '' | ||
| * Utiliser Mitogen | * Utiliser Mitogen | ||
| Ligne 413: | Ligne 474: | ||
| + | Eviter de boucler innutilement - vérifier si le module prends des listes (RA_PERF_N2) | ||
| - | + | <code yaml> | |
| + | - name: Install packages | ||
| + | ansible.builtin.package: | ||
| + | name: "{{ item }}" | ||
| + | state: present | ||
| + | loop: | ||
| + | - curl | ||
| + | - wget | ||
| + | </ | ||
| + | |||
| + | <code yaml> | ||
| + | - name: Install packages | ||
| + | ansible.builtin.package: | ||
| + | name: | ||
| + | - curl | ||
| + | - wget | ||
| + | </ | ||
| Ligne 434: | Ligne 511: | ||
| == Convention de nommage | == Convention de nommage | ||
| - | Si beaucoup de templates dans le role : utiliser une arborescence du style : | + | === Naming things |
| - | * files/etc/nginx/sites-available/plop | + | |
| + | * Use valid Python identifiers following standard naming conventions of being in snake_case_naming_schemes for all YAML or Python files, variables, arguments, repositories, | ||
| + | |||
| + | * Do not use special characters other than underscore in variable names, even if YAML/JSON allow them. | ||
| + | |||
| + | Source | ||
| + | |||
| + | |||
| + | === name | ||
| + | |||
| + | For example, if you have a task named **Restart server** inside a file named '' | ||
| + | Source : https://ansible.readthedocs.io/ | ||
| + | |||
| + | === role-name | ||
| + | |||
| + | (snake case) | ||
| + | Role names must contain only lowercase alphanumeric characters and the underscore _ character. Role names must also start with an alphabetic character. | ||
| + | Source : https:// | ||
| + | |||
| + | |||
| + | === var-naming | ||
| + | |||
| + | ... | ||
| + | Variable names must contain only lowercase alphanumeric characters and the underscore _ character. Variable names must also start with either an alphabetic or underscore _ character. | ||
| + | ... | ||
| + | role_name_ as a prefix | ||
| + | ... | ||
| + | Source : https:// | ||
| + | |||
| + | |||
| + | === Extra_vars | ||
| Voir : https:// | Voir : https:// | ||
| - | Convention pour les **register** | + | Exemple : '' |
| + | |||
| + | |||
| + | === Register | ||
| + | |||
| + | Convention pour les **register**. | ||
| + | Exemple '' | ||
| + | |||
| + | |||
| + | === Autres | ||
| Les listes seront nommées avec un **s** finals. L' | Les listes seront nommées avec un **s** finals. L' | ||
| Ligne 450: | Ligne 566: | ||
| * Variables internes | * Variables internes | ||
| - | Nommer les templates Jinja avec l’extension **j2** | + | Nommer les templates Jinja avec l’extension **j2** |
| - | + | ||
| - | Préciser le owner/ | + | |
| - | + | ||
| - | Préférer les variables a plat plutôt que les variables dictionnaires | + | Préférer les variables a plat plutôt que les variables dictionnaires |
| <code yaml> | <code yaml> | ||
| endpoint_url: | endpoint_url: | ||
| Ligne 474: | Ligne 586: | ||
| === Boucles | === Boucles | ||
| - | De préférence nommer la variable de boucle ('' | + | De préférence nommer la variable de boucle ('' |
| C'est plus lisible, et cela permet un fonctionnement non équivoque en cas de boucles imbriqués. | C'est plus lisible, et cela permet un fonctionnement non équivoque en cas de boucles imbriqués. | ||
| Ligne 496: | Ligne 608: | ||
| === Fichiers / templates | === Fichiers / templates | ||
| - | Pour les roles contenants beaucoup de fichiers dans " | + | Pour les roles contenants beaucoup de fichiers dans " |
| * files/ | * files/ | ||
| * files/ | * files/ | ||
tech/bonnes_pratiques_ansible.1761743570.txt.gz · Dernière modification : de Jean-Baptiste
