drpsychick.ansible_testing
Ansible テスト
Ansible ロールをテストするための完全に機能する SystemD の Docker コンテナを作成します。
libvirt
を使用すると、Windows の仮想マシンを自動でプロビジョニングし、WinRM
でロールをテストできます。
Linux ボックスに Docker (および必要に応じて libvirt)がインストールされている環境で実行することを目的としています。
設定
defaults/main.yml を確認して、コンテナを定義し、ニーズに合わせて調整してください。
- 独自の
work_dir
を定義します。内容は一時的で、destroy
で削除されます! - 起動したいコンテナを定義します。
概要
このロールには、コンテナと仮想マシンのための create
および destroy
タスクがあります。設定されたリストをループし、インスタンスを作成します。
各 Molecule シナリオは、コンテナまたは仮想マシンのいずれかのみを使用する必要があります。Molecule はシナリオごとに単一のドライバーのみをサポートします。
Linux: /sbin/init
で起動する特権のある Docker コンテナを作成し、完全な SystemD 対応インスタンスを持ちます。
Windows: VM(Windows の無人インストール)を作成し、初回起動時に Ansible 用に WinRM (プレーン HTTP)を設定します。
ヒント: Windows の VM の作成には時間がかかり、10 分以上かかる場合があります。
貢献
テストしたい他のシステムがある場合は、追加の Dockerfile や libvirt 設定の PR を提供してください。
貢献は非常に簡単です:
- GitHub でプロジェクトをフォークする: https://github.com/DrPsychick/ansible-testing
- Linux ボックスでフォークをチェックアウトする
- ロールの Molecule シナリオにフォークのシンボリックリンクを作成する(例:
./molecule/default/
) - 変更を加え、満足するまでロールでテストする - コミットしてプルリクエストを作成する
- GitHub Actions をローカルで実行して迅速なフィードバックを得ることができます: https://nektosact.com/installation/index.html
GitHubName=YourName
YourRoleDir=/This/Is/Your/Role/Directory/MyRole
YourRoleName=MyRole
WhereYourForkIs=/This/Is/Where/You/Clone/Your/Fork
# フォークをクローンする
cd $WhereYourForkIs
git clone https://github.com/$GitHubName/ansible-testing.git
# ローカルバージョンのシンボリックリンクを作成する
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
ロールを含めることができます。
変更を加え、定期的にコミットし、完成したらプルリクエストを忘れずに作成し、他の人もあなたの改善点を活用できるようにしましょう。また、ローカルフォークディレクトリで molecule test
を実行して、ロール自体をテストできます。
使用方法
必要条件:
- Linux (特権モードでコンテナを生成し、
/sys/fs/cgroup
をバインドするため) - Docker
- libvirt (Windows 仮想マシン用)
Docker コンテナでのテスト(Linux)
必要条件
pip3 install -U molecule molecule-docker
Ansible molecule
と一緒に
molecule init role <name>
で新しいロールを作成するか、既存のロールディレクトリの 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
を調整して、プロビジョニングするコンテナを定義します。
その後、molecule/default/molecule.yml
の platforms
を適切に調整します。
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 VM でのテスト
必要条件
libvirt
,libvirt-clients
,virtinst
をインストールする- ansible-galaxy
community.libvirt
- Ansible が WinRM に接続するため:
python3-winrm
- defaults/main.yml を参照
- お好みの Windows イメージをダウンロードする(テストは Windows 2016 用にセットアップされています)
- VirtIO ISO をダウンロードする
- 両方の 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 <name>
で作成するか、既存のロールディレクトリの 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
を調整して、プロビジョニングするコンテナを定義します。
その後、molecule/libvirt/molecule.yml
の platforms
を適切に調整します。
# シナリオ "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 分未満 かかりました。
qcow2
イメージを作成するか、無人インストールで一度 VM をプロビジョニングします。- すぐに使える VM から zip を作成します:
zip windows2016-clean.qcow2.zip windows2016.qcow2
(ファイル名は一致させて、zip ファイルのルートに配置する - パスは不要) - zip ファイルを
libvirt_iso_dir
に移動するか、URL で提供します(disk_image_url
)
異なる Ansible バージョンでローカルテストを実施
python3-venv
が必要です。
# バージョン 16 と最新は失敗する
# 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