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」になった瞬間の静かな悦びを、チームの全員と共有してほしい。
さあ、次のコミットからテストを書いてくれ。君のインフラは、もっと強くなれるはずだ。