Ansible : Configuration et déplay
(Section : Technologie et infrastructure)
Résumé succinct
Ansible est un outil déclaratif de configuration et d'orchestration idéal pour la configuration répétée de VM/hôtes, services et applications lorsque l'infrastructure est déjà en place (Terraform/IaC) et que vous devez « revitaliser » votre environnement : installer des paquets, lancer une version, faire rouler des modèles, redémarrer des services sans downtime, appliquer des politiques de sécurité. La clé du succès : structure modulaire (rôles/collections), idempotence rigoureuse, travail soigné des secrets (Vault), inventaires dynamiques, tests et discipline GitOps.
Quand Ansible est approprié (et comment il est combiné avec Terraform)
Terraform : Crée des ressources (VPC, clusters, bases de données).
Ansible - configure le système d'exploitation/logiciel, déplace les versions, conduit les migrations, gère les fichiers et les services.
Lien : Terraform affiche « inventory »/IP/secrets dans les artefacts, Ansible les lit dans l'étape CD.
Structure du référentiel (modèle recommandé)
ansible/
inventories/
prod/
inventory. ini # or inventory. yaml group_vars/
all. yml web. yml db. yml host_vars/
web-01. yml stage/
...
roles/
webapp/
defaults/main. yml vars/main. yml tasks/main. yml handlers/main. yml templates/.j2 files/
meta/main. yml hardening/
...
playbooks/
site. yml deploy_webapp. yml hardening. yml collections/requirements. yml ansible. cfg
ansible. cfg (minimum) :
ini
[defaults]
inventory = inventories/stage/inventory. ini stdout_callback = yaml callbacks_enabled = timer, profile_tasks interpreter_python = auto retry_files_enabled = False forks = 25 host_key_checking = True
Inventaires : statiques et dynamiques
Statique (ini) :ini
[web]
web-01 ansible_host=10. 0. 1. 10 web-02 ansible_host=10. 0. 1. 11
[db]
db-01 ansible_host=10. 0. 2. 10
[all:vars]
ansible_user=ansible ansible_ssh_common_args='-o ProxyJump=bastion@1. 2. 3. 4'
Dynamique
Utilisez les plugins du nuage (ou votre propre script) pour tirer les hôtes sur les balises. Variables d'environnement/balises → 'group _ vars'.
Rôles et collections
Rôle = module de réutilisation indépendant (tâches, fichiers, modèles, handler).
Collections - jeu de rôles/plugins/modules. Fixez les pins des versions dans 'collections/requirements. yml`.
yaml collections/requirements. yml collections:
- name: community. general version: ">=8. 0. 0,<9. 0. 0"
- name: ansible. posix
Playbooks : scénarios idempotent
Exemple de playbook générique :yaml playbooks/site. yml
- hosts: all gather_facts: true become: true roles:
- hardening
- hosts: web become: true roles:
- webapp
Rôle 'webapp' (fragments) :
yaml roles/webapp/tasks/main. yml
- name: Install packages:
name: ["nginx", "python3-venv"]
state: present
- name: Template configuration template:
src: nginx. conf. j2 dest: /etc/nginx/nginx. conf mode: "0644"
notify: Restart nginx
- name: unarchive artifact deploy:
src: "{{ webapp_package_url }}" # артефакт из CI dest: /opt/webapp remote_src: true creates: /opt/webapp/current
- name: Link to the current version of file:
src: "/opt/webapp/releases/{{ release_id }}"
dest: /opt/webapp/current state: link notify: Reload webapp
Handler :
yaml roles/webapp/handlers/main. yml
- name: Restart nginx service: { name: nginx, state: restarted }
- name: Reload webapp systemd: { name: webapp, state: reloaded, daemon_reload: true }
Modèles de Jinja2 et variables
Stockez les variables par défaut dans 'defaults/main. yml ', sensible - dans Vault.
Utilisez les filtres ('| to_nice_yaml',' b64encode ',' | default ') et les conditions' when '.
jinja2 worker_processes auto;
http {
server {
listen 80;
server_name {{ inventory_hostname }};
location / {
proxy_pass http://127. 0. 0. 1:{{ webapp_port }};
}
}
}
Secrets : Ansible Vault et les gestionnaires de secrets
Vault pour le chiffrement des fichiers de variables ('group _ vars/all. vault. yml`).
Il est préférable de lire les secrets des gestionnaires externes (KMS/Secrets Manager/SSM) à travers les modules appropriés et de ne stocker que les liens/ARN dans Vault.
yaml group_vars/all. vault. yml (ansible-vault encrypted)
webapp_db_password: "..."
jwt_signing_key: "..."
Recommandations :
- Diviser l'accès : les développeurs voient dev/stage, prod - uniquement CI.
- Activez la rotation des secrets et l'audit d'accès.
Idempotence et modifications correctes
Utilisez les modules ('package', 'user', 'lineinfile', 'template', 'systemd') au lieu de' shell/command '.
Marquez les tâches « bruyantes » 'changed _ when : false' si elles ne changent rien.
Prenez en charge le mode check ('--check') et bou pour les rôles.
Pour les tâches instables : 'retries', 'delay', 'until'.
yaml
- name: Wait for HTTP uri availability:
url: "http://localhost/health"
status_code: 200 register: health retries: 10 delay: 5 until: health. status == 200
Productivité : grandes fermes et pics
forks : soulevez le parallélisme (avec prudence : ne surcharge pas la cible).
strategy = free - effectuez des tâches sans attendre vos voisins.
pipelining = True в `ansible. cfg 'réduit la RTT.
gather_facts : faux là où les faits ne sont pas nécessaires.
async/bou pour les opérations de longue durée ; throttle/serial pour les ondes déployées.
delegate_to et run_once pour les actions uniques (par exemple, migration OBD).
Modèles de downtime zéro
Rolling-deploy (20 % chacun)
yaml
- hosts: web serial: "20%"
max_fail_percentage: 10 roles: [webapp]
Canary
Exécutez le playbook avec '--limit web-canary' (un sous-ensemble du groupe), vérifiez les métriques, puis répartissez sur l'ensemble du groupe.
Blue-Green
Deux groupes d'hôtes 'web _ blue' et 'web _ green' ; Préparez une nouvelle vague, passez ensuite le trafic (DNS/LB) à la tâche 'community. general. affiliate_lb'/API votre équilibreur.
Sécurité et hardening
Rôle hardening : politiques SSH, bannières, 'sudo'sans NOPASSWD, firewall, auditd/rsyslog, time-NTP, 'fail2ban'.
Activez SELinux/AppArmor et gérez les stratégies via les modules.
Bastion : limitez SSH aux cibles uniquement via jump-host (voir « ProxyJump »).
Minimiser 'become : true' ; formaliser le RBAC au niveau de l'inventaire (qui peut lancer quels playbooks).
Windows et matériel réseau
Windows : modules 'win _', connexion par WinRM, scripts PowerShell - comme dernier argument.
Network : 'network _ cli '/' httpapi', modules pour Cisco/Juniper/F5 ; atomicité via 'save _ when : changed'.
Tests et qualité
ansible-lint + yamllint в CI.
Molecule : tests de rôle local/conteneur, vérification de l'idempotence (double exécution inchangée).
Bac à sable : inventaires temporaires individuels/images VM.
yaml provisioner:
name: ansible verifier:
name: ansible scenario:
name: default
Intégration avec CI/CD et GitOps
Pipline type :1. Lint → Syntax check → Molecule.
2. Construire des artefacts d'application.
3. Deploy: `ansible-playbook -i inventories/prod site. yml --limit web --tags deploy`.
4. Retour sur les hôtes modifiés, artefact des loges.
Exemple d'étape (concept) :bash ansible-galaxy collection install -r collections/requirements. yml ansible-lint ansible-playbook playbooks/deploy_webapp. yml \
-i inventories/prod/inventory. ini \
-e release_id=${GIT_SHA} --diff
Observation et audit
Connectez les plugins callback (json/yaml/timer/profile_tasks) - rapports sur l'heure et les modifications.
Enregistrez les logs de playbooks dans un coffre-fort centralisé.
Marquez les tâches 'tags :' pour les lancements sélectifs et accélérer les enquêtes.
Recettes fréquentes pour iGaming
Nota Web/API : Nginx + systemd-unit, health-checks, secrets du gestionnaire, roll-restart.
Services de jeu : modèles de configues par région/tenants via 'group _ vars'.
Connecteurs de paiement : permishen stricts sur les clés, redémarrage par notify, post-vérification des endpoints.
jobs ETL : déploiement des scripts CronJob c 'cron' par le module, fichier lock idempotent.
Surveillance : installation des agents (node_exporter/otelcol), auto-enregistrement dans la surveillance.
Anti-modèles
Utiliser 'shell/command' là où il y a un module.
Les playbooks sans « handlers » → des restarts supplémentaires et des services tremblants.
Stocker des secrets dans les 'group _ vars' ouverts.
L'absence de 'serial '/' max _ fail _ percentage' pour les ondes de dérive.
Global 'gather _ facts : true' et 'become : true' sans besoin.
Rôles sans tests Molecule et sans prise en charge '--check'.
Longues commandes sans 'async/bou'bloquant toute la vague.
Chèque d'implémentation
1. Acceptez le squelette du référentiel et de la convention naming.
2. Personnalisez votre inventaire dynamique et bastion.
3. Créer des rôles (webapp/hardening/monitoring) et une version pin des collections.
4. Activer Vault et/ou l'intégration avec le gestionnaire de secrets.
5. Fournir l'idempotence, '--check/--diff', handlers et tags.
6. Connectez ansible-lint, yamllint, Molecule en CI.
7. Décrire le modèle de dégagement (rolling/canary/blue-green) et les limites « serial ».
8. Ajouter des plugins de callback, collecter des logs, signaler les modifications.
9. Documenter le runbook-and-back et les actions en cas d'incident.
10. Organisez régulièrement un jeu-day : falaise SSH, chute de nodules, retour en arrière de la version.
Résultats
Ansible ferme le « dernier kilomètre » entre l'infrastructure créée et la vente en cours : changements rapides, sécurisés et prévisibles dans les configurations et les versions. Avec un rôle comme unité de réutilisation minimale, des inventaires dynamiques, un travail correct avec des secrets et des modèles de downtime zéro, Ansible aide les équipes iGaming à réduire le temps-à-Deploy, réduire le nombre d'incidents nocturnes et maintenir p99 au niveau SLO.