ansible_testing

Тестирование Ansible

Статус сборки лицензия Paypal Спонсорство GitHub

Создает полностью функциональные контейнеры 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.

Участвовать очень просто:

  1. Сделайте форк проекта на GitHub: https://github.com/DrPsychick/ansible-testing
  2. Клонируйте форк на вашем компьютере с Linux
  3. Создайте символьную ссылку на форк в сценарии Molecule (например, ./molecule/default/)
  4. Внесите изменения и протестируйте свою роль, пока не будете довольны – сделайте коммит и создайте pull-request
  5. Вы можете запускать 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.

  1. Создайте изображение qcow2 или просто разверните ВМ один раз с автоматической установкой.
  2. Создайте zip из готового к использованию ВМ: zip windows2016-clean.qcow2.zip windows2016.qcow2 (имя файла должно совпадать и находиться в корне zip-архива - без пути)
  3. Переместите 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
Лицензия
mit
Загрузки
1695
Владелец
individual, curious, human