Armado automático del ambiente

Para el armado automático del ambiente se proveen playbooks de Ansible, un software open-source para la automatizacón del aprovisionamiento y configuración de infraestructura y aplicaciones. Ansible se puede ejecutar desde Linux o Mac. En Windows se puede usar Linux Subsystem, aunque no está oficialmente soportado. Puede consultar más información en la documentación de Ansible.

Las tareas fueron programadas y probadas en Ansible 2.9 para los sistemas operativos Ubuntu Server 18, Debian 10 y CentOS/RedHat 7. En los tres casos se asume que partimos de una instalación limpia del sistema operativo. Para otros sistemas o versiones pueden ser necesarios ajustes en las tareas.

Los playbooks están disponibles en el directorio ansible del repositorio del proyecto. Todos los comandos especificados en esta guía se corren desde este directorio.

Los pasos a ejecutar son los siguientes:

  1. Clonar repositorio
  2. Prerrequisitos
  3. Aprovisionamiento del ambiente
  4. Playbooks adicionales
  5. Problemas y ajustes conocidos
  6. Configuración inicial
  7. Reverse Proxy

1. Clonar repositorio

Antes de comenzar, si ya no lo hizo, clone el repositorio git del Sistema de Elecciones siguiendo los siguientes pasos:

  1. Instalar git:
    Ubuntu / Debian: sudo apt-get install git
    CentOS / RedHat: sudo yum install git

  2. Cree un directorio y desde ahí clone el repositorio:
    git clone https://github.com/LACNIC/elections-open-source

Todos los comandos Ansible en esta guía (creación de vault, ejecución de playbooks, etc) se ejecutan desde el directorio ansible del repositorio clonado.

2. Prerrequisitos

Antes de ejecutar los playbooks Ansible se requieren algunos pasos de configuración.


  1. Instalación de Ansible

    En el Control node (máquina desde la que se ejecutan las tareas Ansible) es necesario instalar Ansible. El procedimiento de instalación dependerá del sistema operativo, por lo general se instala directamente con el gestor de paquetes del sistema (yum install ansible en CentOS/RedHat, apt install ansible en Ubuntu/Debian).

    El Managed node (servidor al que se le aplican las configuraciones definidas en las tareas Ansible) debe tener Python instalado. También se instala directamente con el gestor de paquetes del sistema (yum install python en CentOS/RedHat, apt install python en Ubuntu/Debian).

    Puede encontrar información detallada en la documentación de instalación de Ansible.


  2. Inventario de hosts

    En el archivo hosts se define el inventario de servidores de Ansible. Agregue aquí su servidor o edite alguna de las entradas ya existentes. El formato es el siguiente:

    [alias]
    <hostname o IP>

    Al momento de ejecutar tareas Ansible, se usa el alias para especificar en qué servidor aplicar las configuraciones.


  3. Acceso SSH al servidor y permisos

    Ansible usa SSH para acceder al servidor y ejecutar las tareas. Para esto es necesario tener un usuario con permisos sudo en el Managed node. Se puede usar autenticación con usuario/contraseña o con par de claves pública/privada. La opción elegida se especifica al momento de correr las tareas, como se verá más adelante.


  4. Crear vault Ansible

    Como parte de la instalación, se crea un usuario de base de datos para la aplicación. La contraseña para este usuario se define y encripta en un vault de Ansible. Para crear el vault, ejecute el siguiente comando:

    ansible-vault create pass-vault.yaml

    Se pide una contraseña para el vault y luego se puede editar el contenido, agregar la siguiente línea:

    postgres_password: <contraseña>

    En cualquier otro momento puede ver o editar el contenido del vault con los comandos ansible-vault view pass-vault.yaml y ansible-vault edit pass-vault.yaml, respectivamente.

3. Playbook de aprovisionamiento

  1. Descripción

    Una vez completados los prerrequisitos, ya se pueden ejecutar tareas. En Ansible, las tareas se agrupan en playbooks. El playbook install.yaml instala y configura todo lo necesario para levantar el sistema:

    • Crea usuarios en el sistema para WildFly y PostgreSQL.
    • Instala Java 8, PostgreSQL 12 y WildFly 20. Configura PostgreSQL y WildFly como servicios en el sistema.
    • Crea la base de datos, importa un dump incial y configura permisos.
    • Configura módulos requeridos, driver de BD y datasource en WildFly.
    • Publica los artefactos del sistema.

  2. Ejecución

    Para ejecutar un playbook se usa el comando ansible-playbook <playbook> con los siguientes parámetros:

    • -i <inventario>: archivo inventario de servidores.
    • -l <servidor>: alias del servidor en el que ejecutar las tareas.
    • -u <usuario>: usuario para acceder al servidor por SSH.
    • --ask-become-pass: indica que el password para sudo se ingresará por consola.
    • Según si la autenticación es con usuario/contraseña o par de claves, incluir, respectivamente:
      • --ask-pass: indica que se ingresará la contraseña para el usuario por consola.
      • --private-key /ruta/a/clave/privada: indica que se usará la clave privada para la autenticación.

    Así, por ejemplo, este es el comando para ejecutar la instalación completa del ambiente en el servidor definido en el inventario hosts con alias test, usando el usuario user con clave privada para la autenticación SSH:

    ansible-playbook install.yaml -i hosts -l test -u user --ask-become-pass --private-key /home/user/userprivkey


Finalizada la ejecución del playbook, el sistema ya está operativo y accesible en http://<ip-servidor>:8080/elections.

4. Playbooks adicionales

Hay 2 playbooks adicionales disponibles:

  • Deploy de los artefactos del Sistema: deploy.yaml:

    Publica los artefactos del sistema que se encuentran en ansible/roles/elections/files/deployments.

  • Restore de dump de base de datos: restore-dump.yaml:

    Borra la base de datos actual y levanta el dump que se encuentra en ansible/roles/elections/files/db/elections.zip.

Para ejecutar estos playbooks se usa el comando ansible-playbook como se detalla en la sección anterior, cambiando el nombre del playbook a ejecutar.

5. Posibles ajustes necesarios

Para sistemas operativos o versiones de los sistemas operativos diferentes a las especificadas en esta guía, es posible usar estos mismos playbooks con algunos ajustes. Esta sección se actualiza periódicamente con casos encontrados:

  • Repositorio PosgreSQL (en archivo de tareas 03-postgres.yaml):
    Para instalar el repositorio de PostgreSQL, se debe especificar la versión del sistema. Para Ubuntu/Debian, se usa el codename de la versión (ej. bionic para Ubuntu 18, buster para Debian 10). Para CentOS/RedHat, el número de versión.
  • Repositorio AdoptOpenJDK (en archivo de tareas 02-global.yaml):
    Este caso aplica sólo para Debian. De la misma forma que con PosgreSQL, se usa el codename de la versión para instalar el repo AdoptOpenJDK.

6. Configuración inicial

Antes de comenzar a usar el sistema, son necesarias algunas tareas iniciales de configuración.

Estas tareas se detallan en el siguiente documento.

7. Reverse proxy

Luego de completar la instalación, el sistema es accesible directamente contra el servidor de aplicaciones. Para un ambiente de desarrollo o testeo esto no es un problema, pero para ambientes de producción se recomienda la instalación y configuración de un servidor web (por ej. Apache o Nginx) que actúe como reverse proxy.

Las ventajas de usar reverse proxy son muchas: evitar el acceso directo contra el sevidor de backend, cache y compresión de contenidos, logging HTTP, etc.