GNU/Linux >> Tutoriales Linux >  >> Linux

5 consejos para configurar virtualenvs con Ansible Tower

Ansible se ejecuta en Python, y con Ansible Tower, Python también es el motor detrás del capó. Cuando trabajo con mis clientes, he visto algunas preguntas prácticas que parecen ser relativamente comunes. Este artículo proporciona algunos consejos para configurar y solucionar problemas de virtualenvs en un escenario de Ansible Tower.

1. ¿Qué es un entorno virtual?

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

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

Ansible Tower tiene dos entornos virtuales 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 no debe modificarse .

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

Alguien podría preguntar:si necesito agregar módulos de Python requeridos por mis playbooks de Ansible Tower, ¿debería agregarlos bajo el ansible predeterminado? entorno virtual?

Bueno, podrías.

Pero probablemente sea una mejor idea crear otra entorno virtual si:

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

2. Consejos para configurar un entorno virtual

Hay excelentes explicaciones y ejemplos en la documentación de Ansible Tower y Python sobre cómo configurar un entorno virtual.

Normalmente sigo la documentación de Ansible Tower cuando estoy creando un nuevo virtualenv, pero hay algunos temas que tiendo a pasar por alto (que luego terminan rascándome la cabeza y preguntando:"Hmm... ¿por qué esto no actúa como si estuviera esperando ?").

Permisos en los módulos de Python

Asegúrese de observar la recomendación para configurar umask 0022 , no solo cuando creas tu entorno virtual, pero también cuando agregas módulos de Python.

La razón de esto es que Ansible Tower se ejecuta como el usuario awx , por lo que este usuario debe poder leer los módulos de Python en el virtualenv.

Si los permisos no están configurados correctamente, sus plantillas/libros de jugadas pueden generar errores como el módulo XYZ no está instalado o el módulo XYZ no tiene atributo ABC cuando el problema es en realidad un problema de permiso simple.

[ Los lectores también disfrutaron: Cómo crear un libro de jugadas de Ansible ]

Instala Ansible en tu entorno virtual

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 ese 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

Nota :Si no especifica la versión, pip instala la última versión. Hay cambios de comportamiento entre Ansible 2.9 y Ansible 2.10, por lo que se recomienda consultar este documento antes de permitir la instalación de 2.10 o una versión más reciente.

Use Pip para enumerar los módulos de Python

Supongamos que desea crear una réplica de su virtualenv en otro entorno, o que tiene varios nodos de Ansible Tower y necesita replicar el virtualenv 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/plantillas de Tower

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

Para que Tower tenga conocimiento de los entornos virtuales adicionales, tiene dos opciones:

  1. Utilice las llamadas a la API REST como se describe en la documentación de Ansible Tower
  2. Use la interfaz web y vaya a AJUSTES -> SISTEMA :

Después de realizar uno de estos dos pasos, podrá seleccionar los nuevos entornos virtuales cuando trabaje con Organizaciones, Proyectos y Plantillas en Tower:

Nota :Asegúrese de que el usuario awx pueda leer el directorio virtualenv . Si no es así, Tower no mostrará el entorno virtual.

"Lo más importante a lo que hay que prestar atención es qué virtualenv está activo y qué binarios están usando sus playbooks".

4. Copia de seguridad y restauración de un virtualenv

Si realiza una copia de seguridad completa de Tower (usando setup.sh -b script), los entornos virtuales se respaldarán automáticamente allí y podrá restaurarlos con setup.sh -r ). Por supuesto, restaurar de esta manera significa que todo lo demás también será restaurado.

Si necesita hacer una copia de seguridad/restaurar el entorno virtual, siempre puede usar herramientas como tar hacer eso.

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

Asegúrese de que awx pueda leer la estructura de directorios restaurada. usuario para que Tower pueda reconocer el entorno virtual y enumerarlo en ENTORNO RESPONSABLE campo en Organizaciones, Proyectos y Plantillas.

Nota :En un escenario con Ansible Tower ejecutándose en OpenShift, las cosas son diferentes cuando se trata de entornos virtuales. Ese 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 está relacionada con la versión exacta de Python y Pip utilizada, o la versión que las herramientas veen. .

A veces necesita 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 activar virtualenv, verifique la versión:

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

(xyz) [admin@control my-envs]$ which python
/opt/my-envs/xyz/bin/python

(xyz) [admin@control my-envs]$ which python3
/opt/my-envs/xyz/bin/python3

(xyz) [admin@control my-envs]$ python -V
Python 3.6.8

(xyz) [admin@control my-envs]$ which pip
/opt/my-envs/xyz/bin/pip

(xyz) [admin@control 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, que es lo que debería esperar ver, a menos que tenga otras versiones en su ruta, y eso podría crear algunos problemas.

Esto es particularmente importante si haces tener otras versiones de Python en su servidor. A veces es posible que desee ejecutar el pip comando como el usuario raíz, y lo que la raíz ve como Python predeterminado 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 las plantillas que ejecute desde Tower no encontrarían el módulo.

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

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

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

Si aún ve errores como Ningún módulo llamado XYZ , verifique qué versión de Ansible está ejecutando desde la salida de la plantilla:

¿Coincide con la versión/ubicación que tiene en su virtualenv?

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

[ Una guía gratuita de Red Hat:5 pasos para automatizar su negocio. ] 

Resumir

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 lo que debe prestar atención es qué virtualenv está activo y qué binarios están usando sus libros de jugadas.


Linux
  1. 8 consejos para la línea de comandos de Linux

  2. 4 consejos para conectar a un familiar mayor con Linux

  3. Configuración de almacenamiento local en Linux con Stratis

  4. Comprender YAML para Ansible

  5. 6 habilidades de solución de problemas para los libros de jugadas de Ansible

Sugerencias para enumerar archivos con ls en la línea de comandos de Linux

5 consejos para mejorar la productividad con zsh

Consejos para usar tmux

Consejos para usar la pantalla

3 consejos para mejorar el rendimiento de los procesos de Linux con prioridad y afinidad

Establecer la opción de montaje para el punto de montaje dado con ansible