ansible_testing
Тестирование Ansible
Создает полностью функциональные контейнеры Docker с поддержкой SystemD, которые вы можете использовать для тестирования ваших ролей Ansible.
С помощью libvirt
вы также можете автоматически создавать виртуальные машины Windows для тестирования ролей с использованием WinRM
.
Предназначено для локального запуска на машине с Linux, на которой установлены Docker (и опционально libvirt).
Настройка
Проверьте defaults/main.yml, чтобы узнать, как определить контейнеры и настроить их под свои нужды.
- Задайте свой собственный
work_dir
. Содержимое временное и будет удалено приdestroy
! - Задайте контейнеры, которые хотите запустить.
Что это делает (вкратце)
Эта роль имеет задачи create
и destroy
для контейнеров и виртуальных машин. Она перебирает заданные списки
(containers
или virtual_machines
в vars.yml
) и создает экземпляры соответственно.
Каждый сценарий Molecule должен использовать либо контейнеры, либо виртуальные машины, поскольку Molecule поддерживает только один драйвер на сценарий.
Linux: Создаются привилегированные контейнеры Docker, которые запускаются с помощью /sbin/init
, чтобы получить полноценный экземпляр SystemD.
Windows: Создается ВМ (автоматическая установка Windows) и настраивается WinRM для Ansible (обычный HTTP) при первом запуске.
Совет: Создание виртуальных машин Windows дорогое и занимает более 10 минут.
Участие
Если у вас есть другие системы, которые вы хотите протестировать, не стесняйтесь предоставить PR с дополнительными Dockerfile или конфигурацией libvirt.
Участвовать очень просто:
- Сделайте форк проекта на GitHub: https://github.com/DrPsychick/ansible-testing
- Клонируйте форк на вашем компьютере с Linux
- Создайте символьную ссылку на форк в сценарии Molecule (например,
./molecule/default/
) - Внесите изменения и протестируйте свою роль, пока не будете довольны – сделайте коммит и создайте pull-request
- Вы можете запускать GitHub Actions локально для быстрого получения обратной связи с помощью
act
: https://nektosact.com/installation/index.html
GitHubName=ВашеИмя
YourRoleDir=/Это/Директория/Вашей/Роли/MyRole
YourRoleName=MyRole
WhereYourForkIs=/Это/Где/Вы/Клонируете/Ваш/Форк
# клонирование вашего форка
cd $WhereYourForkIs
git clone https://github.com/$GitHubName/ansible-testing.git
# создание символьной ссылки на вашу локальную версию в вашем сценарии Molecule
cd $YourRoleDir/molecule/default
ln -s $WhereYourForkIs/ansible-testing drpsychick.ansible_testing
# закомментируйте роль в требованиях и удалите загруженную версию
sed -i -e 's/^ /# /' requirements.yml
rm -rf ~/.cache/molecule/$YourRoleName/default/roles/drpsychick.ansible_testing
Теперь, когда вы запускаете molecule
, он будет использовать символьную ссылку для включения роли drpsychick.ansible_testing
.
Вносите изменения, регулярно делайте коммиты, и когда закончите, не забудьте создать pull-request, чтобы другие могли также воспользоваться вашими улучшениями. Более того, вы можете протестировать саму роль с помощью Molecule:
просто выполните molecule test
в директории вашего локального форка.
Использование
Требования:
- Linux (т.к. контейнеры запускаются в привилегированном режиме и связывают
/sys/fs/cgroup
) - Docker
- libvirt (для виртуальных машин Windows)
Тестирование с контейнерами Docker (Linux)
Требования
pip3 install -U molecule molecule-docker
С помощью Ansible molecule
Создайте новую роль с помощью molecule init role <имя>
или инициализируйте сценарий Molecule в существующей директории роли с помощью
molecule init scenario default
.
Скачайте пример файлов из этого репозитория, которые используют эту роль (в create
и 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
Настройте molecule/default/vars.yml
, чтобы определить, какие контейнеры создавать.
Затем настройте platforms
в molecule/default/molecule.yml
соответственно.
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
[...]
Запустите molecule
# по отдельности
molecule dependency
molecule create
molecule prepare
molecule converge
molecule idempotence
molecule verify
molecule cleanup
molecule destroy
# или всё за раз
molecule test
Самостоятельно
Напишите свой собственный плейбук или используйте плейбуки из tests
ansible-galaxy install -r requirements.yml
# отредактируйте tests/provision.yml в соответствии с вашими нуждами
echo "[defaults]
roles_path = .." > ansible.cfg
# создайте контейнеры
ansible-playbook tests/create.yml
# уничтожьте контейнеры
ansible-playbook tests/destroy.yml
Тестирование с виртуальными машинами Windows
Требования
- установите
libvirt
,libvirt-clients
,virtinst
- ansible-galaxy
community.libvirt
- для подключения Ansible к WinRM:
python3-winrm
- смотрите defaults/main.yml
- Скачайте выбранный образ Windows (тест настроен для Windows 2016)
- Скачайте ISO VirtIO
- Поместите оба ISO в директорию
libvirt_iso_dir
# скачайте 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
Используйте libvirt как пользователь (без sudo)
Создайте пул image
и iso
, который будет доступен для записи пользователю, и установите права доступа к пулу соответственно.
Убедитесь, что пользователь входит в группу:
sudo virsh pool-create-as myisos dir --target /mydir/libvirt/isos
sudo virsh pool-edit isos # установите права
sudo virsh pool-create-as myimages dir --target /mydir/libvirt/images
sudo virsh pool-edit images2 # установите права
Ссылайтесь на директории и пул в вашем molecule/libvirt/vars.yml
libvirt_image_dir: "/mydir/libvirt/images"
libvirt_iso_dir: "/mydir/libvirt/isos"
libvirt_disk_pool: "myimages"
С помощью Ansible molecule
Создайте новую роль с помощью molecule init role <имя>
или инициализируйте сценарий Molecule в существующей директории роли с помощью
molecule init scenario default
.
Скачайте пример файлов из этого репозитория, которые используют эту роль (в create
и 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
Настройте molecule/libvirt/vars.yml
, чтобы определить, какие контейнеры создавать.
Затем настройте platforms
в molecule/libvirt/molecule.yml
соответственно.
# запустите сценарий "libvirt"
molecule test -s libvirt
Самостоятельно
ansible-galaxy install -r requirements.yml
# отредактируйте tests/provision.yml в соответствии с вашими нуждами
echo "[defaults]
roles_path = .." > ansible.cfg
# создайте виртуальную машину
ansible-playbook tests/create_vm.yml
# уничтожьте виртуальную машину
ansible-playbook tests/destroy_vm.yml
Использование предустановленных образов Windows для ускорения развертывания
Полный развертывание (создание) для 2 экземпляров Windows с предустановленными образами заняло менее 4 минут на моем i7.
- Создайте изображение
qcow2
или просто разверните ВМ один раз с автоматической установкой. - Создайте zip из готового к использованию ВМ:
zip windows2016-clean.qcow2.zip windows2016.qcow2
(имя файла должно совпадать и находиться в корне zip-архива - без пути) - Переместите zip файл в
libvirt_iso_dir
или предоставьте его по URL (disk_image_url
)
Тестирование локально с разными версиями Ansible
Требует python3-venv
# версия 16 и последняя не работают с ошибкой
# ERROR! Непредвиденное исключение, вероятно, это ошибка: не удается импортировать имя 'should_retry_error' из '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