5 consejos para configurar entornos virtuales con Ansible Tower

Ansible se ejecuta en Python, y con Ansible Tower, Python también es el motor detrás del capó. Al trabajar con mis clientes, he visto problemas prácticos que parecen relativamente comunes. Este artículo proporciona algunos consejos para configurar y solucionar problemas de entornos virtuales en un escenario de torre de Ansible.

Índice

1. ¿Qué es un entorno virtual?

Un Python es básicamente un directorio creado con el virtualenv (que, como puedes adivinar, es un script de Python).

Una vez que este virtualenv está "habilitado", puede agregarle módulos específicos de Python y tener un entorno aislado para experimentar y desarrollar sin afectar sus scripts y playbooks principales de Python/Ansible.

Ansible Tower tiene dos virtualenvs en el directorio predeterminado: awx y ansible.

El primero es : /var/lib/awx/venv/awx. el awx virtualenv es para uso exclusivo de Ansible Tower y.

El otro virtualenv es: /var/lib/awx/venv/ansible. Este entorno virtual es lo que usa Tower para ejecutar los modelos (libros de jugadas).

Alguien podría preguntar: si necesito agregar algún módulo de Python requerido por mis playbooks de Ansible Tower, ¿debería agregarlos de forma predeterminada? ansible ¿ambiente virtual?

Bueno, podrías.

Pero probablemente sea una mejor idea crear virtualenv si:

  1. Desea mantener el virtualenv predeterminado como un entorno de desarrollo estable y desea experimentar con nuevos módulos en otro virtualenv.
  2. Tiene diferentes grupos de desarrolladores trabajando en varios proyectos que requieren módulos específicos de Python/Ansible.

2. Consejos para configurar un virtualenv

Hay excelentes explicaciones y ejemplos en el Torre Ansible y Pitón documentación sobre cómo configurar un virtualenv.

normalmente soy el Documentación de Ansible Tour cuando creo un nuevo virtualenv, pero hay algunos temas que tiendo a pasar por alto (lo que luego termina rascándome la cabeza y preguntando: "Hmm... ¿por qué esto no actúa de la manera que esperaba?").

Permisos en módulos de Python

Asegúrate de seguir la recomendación de pago umask 0022, no solo cuando usa su virtualenv, sino también cuando le agrega módulos de Python.

El motivo es que Ansible Tower se está ejecutando como usuario awx, por lo tanto, este usuario debe poder usar los módulos de Python en virtualenv.

Si los permisos no están configurados correctamente, sus modelos/libros de jugadas pueden generar errores como o cuando el problema es en realidad un problema de permiso simple.

Instala Ansible en tu virtualenv

Los libros de jugadas que desea ejecutar con virtualenv necesitarán sus módulos de Python específicos instalados en su virtualenv. Tiene sentido que el motor Ansible también se ejecute desde este entorno virtual.

Puede usar el siguiente comando para instalar una versión específica de Ansible:

sudo /opt/my-envs/xyz/bin/pip install ansible==2.9.15

Notar: Si no especifica la versión, pip instalar la última versión. Hay cambios de comportamiento entre Ansible 2.9 y Ansible 2.10, por lo que se recomienda verificar esto Doc antes de autorizar la instalación de la 2.10 o una versión más reciente.

Use Pip para enumerar los módulos de Python

Suponga que desea crear una réplica de su entorno virtual en otro entorno, o que tiene varios nodos de Ansible Tower y necesita replicar el entorno virtual en todos los nodos. Para capturar la lista de módulos para comparación o documentación, puede usar:

pip list > pip_list.txt

head -5 /tmp/pip_list.txt
Package       Version
------------- ---------
ansible       2.9.15
certifi       2020.12.5
cffi          1.14.4

También puede generar una lista en un formato que permita la instalación de las mismas versiones del módulo en otro lugar:

pip freeze > /tmp/pip_freeze.txt 

head -3 /tmp/pip_freeze.txt
ansible==2.9.15
certifi==2020.12.5
cffi==1.14.4

Luego puede usar este archivo congelado para instalar los mismos módulos con exactamente las mismas versiones usando:

sudo /opt/my-envs/xyz/bin/pip install -r pip_freeze.txt

3. Hacer que virtualenvs esté disponible en proyectos/modelos de torres

De forma predeterminada, Ansible Tower solo conoce sus propios entornos virtuales.

Para notificar a Tower sobre virtualenvs adicionales, tiene dos opciones:

  1. Use las llamadas a la API REST como se describe en Documentación de Ansible Tour
  2. Use la interfaz web y navegue hasta PARÁMETROS -> SISTEMA:
Interfaz de Ansible Tower que muestra una ruta de entorno personalizada

Después de realizar cualquiera de estos dos pasos, podrá seleccionar los nuevos entornos virtuales cuando trabaje con organizaciones, proyectos y modelos en Tower:

Interfaz de Ansible Tower que muestra los entornos de Ansible disponibles

Notar: Asegúrese de que el usuario pueda leer el directorio virtualenv awx. De lo contrario, Tower no mostrará el archivo virtualenv.

“Lo más importante a tener en cuenta es saber qué virtualenv está activo y qué binarios están usando sus libros de jugadas. "

4. Hacer una copia de seguridad y restaurar un virtualenv

Si realiza una copia de seguridad completa de la torre (usando el setup.sh -b script), los virtualenvs se guardarán automáticamente allí y puede restaurarlos con setup.sh -r). Por supuesto, restaurar de esta manera significa que también será restaurado.

Si necesita hacer una copia de seguridad/restaurar el virtualenv, siempre puede usar herramientas como tar para hacer esto.

Además, si ha grabado la salida de su pip freeze comando, puede recrear la estructura del directorio y usar el pip install ordenar con el -r argumento como se muestra arriba.

Asegúrese de que la estructura de directorios restaurada sea legible por el awx usuario para que Tower pueda reconocer el virtualenv y enumerarlo bajo el MEDIO AMBIENTE RESPONSABLE en Organizaciones, Proyectos y Modelos.

Notar: En un escenario con Ansible Tower ejecutándose en OpenShift, las cosas son diferentes cuando se trata de virtualenvs. Este es un tema para otro artículo.

5. Solución de problemas de versiones

¿Qué versión de Python estás usando?

Una fuente de problemas potenciales es la versión exacta de Python y Pip que se utiliza, o la versión de las herramientas.

A veces tiene que usar la línea de comando para instalar/verificar módulos de Python, por lo que siempre es bueno verificar qué versión de Python está usando.

Por ejemplo, después de habilitar virtualenv, verifique la versión:

source /opt/my-envs/xyz/bin/activate

(xyz) [[email protected] my-envs]$ which python
/opt/my-envs/xyz/bin/python

(xyz) [[email protected] my-envs]$ which python3
/opt/my-envs/xyz/bin/python3

(xyz) [[email protected] my-envs]$ python -V
Python 3.6.8

(xyz) [[email protected] my-envs]$ which pip
/opt/my-envs/xyz/bin/pip

(xyz) [[email protected] my-envs]$ pip3 -V
pip 20.2.4 from /opt/my-envs/xyz/lib/python3.6/site-packages/pip (python 3.6)

Como puede ver en el ejemplo anterior, después de la activación, todos los comandos apuntan a rutas en mi virtualenv, lo que debe esperar, a menos que tenga otras versiones en su ruta, y podría causar problemas.

Esto es especialmente importante si tiene otras versiones de Python en su servidor. A veces es posible que desee ejecutar el pip como usuario raíz, y lo que la raíz ve como Python de forma predeterminada puede no ser lo que ve su cuenta no raíz. Esto haría que el módulo se instalara en el entorno de Python incorrecto y los modelos que ejecuta desde Tower no encontrarían el módulo.

en lugar de correr sudo pip install module-name, use la ruta completa para pip para evitar este problema. Usando mi escenario anterior como ejemplo, este sería:

sudo /opt/my-envs/xyz/bin/pip install module-name

¿Qué versión de Ansible estás usando?

Si aún ve errores como, verifique la versión de Ansible que está ejecutando desde la salida del modelo:

Interfaz de Ansible Tower que muestra la ubicación del módulo Python, incluida la versión 3.6 de Python

¿Coincide con la versión/ubicación que tienes en tu virtualenv?

No necesita instalar Ansible en su virtualenv, pero tenga en cuenta que si los playbooks de Ansible se ejecutan en una instancia diferente de Ansible, es posible que no vea los módulos de Python instalados en su virtualenv.

Conclusión

Virtualenvs es una excelente manera de crear escenarios aislados donde puede experimentar con diferentes módulos de Python/Ansible sin interferir con otros módulos instalados. Los entornos virtuales son fáciles de recrear desde cero. Lo más importante a tener en cuenta es saber qué virtualenv está activo y qué binarios están usando sus libros de jugadas.

Artículos de interés

Subir