Para empezar, deberemos tener instalados en la máquina los siguientes paquetes en sus correspondientes versiones.
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
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 npmpip install dockerpip 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
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 certsopenssl genrsa -out awx.keyopenssl req -new -key awx.key -out awx.csropenssl x509 -req -days 365 -in awx.csr -signkey awx.key -out awx.crtmv 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/bashcd /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.
exitdocker restart awx_web
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"]
}
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:/rutadocker 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
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.
- roles/image_build/templates/Dockerfile.j2
- roles/image_build/templates/Dockerfile.task.j2
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.
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.sqlpsql -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.