drpsychick.ansible_testing

Pruebas de Ansible

Estado del Build licencia Paypal Patrocinio en GitHub

Crea contenedores de Docker completamente funcionales con SystemD que puedes usar para probar tus roles de Ansible. Con libvirt, también puedes aprovisionar automáticamente máquinas virtuales de Windows para probar tus roles con WinRM. Está diseñado para ejecutarse localmente en una máquina Linux con Docker (y opcionalmente libvirt) instalado.

Configuración

Consulta defaults/main.yml para ver cómo definir los contenedores y ajustarlos a tus necesidades.

  • Define tu propio work_dir. ¡El contenido es temporal y se eliminará con destroy!
  • Define los contenedores que deseas iniciar.

Lo que hace (en resumen)

Este rol tiene tareas de create y destroy para contenedores y máquinas virtuales. Recorre las listas configuradas (containers o virtual_machines en vars.yml) y crea las instancias según sea necesario. Cada escenario de Molecule debe usar contenedores o máquinas virtuales, ya que Molecule solo admite un único controlador por escenario.

Linux: Crea contenedores de Docker privilegiados que se inician con /sbin/init para tener una instancia totalmente capaz de SystemD.

Windows: Crea la VM (instalación desatendida de Windows) y configura WinRM para Ansible (HTTP simple) en el primer inicio.

Consejo: Crear VMs de Windows es costoso y tarda más de 10 minutos.

Contribuir

Si tienes otros sistemas que deseas probar, no dudes en proporcionar un PR con Dockerfiles adicionales o configuración de libvirt.

Contribuir es muy fácil:

  1. Haz un fork del proyecto en GitHub : https://github.com/DrPsychick/ansible-testing
  2. Clona el fork en tu máquina Linux
  3. Crea un enlace simbólico del fork en tu escenario de roles de Molecule (por ejemplo, ./molecule/default/)
  4. Haz cambios y prueba tu rol hasta que estés satisfecho - haz commit y crea un pull-request
  5. Puedes ejecutar GitHub Actions localmente para obtener retroalimentación rápida con act: https://nektosact.com/installation/index.html
GitHubName=TuNombre
YourRoleDir=/Esta/Es/La/Dirección/De/Tu/Rol/MiRol
YourRoleName=MiRol
WhereYourForkIs=/Esta/Es/La/Ubicación/Donde/Clonas/El/Fork

# clona tu fork
cd $WhereYourForkIs
git clone https://github.com/$GitHubName/ansible-testing.git

# crea un enlace simbólico de tu versión local en tu escenario de molecule
cd $YourRoleDir/molecule/default
ln -s $WhereYourForkIs/ansible-testing drpsychick.ansible_testing

# comenta el rol en los requisitos y elimina la versión descargada
sed -i -e 's/^ /# /' requirements.yml
rm -rf ~/.cache/molecule/$YourRoleName/default/roles/drpsychick.ansible_testing

Ahora, cuando ejecutas molecule usará el enlace simbólico para incluir el rol drpsychick.ansible_testing. Haz tus cambios, haz commits regularmente y cuando termines, no olvides crear un pull-request para que otros también puedan beneficiarse de tus mejoras. Además, puedes probar el rol en sí con Molecule: solo ejecuta molecule test en tu directorio de fork local.

Uso

Requisitos:

  • Linux (ya que inicia contenedores en modo privileged y enlaza /sys/fs/cgroup)
  • Docker
  • libvirt (para máquinas virtuales de Windows)

Pruebas con contenedores de Docker (Linux)

Requisitos

  • pip3 install -U molecule molecule-docker

Con Ansible molecule

Crea un nuevo rol con molecule init role <nombre> o inicializa el escenario de Molecule en un directorio de rol existente con molecule init scenario default.

Descarga los archivos de ejemplo de este repositorio que usan este rol (en create y destroy):

for f in create destroy molecule requirements vars; do
  curl -o molecule/default/$f.yml https://raw.githubusercontent.com/DrPsychick/ansible-testing/main/docs/molecule/default/$f.yml
done

Ajusta el molecule/default/vars.yml para definir qué contenedores aprovisionar. Luego ajusta las platforms en molecule/default/molecule.yml según corresponda.

vars.yml

work_dir: "/tmp/ansible-testrole-default"
containers:
  - { name: fedora40, os: fedora, dockerfile: Dockerfile_Fedora, files: ["entrypoint.sh"], args: { VERSION: 40 } }
  - { name: ubuntu2404, os: ubuntu, dockerfile: Dockerfile_Ubuntu, files: ["entrypoint.sh"], args: { VERSION: 24.04 } }
  - { name: centos7, os: centos, dockerfile: Dockerfile_CentOS, files: ["entrypoint.sh"], args: { VERSION: 7 } }

molecule.yml

[...]
platforms:
  - name: fedora40
  - name: ubuntu2404
  - name: centos7
[...]

Ejecuta molecule

# pasos por separado
molecule dependency
molecule create
molecule prepare
molecule converge
molecule idempotence
molecule verify
molecule cleanup
molecule destroy

# o todo de una vez
molecule test

Independiente

Escribe tu propio playbook o usa los playbooks en tests

ansible-galaxy install -r requirements.yml

# edita tests/provision.yml según tus necesidades
echo "[defaults]
roles_path = .." > ansible.cfg

# crea contenedores
ansible-playbook tests/create.yml

# destruye contenedores
ansible-playbook tests/destroy.yml

Pruebas con VMs de Windows

Requisitos

  • instala libvirt, libvirt-clients, virtinst
  • ansible-galaxy community.libvirt
  • para que Ansible se conecte con WinRM: python3-winrm
  • consulta defaults/main.yml
    • Descarga la imagen de Windows de tu elección (la prueba está configurada para Windows 2016)
    • Descarga el ISO de VirtIO
    • Coloca ambos ISOs en el libvirt_iso_dir
# descarga los ISOs
sudo curl -Lo /var/lib/libvirt/isos/WindowsServer2016.iso http://care.dlservice.microsoft.com/dl/download/1/6/F/16FA20E6-4662-482A-920B-1A45CF5AAE3C/14393.0.160715-1616.RS1_RELEASE_SERVER_EVAL_X64FRE_EN-US.ISO
sudo curl -Lo /var/lib/libvirt/isos/virtio-win.iso https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso

Usar libvirt como usuario (sin sudo)

Crea un pool de image y iso que sea escribible por el usuario y establece los permisos del pool según corresponda. Asegúrate de que el usuario forme parte de

sudo virsh pool-create-as myisos dir --target /mydir/libvirt/isos
sudo virsh pool-edit isos # establece permisos

sudo virsh pool-create-as myimages dir --target /mydir/libvirt/images
sudo virsh pool-edit images2 # establece permisos

Referencia los directorios y pool en tu molecule/libvirt/vars.yml

libvirt_image_dir: "/mydir/libvirt/images"
libvirt_iso_dir: "/mydir/libvirt/isos"
libvirt_disk_pool: "myimages"

Con Ansible molecule

Crea un nuevo rol con molecule init role <nombre> o inicializa el escenario de Molecule en un directorio de rol existente con molecule init scenario default.

Descarga los archivos de ejemplo de este repositorio que usan este rol (en create y destroy):

for f in create destroy molecule requirements vars; do
  curl -o molecule/libvirt/$f.yml https://raw.githubusercontent.com/DrPsychick/ansible-testing/main/docs/molecule/libvirt/$f.yml
done

Ajusta el molecule/libvirt/vars.yml para definir qué contenedores aprovisionar. Luego ajusta las platforms en molecule/libvirt/molecule.yml en consecuencia.

# ejecuta el escenario "libvirt"
molecule test -s libvirt

Independiente

ansible-galaxy install -r requirements.yml

# edita tests/provision.yml según tus necesidades
echo "[defaults]
roles_path = .." > ansible.cfg

# crea máquina virtual
ansible-playbook tests/create_vm.yml

# destruye máquina virtual
ansible-playbook tests/destroy_vm.yml

Usando imágenes de Windows predefinidas para acelerar el aprovisionamiento

Un ciclo completo (crear) para 2 instancias de Windows con imágenes predefinidas tomó menos de 4 minutos en mi i7.

  1. Crea una imagen qcow2 o simplemente aprovisiona una VM una vez con instalación desatendida.
  2. Crea un zip de la VM lista para usar: zip windows2016-clean.qcow2.zip windows2016.qcow2 (el nombre del archivo debe coincidir y estar en la raíz del archivo zip - sin ruta)
  3. Mueve el archivo zip a libvirt_iso_dir o proporciónalo a través de URL (disk_image_url)

Prueba localmente con diferentes versiones de Ansible

Requiere python3-venv

# la versión 16 y la más reciente fallan con
# ERROR! Excepción inesperada, esto es probablemente un error: no se puede importar el nombre 'should_retry_error' de 'ansible.galaxy.api'
ANSIBLE_VERSION=15
python3 -m venv .venv
. .venv/bin/activate
pip3 install --upgrade pip setuptools wheel
pip3 install --requirement requirements-ansible_${ANSIBLE_VERSION}.txt

molecule test
Acerca del proyecto

role for molecule to spin up systemd docker containers or libvirt VMs to test your ansible roles with

Instalar
ansible-galaxy install drpsychick.ansible_testing
Licencia
mit
Descargas
1.7k
Propietario
individual, curious, human