f500.project_deploy_module
Module de déploiement de projet (deploy_helper)
Le module inclus est le module deploy_helper proposé pour ansible-modules-extra.
Explication générale, avec un exemple de structure de dossier pour un projet :
racine : versions : - 20140415234508 - 20140415235146 - 20140416082818
partagé :
- sessions
- uploads
actuel : -> versions/20140416082818
Le dossier 'versions' contient tous les déploiements disponibles. Un déploiement est une construction complète de l'application déployée. Cela peut être un clone d'un dépôt par exemple, ou une synchronisation d'un dossier local sur votre système de fichiers. Avoir des dossiers avec des horodatages est une façon d'avoir des déploiements distincts, mais vous pouvez choisir votre propre stratégie comme des tags git ou des hachages de commits.
Lors d’un déploiement, un nouveau dossier doit être créé dans le dossier des versions et les étapes de construction nécessaires doivent être effectuées. Une fois la nouvelle construction prête, la procédure de déploiement est 'finalisée' en remplaçant le lien symbolique 'actuel' par un lien vers cette construction.
Le dossier 'partagé' contient toutes les ressources partagées entre les déploiements. Des exemples incluent les fichiers de session du serveur web, ou les fichiers téléchargés par les utilisateurs de votre application. Il est courant d'avoir des liens symboliques depuis un dossier de déploiement pointant vers un sous-dossier partagé, et la création de ces liens serait automatisée dans le cadre des étapes de construction.
Le lien symbolique 'actuel' pointe vers l'une des versions. Probablement la plus récente, à moins qu'un déploiement soit en cours. La racine du serveur web pour le projet passera par ce lien symbolique, donc le 'temps d'arrêt' lors du passage à un nouveau déploiement est réduit au temps nécessaire pour changer le lien.
Pour faire la distinction entre les constructions réussies et celles inachevées, un fichier peut être placé dans le dossier du déploiement actuellement en cours. L'existence de ce fichier le marquera comme inachevé, et permettra une procédure automatisée de le supprimer lors du nettoyage.
Utilisation typique :
- nom : Initialiser la racine de déploiement et rassembler des informations
deploy_helper: path=/path/to/root
- nom : Cloner le projet dans le nouveau dossier de déploiement
git: repo=git://foosball.example.org/path/to/repo.git dest={{ deploy_helper.new_release_path }} version=v1.1.1
- nom : Ajouter un fichier inachevé, pour permettre le nettoyage lors de la finalisation réussie
file: path={{ deploy_helper.new_release_path }}/{{ deploy_helper.unfinished_filename }} state=touch
- nom : Effectuer quelques étapes de construction, comme exécuter votre gestionnaire de dépendances par exemple
composer: command=install working_dir={{ deploy_helper.new_release_path }}
- nom : Créer des dossiers dans le dossier partagé
file: path='{{ deploy_helper.shared_path }}/{{ item }}' state=directory
with_items: ['sessions', 'uploads']
- nom : Ajouter des liens symboliques du nouveau déploiement vers le dossier partagé
file: path='{{ deploy_helper.new_release_path }}/{{ item.path }}'
src='{{ deploy_helper.shared_path }}/{{ item.src }}'
state=link
with_items:
- { path: "app/sessions", src: "sessions" }
- { path: "web/uploads", src: "uploads" }
- nom : Finaliser le déploiement, en supprimant le fichier inachevé et en changeant le lien symbolique
deploy_helper: path=/path/to/root release={{ deploy_helper.new_release }} state=finalize
Récupérer des informations avant d'exécuter un déploiement
- nom : Exécuter 'state=query' pour rassembler des informations sans rien modifier
deploy_helper: path=/path/to/root state=query
N'oubliez pas de définir le paramètre 'release' lorsque vous appellerez réellement 'state=present' plus tard
- nom : Initialiser la racine de déploiement
deploy_helper: path=/path/to/root release={{ deploy_helper.new_release }} state=present
Tous les chemins peuvent être absolus ou relatifs (par rapport au paramètre 'path')
- deploy_helper: path=/path/to/root
releases_path=/var/www/project/releases
shared_path=/var/www/shared
current_path=/var/www/active
Utiliser votre propre stratégie de nommage pour les déploiements (un tag de version dans ce cas) :
- deploy_helper: path=/path/to/root release=v1.1.1 state=present
- deploy_helper: path=/path/to/root release={{ deploy_helper.new_release }} state=finalize
Utiliser un nom de fichier inachevé différent :
- deploy_helper: path=/path/to/root
unfinished_filename=README.md
release={{ deploy_helper.new_release }}
state=finalize
Reporter le nettoyage des anciennes constructions :
- deploy_helper: path=/path/to/root release={{ deploy_helper.new_release }} state=finalize clean=False
- deploy_helper: path=/path/to/root state=clean
Ou exécuter le nettoyage avant le nouveau déploiement
- deploy_helper: path=/path/to/root state=clean
- deploy_helper: path=/path/to/root state=present
Garder plus d'anciennes versions :
- deploy_helper: path=/path/to/root release={{ deploy_helper.new_release }} state=finalize keep_releases=10
Ou, si vous utilisez 'clean=false' lors de la finalisation :
- deploy_helper: path=/path/to/root state=clean keep_releases=10
Supprimer l'ensemble du dossier racine du projet
- deploy_helper: path=/path/to/root state=absent
Déboguer les informations retournées par le module
- deploy_helper: path=/path/to/root
- debug: var=deploy_helper
Licence
LGPL
Informations sur l'auteur
Ramon de la Fuente, ramon@delafuente.nl
ansible-galaxy install f500.project_deploy_module