Deploy utilizando Ansible

En el siguiente apartado abordaremos los pasos necesarios para tener OMniLeads corriendo en entornos contenerizados bajo Podman.

Es requisito fundamental contar con una distribución de Linux con Podman instalado (3.0.0 or higher). En la actualidad, sistemas operativos modernos como Debian, Ubuntu, Rocky, o Alma Linux, tienen repositorios activados que permiten su descarga.

Nota: Si se trabaja sobre un VPS con una IP Pública, es mandatorio contar con una interface de red dedicada a una IP Privada.

Para ello procedemos a clonar el repositorio del Deploy Manager del proyecto y nos posicionamos en la carpeta de Ansible:

git clone https://gitlab.com/omnileads/omldeploytool.git
cd omldeploytool/ansible

Es importante destacar que el uso del Deploy Manager con Ansible nos permitirá múltiples acciones administrativas:

  • crear nuevas instancias

  • llevar adelante procesos de upgrades & rollbacks

  • llevar proceos de Disaster Recovery: backups & restores

  • administrar cientos de instancias de OMniLleads en paralelo, mediante archivos de inventario

Para cada instancia operativa, una colección de componentes es invocada mediante los servicios de SystemD, cada uno de ellos ejecutándose en un contenedor. También es posible agrupar dichos contenedores en instancias físicas separadas (cluster horizontal) y darles características de redundancia y disponibilidad (cluster HA).

Debajo se puede apreciar un bosquejo de la arquitectura basada en contenedores y sus componentes involucrados:

Bash Script y Ansible como piezas clave 📋

Una instancia de OMniLeads es desplegada en un Linux server utilizando SystemD y Podman, a partir de un Bash Script que se alimenta de variables de entorno y utiliza un set de archivos de Ansible para automatización (Playbooks + Templates).

Este bash script será el responsable de la ejecución de múltiples acciones sobre uno o más tenants al mismo tiempo. Básicamente, busca el archivo de inventario de acuerdo a la ubicación especificada en la línea de comando y a partir de allí lanza el Playbook "raíz" de Ansible (matrix.yml).

Ejecutando el siguiente comando, podemos interpretar sus posibles usos:

./deploy.sh --help

Si el objetivo es correr instalaciones, upgrades, backups o restores, se deben especificar 2 parametros fundamentales:

  • --action=

  • --tenant=

En el siguinte ejemplo, el script llevará a cabo una acción de instalación sobre la carpeta "tenant-folder", en cuyo interior contiene el archivo de inventario correspondiente con la descripción y parametrización de su/s tenant/s.

./deploy.sh --action=install --tenant=<tenant-folder>

Systemd & Podman para gestión de componentes 🔧

Bajo este método de instalación, contaremos con la posibilidad de manejar contenedores (componentes) como servicios tradicionales de SystemD.

systemctl start component
systemctl restart component
systemctl stop component

Detrás de cada acción disparada por el comando systemctl, un contenedor de Podman es lanzado, parado o reiniciado. Este contenedor es el resultado de una imágen invocada a partir de las variables de entorno configuradas en el deployment.

Debajo se expone un ejemplo, en el que observamos el archivo SystemD para el componente de Nginx: /etc/systemd/system/nginx.service:

[Unit]
Description=Podman container-oml-nginx-server.service
Documentation=man:podman-generate-systemd(1)
Wants=network-online.target
After=network-online.target
RequiresMountsFor=%t/containers

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=on-failure
TimeoutStopSec=70
ExecStartPre=/bin/rm -f %t/%n.ctr-id
ExecStart=/usr/bin/podman run \
  --cidfile=%t/%n.ctr-id \
  --cgroups=no-conmon \
  --sdnotify=conmon \
  --replace \
  --detach \
  --network=host \
  --env-file=/etc/default/nginx.env \
  --name=oml-nginx-server \
  --volume=/etc/omnileads/certs:/etc/omnileads/certs \
  --volume=django_static:/opt/omnileads/static \
  --volume=django_callrec_zip:/opt/omnileads/asterisk/var/spool/asterisk/monitor \
  --volume=nginx_logs:/var/log/nginx/ \
  --rm  \
  docker.io/omnileads/nginx:230215.01
ExecStop=/usr/bin/podman stop --ignore --cidfile=%t/%n.ctr-id
ExecStopPost=/usr/bin/podman rm -f --ignore --cidfile=%t/%n.ctr-id
Type=notify
NotifyAccess=all

[Install]
WantedBy=default.target

Nginx, a su vez, tendrá su archivo de variables de entorno definidas de la siguiente manera: /etc/default/nginx.env:

DJANGO_HOSTNAME=172.16.101.221
DAPHNE_HOSTNAME=172.16.101.221

KAMAILIO_HOSTNAME=localhost
WEBSOCKETS_HOSTNAME=172.16.101.221
ENV=prodenv

S3_ENDPOINT=http://172.16.101.221:9000

Pasemos a la acción!

Dependiendo de la estructura del archivo de inventario y de sus variables definidas, OMniLeads puede ser desplegado de manera remota en 3 esquemas posibles:

Última actualización