Ansible Molecule v5:モダンIaCの「正解」を実装する
「Ansibleのコードを書いて、手動でサーバーに投げて、期待通り動くか目視確認する」――そんな時代の遺物と決別する時が来た。
Molecule v5の登場により、我々はついに「インフラコードのCI/CD」を、本来あるべき姿である「高速・並列・確実」な状態にまで引き上げた。本稿では、単なるアップグレード手順の羅列ではなく、現場のテックリードが知るべき、プロダクション品質を担保するための「極限の知見」を共有する。
—
1. Molecule v5:何が変わり、何を残すべきか
v5系における最大の変更点は、「Molecule本体からの依存関係の剥離」だ。かつてMoleculeはDockerやPodmanのドライバを内包していたが、現在は`molecule-plugins`として分離された。これにより、Ansible本体のアップデートサイクルから切り離され、軽量かつ柔軟な構成が可能になった。
現場で必須の「神」構成:`molecule.yml` のベストプラクティス
まず、チーム全体の生産性を底上げするためのテンプレートを提示する。
molecule/default/molecule.yml
dependency:
name: galaxy
driver:
name: podman # Dockerよりセキュアでデーモンレス。CI/CD環境には最適
platforms:
- name: instance-ubuntu
image: geerlingguy/docker-ubuntu2204-ansible:latest
pre_build_image: true
- name: instance-rocky
image: geerlingguy/docker-rockylinux9-ansible:latest
pre_build_image: true
provisioner:
name: ansible
options:
diff: true # 冪等性チェックで差異を明確にする
verbose: v
verifier:
name: testinfra # pytestベースの検証
—
2. 並列実行とマルチディストリビューション戦略
単一のディストリビューションでのテストは「幻想」に過ぎない。UbuntuとRocky Linuxで挙動が異なることは日常茶飯事だ。`molecule test` はデフォルトで逐次実行されるが、CI上では並列化が鉄則である。
実践:GitHub Actionsでの並列実行設定
GitHub ActionsのMatrix戦略と組み合わせ、Moleculeの引数を制御する。
.github/workflows/molecule.yml
strategy:
matrix:
distro: [ubuntu2204, rockylinux9]
env:
MOLECULE_DISTRO: ${{ matrix.distro }}
steps:
- name: Run Molecule
run: molecule test -s ${{ matrix.distro }}
テックリードの知見: `pre_build_image` を活用せよ。`docker build` の時間をテストのたびに消費するのは罪だ。あらかじめAnsibleがインストールされたベースイメージをコンテナレジストリにキャッシュしておくことで、フィードバックループを1分以内に短縮できる。
—
3. pytestによる「堅牢な」アサーション
`command`モジュールでシェルを叩く古いテストは捨てろ。`testinfra`(pytest)を使うことで、Pythonの強力なエコシステムをインフラテストに持ち込める。
実践:サーバー状態の高度な検証例
molecule/default/tests/test_default.py
def test_nginx_is_installed_and_running(host):
nginx = host.package(“nginx”)
assert nginx.is_installed
assert host.service(“nginx”).is_running
assert host.service(“nginx”).is_enabled
def test_config_file_integrity(host):
# ファイルのパーミッションと所有者を厳密にチェック
config = host.file(“/etc/nginx/nginx.conf”)
assert config.exists
assert config.user == “root”
assert config.mode == 0o644
プロのテクニック: テストコード自体をDRYに保つこと。共通の検証ロジックは `conftest.py` にfixtureとして定義し、各ロール間で再利用する。これが「チームの規律」となる。
—
4. 生産性を極限まで高める「隠れた」テクニック
チーム開発における共有化ルール
- `molecule/shared/` の活用: `molecule.yml` のプロビジョナー設定などは共通化し、`include` 構文で読み込む。設定変更が全ロールに即座に反映される。
- `.ansible-lint` の強制: Moleculeの実行前にlintを通すのは当たり前。`rules` で `no-changed-when` などの冪等性違反を警告ではなくエラーに昇格させよ。
開発を爆速化するIDE設定 (VS Code)
- `ansible.ansible-lint.path`: プロジェクトルートの `venv` 内のlintを指すように設定し、チーム全員のルールを統一する。
- キーボードショートカット:
- `Ctrl + Shift + P` -> `Molecule: Test` を即座に叩けるよう、キーバインドをカスタマイズする(例: `Alt + M`)。
- `molecule converge` 後の `molecule login` でデバッグする際、`tmux` と組み合わせ、右画面に常にMoleculeのログを流し続ける環境を作る。
—
最後に:なぜ「やりすぎる」必要があるのか
インフラのテストは「保険」ではない。「設計の証明」である。
Molecule v5でのテストを「書かされている」と感じるうちは、まだインフラエンジニアとしての深淵に触れていない。テストを書くということは、そのRoleがどのような状態を担保すべきかという仕様を、コードという唯一無二の真実として定義することだ。
今すぐ、すべてのロールに `molecule.yml` を配置せよ。手動確認という悪習を断ち切り、コードで語る組織へと変革せよ。それが、クラウドインフラを支配する唯一の道だ。