yourlabs.compose
Desplegando un docker-compose.yml en un servidor
Rol de Ansible para desplegar un docker-compose.yml en un directorio personal, se recomienda usarlo con bigsudo.
Este README describe las características, consulta TUTORIAL.md para un tutorial con patrones definidos para lograr eXtreme DevOps.
Ejemplo
Este rol se prueba a sí mismo y puedes comenzar copiando:
- Dockerfile: funcionará por defecto para un proyecto CRUDLFA+, ofreciendo servicio de archivos estáticos comprimidos y en caché, así como un spooler.
- .gitlab-ci.yml: construye y sube la imagen de docker al registro de imágenes de GitLab, proporciona una plantilla de trabajo de despliegue en formato YAML (macro), así como 3 configuraciones de despliegue de ejemplo para diferentes casos de uso.
- docker-compose.yml: para despliegues locales y efímeros.
- docker-compose.traefik.yml: para soporte de yourlabs.traefik.
- docker-compose.persist.yml: complemento para usar en despliegues persistentes, es decir, los especificados en .gitlab-ci.yml, requiere docker-compose.traefik.yml.
Necesitas cambiar:
- .gitlab-ci.yml: hay algunos comentarios
# DESCOMENTAR ARRIBA Y ELIMINAR ABAJO
, haz lo que dice para usar yourlabs/ansible. - ci.yourlabs.io con tu servidor en .gitlab-ci.yml.
- Variable de CI de Gitlab a establecer:
$CI_SSH_KEY
, debe contener una clave privada ed25519, puedes crear una con:ssh-keygen -t ed25519 -a 100
. - Dockerfile: cambia el argumento del comando
--module=wsgi:application
con la ruta adecuada a tu aplicación wsgi, elimina la configuración de bigsudo si lo deseas y descomenta lo que quieras.
¡Luego, puedes personalizar todo lo que quieras!
Otros comandos de bigsudo que puedes usar:
- habilitar un temporizador de respaldo de systemd con:
bigsudo yourlabs.compose backup home=/home/$CI_PROJECT_NAME-$CI_ENVIRONMENT_NAME
. - en el servidor de CI de revisión de despliegue, para eliminar imágenes, volúmenes y redes no utilizadas:
bigsudo yourlabs.docker prunecron @ci.your.host
, esto evita que los despliegues de revisión llenen el espacio en disco.
También puedes obtener una descripción más general y conceptual en el artículo del blog sobre eXtreme DevOps.
Documentación de características
El propósito de este rol es automatizar el despliegue de un merge de archivos docker-compose.yml en un directorio en un host, y automatizar tareas en torno a eso.
Desde un directorio con un archivo docker-compose.yml, puedes desplegarlo en $host:/home/staging
con el siguiente comando:
bigsudo yourlabs.compose home=/home/staging $user@$host
Si $user@$host
no está definido, entonces se ejecutará en localhost.
Puedes pasar varios archivos compose y las variables de entorno serán proxys cuando se genere el final:
FOO=bar bigsudo yourlabs.compose \
home=/home/staging \
compose_django_image=$YOUR_IMAGE \
compose=docker-compose.yml,docker-compose.staging.yml
Generación de directorios
Este rol también puede pre-crear directorios con un uid, gid y modo dados, con la etiqueta io.yourlabs.compose.mkdir
como tal:
volumes:
- "./log/admin:/app/log"
labels:
- "io.yourlabs.compose.mkdir=./app/log:1000:1000:0750"
Esto resultará en la creación del directorio {{ home }}/log/admin
con propietario 1000 y grupo 1000 y modo 0750.
Generación de entorno
Otra característica interesante es la provisión automática de entorno con cada variable declarada en el entorno del servicio que se define en tiempo de ejecución. Por ejemplo, con esto en docker-compose.yml:
environment:
- FOO
Luego, ejecutando el rol yourlabs.compose con la variable FOO definida así:
FOO=bar bigsudo yourlabs.compose home=/home/test
Resultará en el siguiente entorno:
environment:
- FOO=bar
Sobrescritura de YAML en la CLI
También puedes agregar o sobrescribir valores de servicio con la variable compose_servicename_keyname
. Ejemplo sobrescribiendo el valor compose[services][django][image]
sobre la marcha:
bigsudo yourlabs.compose home=/home/test compose_django_image=yourimage
Puedes vaciar valores sobre la marcha si lo deseas, simplemente pasa valores vacíos, es decir, para hacer que compose[services][django][build]
esté vacío pasa compose_django_build=
sin valor. En el caso de que no clones tu repo en el directorio personal, entonces docker-compose protestaría si no encuentra la ruta al Dockerfile, esto evita esa limitación:
bigsudo yourlabs.compose home=/home/test compose_django_build=
Automatización de red
Las redes también pueden ser un poco complicadas de gestionar con docker-compose, por ejemplo, típicamente tenemos una red web
con un balanceador de carga como traefik. Esto añade la red web
al servicio django, y se adjuntará automáticamente a la red si está presente declarando la red web
como externa en el archivo docker-compose.yml que despliega:
bigsudo yourlabs.compose home=/home/test compose_django_networks=web
Si estás haciendo el docker-compose.yml de tu balanceador de carga, entonces tienes el problema opuesto: docker-compose.yml declara una red web
como externa, pero docker-compose up no la creará y fallará así:
ERROR: Network web declared as external, but could not be found. Please create the network manually using `docker network create lol` and try again.
Este rol previene este problema parseando docker-compose.yml
para redes externas y usando el módulo ansible docker_network
para pre-crear en el host si es necesario.
Como rol de ansible
Finalmente, puedes usar este rol como cualquier otro rol de ansible, si deseas envolverlo en más tareas en tu repo:
- name: Asegurarse de que docker esté configurado una vez en este host
include_role: name=yourlabs.compose
vars:
home: /home/tu_cosa
compose_django_image: foobar
compose_django_build:
compose_django_networks:
- web
Copias de seguridad
Las copias de seguridad automatizadas están habilitadas para despliegues con un argumento home
. Configurará 3 scripts en /home:
- ./backup.sh: crea un volcado local y una copia de seguridad en restic.
- ./restore.sh: lista instantáneas de restic, ejecútalo con un hash de instantánea de restic como argumento para restaurar la instantánea.
- ./prune.sh: elimina copias de seguridad antiguas.
Creará 1 servicio systemd y un temporizador systemd:
- backup-PROJECTNAME.service
- backup-PROJECTNAME.timer
Hacking
Para desarrollar este rol en localhost:
# construye la imagen
docker build -t test .
# ejecuta bigsudo así:
bigsudo . home=/tmp/test compose_django_build= compose_django_image=test compose=docker-compose.yml,docker-compose.persist.yml
Ten en cuenta que siempre intentará ejecutar el script de copia de seguridad antes de actualizarlo. Si lo cambias, necesitas eliminar backup.sh antes de ejecutar yourlabs.compose nuevamente para que actualice backup.sh.
ansible-galaxy install yourlabs.compose