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
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.
- Crea una imagen
qcow2
o 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_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
role for molecule to spin up systemd docker containers or libvirt VMs to test your ansible roles with
ansible-galaxy install drpsychick.ansible_testing