f500.project_deploy_module
Módulo de despliegue de proyectos (deploy_helper)
El módulo incluido es el módulo propuesto deploy_helper para ansible-modules-extra.
Explicación general, comenzando con un ejemplo de la estructura de carpetas para un proyecto:
raíz: lanzamientos: - 20140415234508 - 20140415235146 - 20140416082818
compartido:
- sesiones
- subidas
actual: -> lanzamientos/20140416082818
La carpeta 'lanzamientos' contiene todos los lanzamientos disponibles. Un lanzamiento es una compilación completa de la aplicación que se está desplegando. Esto puede ser un clon de un repositorio, por ejemplo, o una sincronización de una carpeta local en tu sistema. Tener carpetas con marcas de tiempo es una forma de tener lanzamientos distintos, pero puedes elegir tu propia estrategia como etiquetas de git o hashes de commit.
Durante un despliegue, se debe crear una nueva carpeta en la carpeta de lanzamientos y realizar cualquier paso de construcción requerido. Una vez que la nueva construcción esté lista, el procedimiento de despliegue se 'finaliza' reemplazando el enlace simbólico 'actual' con un enlace a esta construcción.
La carpeta 'compartido' alberga cualquier recurso que se comparte entre lanzamientos. Ejemplos de esto son los archivos de sesión del servidor web o archivos subidos por los usuarios de tu aplicación. Es bastante común tener enlaces simbólicos desde una carpeta de lanzamiento que apunten a una subcarpeta compartida, y la creación de estos enlaces se automatizaría como parte de los pasos de construcción.
El enlace simbólico 'actual' apunta a uno de los lanzamientos. Probablemente el más reciente, a menos que un despliegue esté en curso. La raíz del servidor web para el proyecto pasará a través de este enlace simbólico, por lo que el 'tiempo de inactividad' al cambiar a un nuevo lanzamiento se reduce al tiempo que toma cambiar el enlace.
Para distinguir entre compilaciones exitosas y las que están sin terminar, se puede colocar un archivo en la carpeta del lanzamiento que está en progreso. La existencia de este archivo lo marcará como sin terminar, y permitirá que un procedimiento automatizado lo elimine durante la limpieza.
Uso típico:
- nombre: Inicializar la raíz del despliegue y recoger datos
deploy_helper: path=/ruta/a/la/raíz
- nombre: Clonar el proyecto a la nueva carpeta de lanzamiento
git: repo=git://foosball.example.org/ruta/al/repo.git dest={{ deploy_helper.new_release_path }} version=v1.1.1
- nombre: Agregar un archivo sin terminar, para permitir la limpieza al finalizar con éxito
archivo: path={{ deploy_helper.new_release_path }}/{{ deploy_helper.unfinished_filename }} state=touch
- nombre: Realizar algunos pasos de construcción, como ejecutar tu gestor de dependencias
composer: comando=install working_dir={{ deploy_helper.new_release_path }}
- nombre: Crear algunas carpetas en la carpeta compartida
archivo: path='{{ deploy_helper.shared_path }}/{{ item }}' state=directory
con_items: ['sesiones', 'subidas']
- nombre: Agregar enlaces simbólicos desde el nuevo lanzamiento a la carpeta compartida
archivo: path='{{ deploy_helper.new_release_path }}/{{ item.path }}'
src='{{ deploy_helper.shared_path }}/{{ item.src }}'
state=link
con_items:
- { path: "app/sesiones", src: "sesiones" }
- { path: "web/subidas", src: "subidas" }
- nombre: Finalizar el despliegue, eliminando el archivo sin terminar y cambiando el enlace simbólico
deploy_helper: path=/ruta/a/la/raíz release={{ deploy_helper.new_release }} state=finalize
Recuperando datos antes de ejecutar un despliegue
- nombre: Ejecutar 'state=query' para recoger datos sin cambiar nada
deploy_helper: path=/ruta/a/la/raíz state=query
Recuerda establecer el parámetro 'release' cuando realmente llames a 'state=present' más tarde
- nombre: Inicializar la raíz del despliegue
deploy_helper: path=/ruta/a/la/raíz release={{ deploy_helper.new_release }} state=present
todas las rutas pueden ser absolutas o relativas (al parámetro 'path')
- deploy_helper: path=/ruta/a/la/raíz
releases_path=/var/www/proyecto/lanzamientos
shared_path=/var/www/compartido
current_path=/var/www/activo
Usando tu propia estrategia de nombrado para lanzamientos (una etiqueta de versión en este caso):
- deploy_helper: path=/ruta/a/la/raíz release=v1.1.1 state=present
- deploy_helper: path=/ruta/a/la/raíz release={{ deploy_helper.new_release }} state=finalize
Usando un nombre de archivo sin terminar diferente:
- deploy_helper: path=/ruta/a/la/raíz
unfinished_filename=README.md
release={{ deploy_helper.new_release }}
state=finalize
Posponiendo la limpieza de compilaciones más antiguas:
- deploy_helper: path=/ruta/a/la/raíz release={{ deploy_helper.new_release }} state=finalize clean=False
- deploy_helper: path=/ruta/a/la/raíz state=clean
O ejecutando la limpieza antes del nuevo despliegue
- deploy_helper: path=/ruta/a/la/raíz state=clean
- deploy_helper: path=/ruta/a/la/raíz state=present
Manteniendo más lanzamientos antiguos:
- deploy_helper: path=/ruta/a/la/raíz release={{ deploy_helper.new_release }} state=finalize keep_releases=10
O, si usas 'clean=false' en la finalización:
- deploy_helper: path=/ruta/a/la/raíz state=clean keep_releases=10
Eliminando toda la carpeta raíz del proyecto
- deploy_helper: path=/ruta/a/la/raíz state=absent
Depurando los datos devueltos por el módulo
- deploy_helper: path=/ruta/a/la/raíz
- debug: var=deploy_helper
Licencia
LGPL
Información del Autor
Ramon de la Fuente, ramon@delafuente.nl
ansible-galaxy install f500.project_deploy_module