drpsychick.ansible_testing
Testowanie Ansible
Tworzy w pełni funkcjonalne kontenery SystemD w Dockerze, które możesz wykorzystać do testowania swoich ról Ansible. Z libvirt
możesz również automatycznie provisionować wirtualne maszyny Windows do testowania swoich ról z WinRM
. Jest to przeznaczone do uruchamiania lokalnie na komputerze z Linuxem, na którym zainstalowany jest Docker (i opcjonalnie libvirt).
Konfiguracja
Sprawdź plik defaults/main.yml, aby zobaczyć, jak definiować kontenery i dostosować je do swoich potrzeb.
- Zdefiniuj własny
work_dir
. Zawartość jest tymczasowa i zostanie usunięta przydestroy
! - Zdefiniuj kontenery, które chcesz uruchomić.
Co to robi (w skrócie)
To zadanie ma zadania create
i destroy
dla kontenerów i maszyn wirtualnych. Przechodzi przez skonfigurowane listy (containers
lub virtual_machines
w vars.yml
) i tworzy instancje odpowiednio. Każdy scenariusz Molecule może używać albo kontenerów, albo maszyn wirtualnych, ponieważ Molecule obsługuje tylko jednego sterownika na scenariusz.
Linux: Tworzy uprawnione kontenery docker, które są uruchamiane z /sbin/init
, aby mieć w pełni zdolną do działania instancję SystemD.
Windows: Tworzy maszynę wirtualną (nienaudytowana instalacja Windows) i konfiguruje WinRM dla Ansible (zwykły HTTP) przy pierwszym uruchomieniu.
Wskazówka: Tworzenie maszyn wirtualnych Windows jest drogie i zajmuje ponad 10 minut.
Wkład
Jeśli masz inne systemy, które chcesz testować, śmiało dostarcz PR z dodatkowymi plikami Docker lub konfiguracją libvirt.
Wkład jest naprawdę łatwy:
- Rozdziel projekt na GitHubie: https://github.com/DrPsychick/ansible-testing
- Sprawdź fork na swoim komputerze z Linuxem
- Utwórz symlink do forka w swoim scenariuszu Molecule (tj.
./molecule/default/
) - Wprowadź zmiany i testuj swoją rolę za ich pomocą, aż będziesz zadowolony - zrób commit i utwórz pull request
- Możesz uruchomić Akcje GitHub lokalnie dla szybkiej informacji zwrotnej za pomocą
act
: https://nektosact.com/installation/index.html
GitHubName=YourName
YourRoleDir=/To/Jest/Twój/Katalog/Roli/MyRole
YourRoleName=MyRole
WhereYourForkIs=/To/Jest/Tutaj/Gdzie/Sklonujesz/Swojego/Forza
# sklonuj swojego forka
cd $WhereYourForkIs
git clone https://github.com/$GitHubName/ansible-testing.git
# utwórz symlink do lokalnej wersji w swoim scenariuszu molekularnym
cd $YourRoleDir/molecule/default
ln -s $WhereYourForkIs/ansible-testing drpsychick.ansible_testing
# zakomentuj rolę w wymaganiach i usuń pobraną wersję
sed -i -e 's/^ /# /' requirements.yml
rm -rf ~/.cache/molecule/$YourRoleName/default/roles/drpsychick.ansible_testing
Teraz, gdy uruchomisz molecule
, użyje symlinku do uwzględnienia roli drpsychick.ansible_testing
.
Wprowadź zmiany, regularnie commituj, a gdy skończysz, nie zapomnij utworzyć pull request, aby inni mogli skorzystać z Twoich usprawnień. Co więcej, możesz przetestować rolę samej za pomocą Molecule: wystarczy wykonać molecule test
w katalogu swojego lokalnego forka.
Użytkowanie
Wymagania:
- Linux (ponieważ uruchamia kontenery w trybie
privileged
i łączy się z/sys/fs/cgroup
) - Docker
- libvirt (dla maszyn wirtualnych Windows)
Testowanie z kontenerami Docker (Linux)
Wymagania
pip3 install -U molecule molecule-docker
Z Ansible molecule
Utwórz nową rolę z molecule init role <nazwa>
lub zainicjalizuj scenariusz Molecule w istniejącym katalogu roli z molecule init scenario default
.
Pobierz pliki przykładowe z tego repozytorium, które korzystają z tej roli (w create
i 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
Dostosuj molecule/default/vars.yml
, aby zdefiniować, które kontenery mają zostać provisionowane.
Następnie dostosuj platforms
w molecule/default/molecule.yml
odpowiednio.
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
[...]
Uruchom molekułę
# kolejne kroki osobno
molecule dependency
molecule create
molecule prepare
molecule converge
molecule idempotence
molecule verify
molecule cleanup
molecule destroy
# lub wszystko za jednym razem
molecule test
Samodzielnie
Napisz swój własny playbook lub użyj playbooków w tests
ansible-galaxy install -r requirements.yml
# edytuj tests/provision.yml zgodnie z Twoimi potrzebami
echo "[defaults]
roles_path = .." > ansible.cfg
# twórz kontenery
ansible-playbook tests/create.yml
# zniszcz kontenery
ansible-playbook tests/destroy.yml
Testowanie z maszynami wirtualnymi Windows
Wymagania
- zainstaluj
libvirt
,libvirt-clients
,virtinst
- ansible-galaxy
community.libvirt
- aby Ansible mógł połączyć się z WinRM:
python3-winrm
- zobacz defaults/main.yml
- Pobierz obraz Windows według swojego wyboru (test jest skonfigurowany dla Windows 2016)
- Pobierz ISO VirtIO
- Umieść oba pliki ISO w
libvirt_iso_dir
# pobierz pliki ISO
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
Użycie libvirt jako użytkownik (bez sudo)
Utwórz pulę image
i iso
, która jest zapisywana przez użytkownika i odpowiednio ustaw uprawnienia puli.
Upewnij się, że użytkownik jest częścią
sudo virsh pool-create-as myisos dir --target /mydir/libvirt/isos
sudo virsh pool-edit isos # ustaw uprawnienia
sudo virsh pool-create-as myimages dir --target /mydir/libvirt/images
sudo virsh pool-edit images2 # ustaw uprawnienia
Odwołaj się do katalogów i puli w swoim molecule/libvirt/vars.yml
libvirt_image_dir: "/mydir/libvirt/images"
libvirt_iso_dir: "/mydir/libvirt/isos"
libvirt_disk_pool: "myimages"
Z Ansible molecule
Utwórz nową rolę z molecule init role <nazwa>
lub zainicjalizuj scenariusz Molecule w istniejącym katalogu roli z molecule init scenario default
.
Pobierz pliki przykładowe z tego repozytorium, które korzystają z tej roli (w create
i 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
Dostosuj molecule/libvirt/vars.yml
, aby zdefiniować, które kontenery mają zostać provisionowane.
Następnie dostosuj platforms
w molecule/libvirt/molecule.yml
odpowiednio.
# uruchom scenariusz "libvirt"
molecule test -s libvirt
Samodzielnie
ansible-galaxy install -r requirements.yml
# edytuj tests/provision.yml zgodnie z Twoimi potrzebami
echo "[defaults]
roles_path = .." > ansible.cfg
# twórz wirtualną maszynę
ansible-playbook tests/create_vm.yml
# zniszcz wirtualną maszynę
ansible-playbook tests/destroy_vm.yml
Używanie predefiniowanych obrazów Windows w celu przyspieszenia provisioningu
Pełne uruchomienie (tworzenie) dla 2 instancji Windows z predefiniowanymi obrazami zajęło mniej niż 4 minuty na moim i7.
- Utwórz obraz
qcow2
lub po prostu utwórz maszynę wirtualną raz z nienaudytowaną instalacją. - Stwórz zip z gotowej do użycia maszyny wirtualnej:
zip windows2016-clean.qcow2.zip windows2016.qcow2
(nazwa pliku musi odpowiadać i znajdować się w głównym folderze zip - bez ścieżki) - Przenieś plik zip do
libvirt_iso_dir
lub udostępnij go przez URL (disk_image_url
)
Testuj lokalnie z różnymi wersjami Ansible
Wymaga python3-venv
# wersje 16 i najnowsza nie działają
# ERROR! Unexpected Exception, this is probably a bug: cannot import name 'should_retry_error' from '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