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.

Acerca del proyecto

Deploy a docker-compose.yml in a target directory

Instalar
ansible-galaxy install yourlabs.compose
Licencia
Unknown
Descargas
4k
Propietario
OSS Hack'n'Dev, we provide all kind of paid services on OSS and sponsor OSS