【実務・中級編】Ansible Moleculeを用いたインフラテスト自動化!Dockerと連携したRoleのテスト駆動開発 – インフラ構成管理(IaC)活用バイブル

Ansible Molecule × Docker:インフラの「負債」を「資産」に変えるTDDの極意

「Ansibleのコードを書いて、SSHで本番機に投げて祈る」……そんな時代はもう終わった。

インフラエンジニアの真価は、「どれだけ速く変更を反映できるか」ではなく、「どれだけ安心して破壊できるか」で決まる。Ansible Moleculeは単なるテストツールではない。君たちのRoleを、堅牢で再利用可能な「プロダクト」へと昇華させるための最強のエンジンだ。

今日は、現場で血を流しながら得た、Moleculeを用いたテスト駆動開発(TDD)の神髄を伝授する。

—

1. なぜ「Dockerバックエンド」が最強なのか

Vagrant + VirtualBoxの重い起動時間に耐える時間はもうない。MoleculeをDockerドライバで動かすべき理由は以下の3点だ。

1. コンテキストスイッチの排除: コンテナなら数秒で立ち上がる。フィードバックループが劇的に速くなる。
2. 冪等性の強制: `molecule converge` を2回連続で走らせ、何も変更が発生しないことを確認する。これがAnsibleの品質管理のすべてだ。
3. CI/CDへの直結: GitHub ActionsやGitLab CI上で、本番環境と全く同じテストが回る。

—

2. 開発スピードを加速させる「極限設定」

`molecule.yml` は、デフォルトのまま使うな。チーム開発における「共通言語」として最適化せよ。

実践的な `molecule.yml` のベストプラクティス

—
dependency:
name: galaxy
driver:
name: docker
platforms:

  • name: instance-test

image: geerlingguy/docker-debian12-ansible:latest # 信頼できるベースイメージを使う
pre_build_image: true
privileged: true # Systemdを操作するRoleなら必須
capabilities:

  • SYS_ADMIN

provisioner:
name: ansible
config_options:
defaults:
# 開発中のイライラを解消する神設定
stdout_callback: yaml
display_skipped_hosts: false
pipelining: true # 接続回数を減らして爆速にする
verifier:
name: testinfra # 検証はAnsibleのモジュールよりTestinfraが圧倒的に柔軟

—

3. 開発をブーストする「神ツール・設定」

VS Code Plugin: “Ansible” (by Red Hat)

ただのシンタックスハイライトではない。`ansible-lint`との統合は必須だ。

  • 設定の肝: `.vscode/settings.json` に以下を書き込み、保存時に自動整形を走らせろ。

{
“ansible.lint.enabled”: true,
“ansible.python.interpreterPath”: “venv/bin/python”,
“editor.codeActionsOnSave”: {
“source.fixAll”: true
}
}

現場で使う「Moleculeコマンド」のショートカット(alias)

`molecule` コマンドは長い。`.zshrc`に叩き込め。

alias mconv=’molecule converge’
alias mtest=’molecule test’
alias mclean=’molecule destroy’
alias mlogin=’molecule login’ # 失敗したコンテナに即座に潜る

—

4. 「テストを書く」ことの深淵:Testinfraの活用

AnsibleのTaskが成功したとしても、システムが期待通りに動いているとは限らない。「状態」を検証せよ。

`molecule/default/verify.yml` に書くTestinfraのコード例だ。

def test_nginx_is_installed(host):
# パッケージの存在確認
pkg = host.package(“nginx”)
assert pkg.is_installed

def test_nginx_running_and_enabled(host):
# サービスが期待通りに起動しているか
service = host.service(“nginx”)
assert service.is_running
assert service.is_enabled

def test_config_file(host):
# コンフィグのパーミッションまで厳格にチェック
f = host.file(“/etc/nginx/nginx.conf”)
assert f.exists
assert f.user == “root”
assert f.group == “root”
assert f.mode == 0o644

—

5. チーム開発で生き残るためのルール

1. 冪等性テストをCIの必須条件にする: `molecule converge` を2回実行し、変更差分(Changed)が0であることをコミットの条件とする。
2. `molecule.yml` をリポジトリの「契約」とせよ: プロジェクト固有の依存関係は `requirements.yml` で厳密にバージョン固定する。
3. 失敗したコンテナを捨てるな: `molecule login` で内部に入り、何が起きたかを徹底的に調査する。インフラエンジニアとしての実力は、ここでのデバッグスキルで決まる。

—

最後に

インフラコードは「書いた瞬間」が一番美しい。しかし、時は流れ、OSは進化し、セキュリティ要件は変わる。

Moleculeによるテスト自動化は、君が書いたコードが「数年後も正しく動く」ことを保証するための唯一の保険だ。コードを書き終えた後の達成感よりも、`molecule test` がすべて「Passed」になった瞬間の静かな悦びを、チームの全員と共有してほしい。

さあ、次のコミットからテストを書いてくれ。君のインフラは、もっと強くなれるはずだ。

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