drpsychick.ansible_testing
Tests Ansible
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é avecdestroy
! - 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 :
- Forkez le projet sur GitHub : https://github.com/DrPsychick/ansible-testing
- Clonez le fork sur votre machine Linux
- Créez un lien symbolique vers le fork dans votre scénario Molecule (c'est-à-dire
./molecule/default/
) - Apportez vos modifications et testez votre rôle avec elles jusqu'à ce que vous soyez satisfait - engagez et créez une demande de tirage
- 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.
- Créez une image
qcow2
ou provisionnez simplement une machine virtuelle une fois avec une installation automatique - 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) - 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
role for molecule to spin up systemd docker containers or libvirt VMs to test your ansible roles with
ansible-galaxy install drpsychick.ansible_testing