【実務・中級編】Ansible Molecule v5完全移行ガイド:最新のテスト環境構築とシナリオ作成のベストプラクティス – インフラ構成管理(IaC)活用バイブル

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` を配置せよ。手動確認という悪習を断ち切り、コードで語る組織へと変革せよ。それが、クラウドインフラを支配する唯一の道だ。

タイトルとURLをコピーしました