drpsychick.ansible_testing
Pruebas de Ansible
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á condestroy! - 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:
- Haz un fork del proyecto en GitHub : https://github.com/DrPsychick/ansible-testing
- Clona el fork en tu máquina Linux
- Crea un enlace simbólico del fork en tu escenario de roles de Molecule (por ejemplo,
./molecule/default/) - Haz cambios y prueba tu rol hasta que estés satisfecho - haz commit y crea un pull-request
- 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
privilegedy 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.
- Crea una imagen
qcow2o simplemente aprovisiona una VM una vez con instalación desatendida. - 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) - Mueve el archivo zip a
libvirt_iso_diro 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
role for molecule to spin up systemd docker containers or libvirt VMs to test your ansible roles with
ansible-galaxy install drpsychick.ansible_testing