Manual de Instalación y Configuración para Ansible-AWX.

Índice de Contenidos

  1. Requisitos.
  2. Contenedores Docker.
  3. Instalación.
  4. Configuración SSL.
  5. Problemas Encontrados.
  6. Comandos Útiles.
  7. Directivas.
  8. Backups.

Requisitos.

Para empezar, deberemos tener instalados en la máquina los siguientes paquetes en sus correspondientes versiones.

Contenedores Docker.

Para el despliegue de AWX se utilizarán contenedores docker. Aunque también se puede hacer sin contenedores pero es mas laborioso.
Al ejecutar el instalador de AWX, se generan 5 contenedores:

Contenedor encargado de ejecutar las tareas y llevarlas a cabo.

awx_task

Contenedor encargado de la interfaz web, que posee un servidor web.

awx_web

Contenedor dedicado a la cola de mensajería para el envío de mensajes entre servicios de distintos contenedores.

awx_rabbitmq

Contenedor dedicado a almacenar datos de awx en memoria cache para su rápido acceso.

awx_memcached

Contenedor encargado de la gestión de la base de datos, la cual es utilizada por el contenedor awx_task.

awx_postgres

Instalación.

Para empezar, instalaremos los paquetes necesarios. Los nombres de estos paquetes son específicos de ubuntu.
Si usáis otra distribución deberéis buscar sus correspondientes paquetes.

apt install ansible docker.io python-pip make git nodejs npm
pip install docker
pip install docker-compose

Ahora debemos actualizar el paquete npm, debido a que es el único paquete que no cumple con los requisitos de versión de AWX.

npm install -g npm@latest

Después descargaremos la última versión de AWX desde GitHub.

git clone https://github.com/ansible/awx.git /tmp/awx

Accedemos al directorio /tmp/awx/installer.

cd /tmp/awx/installer

Ahora tendremos que editar el fichero inventory.
En este fichero hay definidas varias directivas que podemos configurar.
Están explicadas aquí.

Una vez editado el fichero, ejecutaremos el despliegue de AWX.
Con esto ya tendremos acceso a la interfaz web.

ansible-playbook -i inventory install.yml

Configuración SSL.

Si hemos establecido el puerto de awx al 443 (SSL), deberemos realizar unos pasos posteriores.

Generamos el CSR, el certificado y la clave para firmar el certificado.

mkdir certs
openssl genrsa -out awx.key
openssl req -new -key awx.key -out awx.csr
openssl x509 -req -days 365 -in awx.csr -signkey awx.key -out awx.crt
mv awx.* certs/

Copiamos el directorio certs a /etc/nginx/ en el contenedor awx_web.

docker cp ./certs awx_web:/etc/nginx/

Nos conectamos al contenedor awx_web y accedemos al directorio /etc/nginx/.

docker exec -it awx_web /bin/bash
cd /etc/nginx

Después editamos el fichero nginx.conf y nos aseguramos que estén definidas estas directivas dentro del bloque "server".

ssl_certificate /etc/nginx/certs/awx.crt;
ssl_certificate_key /etc/nginx/certs/awx.key;
ssl on;

Por último, salimos del contenedor awx_web y lo reiniciamos.
Con esto ya tendremos acceso a la interfaz web por SSL.

exit
docker restart awx_web

Problemas Encontrados.

Resolución de nombres cortos.

Por defecto, los contenedores desplegados cogen la configuración de red del docker daemon que se ejecuta en el anfitrión a no ser que le especifiquemos en el docker-compose file de los contenedores, una configuración de red propia.
La opción "ndots" viene establecida por defecto a 0 en el docker daemon, por lo que no podremos realizar resoluciones de nombres cortos.
Debemos establecer la opción a un valor mayor de 0, los usuarios suelen establecerla a 15 que es el máximo. Para ello modificamos el fichero "/etc/docker/daemon.json" y añadimos la directiva correspondiente.
Podemos establecer más directivas separadas por comas.

{
   "dns-opts": ["ndots:15"]
}

Comandos Útiles.

Aquí dejo una lista de comandos útiles para la gestion de awx y nuestros contenedores.

Comando para ver los contenedores que están arrancados actualmente.

docker ps

Comando para ver todos los contenedores, (incluso los que están parados).

docker container ls -a

Comando para iniciar/parar/reiniciar un contenedor.

docker start/stop/restart contenedor

Comando para copiar ficheros a o desde un contenedor.

docker cp /rutaLocal contenedor:/ruta
docker cp contenedor:/ruta /rutaLocal

Acceder a un contenedor iniciando una shell.

docker exec -it contenedor /bin/bash

Ejecutar un comando en un contenedor desde la máquina anfitriona.

docker exec contenedor comando

Comando para eliminar contenedores y sus datos correspondientes.

docker rm contenedor

Comando para importar nuestros inventarios de ansible a AWX.
Debemos crear primero un inventario en el interfaz web, para decir posteriormente en el comando, el inventario destino donde se efectuará la importación.

awx-manage inventory_import --source=/ruta_inventario --inventory-name=nombre_del_inventario_destino --overwrite

Directivas.

dockerhub_base

Esta directiva se usa para descargar las imágenes oficiales ya construidas, para generar los contenedores docker. Si esta directiva no está presente, las imágenes de los contenedores awx_web y awx_task se construirán a partir de estos ficheros.

postgres_data_dir

Esta directiva indica el directorio donde se almacenarán datos relevantes a la base de datos de PostgreSQL. Debe de definirse en una ruta persistente.

docker_compose_dir

Indica la ruta donde se exportarán datos relevantes a la configuración que hemos definido, como las variables de entorno, la clave secreta, las credenciales y puerto de escucha de la base de datos, etc. Esta directiva no es obligatorio que esté en una ruta persistente, dado que estos ficheros se copian a los contenedores en el proceso de instalación.

host_port

Indica el puerto por el que va a escuchar el servidor web.
Si queremos tener una capa SSl deberemos usar el puerto seguro.

ssl_certificate

Se usa para establecer la ruta del certificado SSL en el fichero de configuración del servidor web dentro del contenedor awx_web.

pg_username

Se utiliza para establecer el nombre del usuario que va a tener acceso a la base de datos de PostgreSQL.

pg_password

Contraseña para el usuario con acceso a la base de datos.

pg_port

Puerto en el que escucha la base de datos.

admin_user

Nombre para el usuario administrador que accederá a la interfaz web de AWX.

admin_password

Contraseña para el usuario administrador que accederá a la interfaz web de AWX.

secret_key

Clave secreta para AWX.

project_data_dir

Ruta donde se almacenarán todos los proyectos creados manualmente o desde AWX.

Backups.

Tenemos dos formas efectivas de realizar un backup completo de AWX.

La primera es exportar e importar la base de datos llamada awx dentro del contenedor awx_postgres.

psql -U awx awx > awx.sql
psql -U awx awx < awx.sql

Cabe destacar que para importar el fichero sql a la base de datos, esta debe estar vacía, si no dará errores de tablas, constrains, etc, ya existentes.
Para poder eliminar los datos de la base de datos, debemos parar los demás contenedores debido a que estos están usando la base de datos en todo momento.

La segunda forma es haciendo un backup del directorio pgdocker y restaurando esa copia en la ruta definida previamente en la variable postgres_data_dir del fichero inventory en el despliegue de AWX.

cp -r /var/lib/pgdocker/ /backups/pgdocker-backup/
cp -r /backups/pgdocker-backup/ /var/lib/pgdocker/

Este directorio es el que usa el contenedor awx_postgres para almacenar sus datos.