Buen dia Ansible fue mencionado repetidamente en Habré, pero no encontré artículos sobre cómo probar sus roles usando la molécula, sin embargo, encuentro este marco extremadamente conveniente y me gustaría compartirlo con la audiencia de Habr.
Pero primero, un poco sobre lo que usé antes.
Anteriormente, para probar los roles ansibles que creo, utilicé vagabundo, conduciendo directamente:
$ vagrant init debian/jessie64 $ vagrant up
Creando máquinas virtuales, después de lo cual escribí un inventario y un libro de jugadas para lanzar el papel, hasta que un día conocí la molécula.
¿Qué puede ofrecer la molécula?
- Inicialización de rol inicial
- Conductor / proveedor
- Pruebas de idempotencia
- Verificación
Inicialización de rol inicial
Si se especifica un nuevo rol, crea una estructura de muestra para el rol ansible
Conductor / proveedor
Molecule nos permite usar un contenedor Docker o una máquina virtual como conejillo de indias usando Vagrant, esto se determina indicando el controlador durante la inicialización, o en molécula.yml. Porque Si tengo que probar los roles de orquestar contenedores, entonces Vagrant sigue siendo el controlador preferido para mí. Elegir Vagrant como controlador también le permite seleccionar un proveedor.
Los siguientes están disponibles:
- Libvirt
- Paralelos
- VirtualBox (predeterminado)
- VMware Fusion
A continuación, consideraremos una variante de Vagrant con VirtualBox como proveedor.
Pruebas de idempotencia
De acuerdo con la wiki:
La propiedad de un objeto u operación cuando se aplica la operación al objeto nuevamente da el mismo resultado que cuando es individual.
En relación con los roles ansibles, cuando se reinicia el rol, no se deben realizar cambios.
Verificación
Para asegurarse de que el rol funcionó correctamente, no fallar ninguna de las tareas no es suficiente. Después de todo, debe verificar que los servicios hayan comenzado, que los puertos estén abiertos, etc.
Los siguientes marcos están disponibles para verificación:
- Goss
- Serverspec
- Testinfra (predeterminado)
He sido probado por Goss y Testinfra. Para mí, elegí Testinfra.
Ejemplo de uso:
$ molecule init --role sample-role
Después de ejecutar este comando, obtenemos un directorio de roles de muestra con una estructura de roles típica ansible y los archivos yaml necesarios:
defaults handlers meta molecule.yml // - molecule playbook.yml // README.md tasks tests // vars
Puede comenzar sin especificar el conmutador --role, en este caso los archivos molécula.yml y playbook.yml se crearán en el directorio actual.
Sucede que debe asegurarse de que el rol funcione en varias distribuciones en este caso, en molecyle.yml, vale la pena especificar los nombres de los cuadros vagabundos (en plataformas):
vagrant: platforms: - name: jessie64 box: debian/jessie64 - name: centos7 box: centos/7
Luego, agregue las acciones / variables necesarias, etc. en el papel, después de lo cual probamos en todas las plataformas específicas:
$ molecule test --platform all
Después de esta molécula:
- si ya hay máquinas virtuales creadas, se detendrá y las eliminará
- elevará las máquinas virtuales necesarias
- prueba nuestro papel con ansible-lint
- cumplir con nuestro rol en contenedores recién creados
- probará la idempotencia
- ejecutar pruebas testinfra
- eliminará las máquinas virtuales creadas
Es posible que deba cambiar el comportamiento de la molécula cuando ejecute la prueba, por ejemplo, no pruebe la idempotencia, para esto, agregue lo siguiente a molécula.yml:
molecule: test: sequence: - destroy - syntax - create - converge - verify - destroy
También puede llamar a cada uno de los pasos correspondientes por separado utilizando el comando apropiado, por ejemplo:
$ molecule create --platform all $ molecule syntax $ molecule create $ molecule converge $ molecule verify
Como una opción, no elimine / cree una nueva máquina virtual antes de cada convergencia.
Puede especificar una plataforma específica y probarla por separado:
$ molecule create --platform jessie64 $ molecule syntax $ molecule create $ molecule converge $ molecule verify
Gracias por su atencion!