drpsychick.ansible_testing

Tests Ansible

Statut de construction licence Paypal Soutenir sur GitHub

Crée des conteneurs Docker SystemD entièrement fonctionnels que vous pouvez utiliser pour tester vos rôles Ansible. Avec libvirt, vous pouvez également provisionner automatiquement des machines virtuelles Windows pour tester vos rôles avec WinRM. Cela doit être exécuté localement sur une machine Linux avec Docker (et éventuellement libvirt) installé.

Configuration

Vérifiez defaults/main.yml pour voir comment définir les conteneurs et ajustez-les selon vos besoins.

  • Définissez votre propre work_dir. Le contenu est temporaire et sera supprimé avec destroy !
  • Définissez les conteneurs que vous souhaitez lancer.

Ce que cela fait (en résumé)

Ce rôle a des tâches create et destroy pour les conteneurs et les machines virtuelles. Il parcourt les listes configurées (containers ou virtual_machines dans vars.yml) et crée les instances en conséquence. Chaque scénario Molecule doit utiliser soit des conteneurs soit des machines virtuelles, car Molecule ne prend en charge qu'un seul pilote par scénario.

Linux : Il crée des conteneurs Docker avec privilèges qui sont démarrés avec /sbin/init pour avoir une instance entièrement capable de SystemD.

Windows : Il crée la VM (installation automatique de Windows) et configure WinRM pour Ansible (HTTP simple) lors du premier démarrage.

Conseil : Créer des machines virtuelles Windows est coûteux et prend plus de 10 minutes.

Contributions

Si vous avez d'autres systèmes que vous souhaitez tester, n'hésitez pas à fournir un PR avec des Dockerfiles supplémentaires ou une configuration libvirt.

Contribuer est très simple :

  1. Forkez le projet sur GitHub : https://github.com/DrPsychick/ansible-testing
  2. Clonez le fork sur votre machine Linux
  3. Créez un lien symbolique vers le fork dans votre scénario Molecule (c'est-à-dire ./molecule/default/)
  4. Apportez vos modifications et testez votre rôle avec elles jusqu'à ce que vous soyez satisfait - engagez et créez une demande de tirage
  5. Vous pouvez exécuter GitHub Actions localement pour un retour rapide avec act : https://nektosact.com/installation/index.html
GitHubName=VotreNom
YourRoleDir=/Ceci/Est/Votre/Dossier/Rôle/MonRôle
YourRoleName=MonRôle
WhereYourForkIs=/Ceci/Est/Lieu/Où/Vous/Clonez/Votre/Fork

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

# créez un lien symbolique vers votre version locale dans votre scénario Molecule
cd $YourRoleDir/molecule/default
ln -s $WhereYourForkIs/ansible-testing drpsychick.ansible_testing

# commentez le rôle dans les exigences et supprimez la version téléchargée
sed -i -e 's/^ /# /' requirements.yml
rm -rf ~/.cache/molecule/$YourRoleName/default/roles/drpsychick.ansible_testing

Maintenant, lorsque vous exécutez molecule, il utilisera le lien symbolique pour inclure le rôle drpsychick.ansible_testing. Apportez vos modifications, engagez régulièrement et lorsque vous avez terminé, n'oubliez pas de créer une demande de tirage afin que d'autres puissent également bénéficier de vos améliorations. De plus, vous pouvez tester le rôle lui-même avec Molecule : il vous suffit d'exécuter molecule test dans le répertoire de votre fork local.

Utilisation

Prérequis :

  • Linux (car cela crée des conteneurs en mode privileged et lie /sys/fs/cgroup)
  • Docker
  • libvirt (pour les machines virtuelles Windows)

Tester avec des conteneurs Docker (Linux)

Prérequis

  • pip3 install -U molecule molecule-docker

Avec Ansible molecule

Créez un nouveau rôle avec molecule init role <nom> ou initialisez le scénario Molecule dans un répertoire de rôle existant avec molecule init scenario default.

Téléchargez les fichiers d'exemple de ce dépôt qui utilisent ce rôle (dans create et 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

Ajustez le molecule/default/vars.yml pour définir quels conteneurs provisionner. Ensuite, ajustez les platforms dans molecule/default/molecule.yml en conséquence.

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
[...]

Exécutez molecule

# étapes séparément
molecule dependency
molecule create
molecule prepare
molecule converge
molecule idempotence
molecule verify
molecule cleanup
molecule destroy

# ou tout en une fois
molecule test

Autonome

Écrivez votre propre playbook ou utilisez les playbooks dans tests

ansible-galaxy install -r requirements.yml

# modifiez tests/provision.yml selon vos besoins
echo "[defaults]
roles_path = .." > ansible.cfg

# créez des conteneurs
ansible-playbook tests/create.yml

# détruisez des conteneurs
ansible-playbook tests/destroy.yml

Tester avec des machines virtuelles Windows

Prérequis

  • installer libvirt, libvirt-clients, virtinst
  • ansible-galaxy community.libvirt
  • pour qu'Ansible se connecte à WinRM : python3-winrm
  • voir defaults/main.yml
    • Téléchargez l'image Windows de votre choix (Le test est configuré pour Windows 2016)
    • Téléchargez l'ISO VirtIO
    • Mettez les deux ISO dans le libvirt_iso_dir
# téléchargez les 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

Utiliser libvirt en tant qu'utilisateur (sans devenir/sudo)

Créez un pool image et iso qui est modifiable par l'utilisateur et définissez les permissions du pool en conséquence. Assurez-vous que l'utilisateur fait partie de

sudo virsh pool-create-as myisos dir --target /mydir/libvirt/isos
sudo virsh pool-edit isos # définissez les permissions

sudo virsh pool-create-as myimages dir --target /mydir/libvirt/images
sudo virsh pool-edit images2 # définissez les permissions

Référencer les répertoires et le pool dans votre molecule/libvirt/vars.yml

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

Avec Ansible molecule

Créez un nouveau rôle avec molecule init role <nom> ou initialisez le scénario Molecule dans un répertoire de rôle existant avec molecule init scenario default.

Téléchargez les fichiers d'exemple de ce dépôt qui utilisent ce rôle (dans create et 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

Ajustez le molecule/libvirt/vars.yml pour définir quels conteneurs provisionner. Puis ajustez les platforms dans molecule/libvirt/molecule.yml en conséquence.

# exécutez le scénario "libvirt"
molecule test -s libvirt

Autonome

ansible-galaxy install -r requirements.yml

# modifiez tests/provision.yml selon vos besoins
echo "[defaults]
roles_path = .." > ansible.cfg

# créez une machine virtuelle
ansible-playbook tests/create_vm.yml

# détruisez la machine virtuelle
ansible-playbook tests/destroy_vm.yml

Utilisation d'images Windows prédéfinies pour accélérer le provisionnement

Un démarrage complet (création) de 2 instances Windows avec des images prédéfinies a pris moins de 4 minutes sur mon i7.

  1. Créez une image qcow2 ou provisionnez simplement une machine virtuelle une fois avec une installation automatique
  2. Créez un zip à partir de la machine virtuelle prête à l’emploi : zip windows2016-clean.qcow2.zip windows2016.qcow2 (le nom du fichier doit correspondre et se trouver à la racine du fichier zip - sans chemin)
  3. Déplacez le fichier zip dans libvirt_iso_dir ou fournissez-le via URL (disk_image_url)

Tester localement avec différentes versions d'Ansible

Nécessite python3-venv

# version 16 et la dernière échouent avec
# ERROR! Unexpected Exception, ceci est probablement un bug : impossible d'importer le nom 'should_retry_error' du module '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
À propos du projet

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

Installer
ansible-galaxy install drpsychick.ansible_testing
Licence
mit
Téléchargements
1.7k
Propriétaire
individual, curious, human