「動けばいい」は卒業だ:Ansible Molecule × Testinfraで構築する、壊れないインフラの要塞
「Ansibleのコードを書いて、`ansible-playbook` を叩いて、SSHでログインして状態を確認する」。もし君がまだこの手作業を繰り返しているなら、今すぐその習慣を捨ててほしい。
大規模インフラにおいて、手動確認は「技術的負債」そのものだ。SREの責務は単に自動化することではなく、「変更が意図通りであり、かつ過去の機能を破壊していないこと(冪等性の証明)」を機械的に保証することにある。
今日は、Ansible MoleculeとTestinfraを駆使し、CI/CDパイプラインに「検証の自動化」という心臓を移植する極限の実践手法を伝授する。
—
1. なぜMoleculeなのか:インフラの「単体テスト」を実装せよ
Moleculeは単なるテストツールではない。DockerやVagrantを立ち上げ、ロールを実行し、テストを行い、環境を破壊して消える。この「使い捨てインフラ」のライフサイクルを制御することで、初めて「冪等性の完全な検証」が可能になる。
現場で勝てる Molecule 設定(molecule.yml)
デフォルト設定は忘れろ。実運用では、Driverに`docker`を使い、高速なフィードバックループを作るのが鉄則だ。
—
dependency:
name: galaxy
driver:
name: docker
platforms:
- name: instance
image: geerlingguy/docker-ubuntu2204-ansible:latest
pre_build_image: true
# コンテナに特権を与え、Systemdを実行可能にする(重要)
privileged: true
command: /lib/systemd/systemd
provisioner:
name: ansible
log: true
# 複数回実行して冪等性をチェックする設定(必須)
playbooks:
converge: converge.yml
verifier:
name: testinfra
—
2. Testinfra:Pythonの力でインフラの魂を検診する
シェルスクリプトで`grep`して`$?`を確認するのは今日で終わりだ。Testinfraを使えば、Pythonの直感的な構文で、サーバーの状態を「資産」として定義できる。
`tests/test_default.py` のベストプラクティス
import pytest
サービスが起動し、かつ自動起動設定が有効かを確認
def test_nginx_is_installed_and_running(host):
nginx = host.package(“nginx”)
assert nginx.is_installed
assert nginx.version.startswith(“1.18”)
svc = host.service(“nginx”)
assert svc.is_running
assert svc.is_enabled
設定ファイルのパーミッションと所有者を厳密にガード
def test_nginx_config_file(host):
conf = host.file(“/etc/nginx/nginx.conf”)
assert conf.exists
assert conf.user == “root”
assert conf.mode == 0o644
—
3. CI/CDパイプラインへの統合:GitHub Actionsの要塞化
開発者のローカルで動くことは最低条件だ。GitHub Actionsに組み込み、プルリクエストが飛ぶたびに「インフラの整合性」を自動採点させる。
.github/workflows/molecule.yml
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run Molecule
run: molecule test
env:
PY_COLORS: ‘1’
ANSIBLE_FORCE_COLOR: ‘1’
—
4. テックリード直伝:生産性を極限まで高める「秘伝の技」
開発スピードを加速させる「神プラグイン」
- Ansible Language Server: VS Codeに入れておけ。YAMLの構文エラーや、変数の未定義をタイピング中に警告してくれる。これなしでAnsibleを書くのは、暗闇で目隠しをして運転するようなものだ。
- Docker Explorer: Moleculeで生成された一時的なコンテナの状態を、VS Codeから直感的に覗き見ろ。
チーム開発の「暗黙の掟」
1. 冪等性の二段構え: `molecule test` は必ず `converge` 後の「2回目の実行」でエラーが出ないことを確認する設定にせよ。
2. Lintを宗教化せよ: `ansible-lint` をコミットフックに仕込み、警告が出ているコードはレビューの土俵に上げさせない。
3. 変数の外部化: 全ての変数は `group_vars` に集約し、`roles/` 内にはロジックしか書くな。これによりテストの再利用性が劇的に向上する。
—
最後に:なぜここまでやるのか
インフラエンジニアにとって、一番の敵は「動かしてみるまで分からない」という恐怖だ。MoleculeとTestinfraを導入すれば、その恐怖は「コードに対する絶対的な信頼」に変わる。
自動テストを書く時間は、最初は遠回りに思えるかもしれない。だが、障害発生時の深夜の呼び出しと、原因不明の構成ドリフトに苦しむ未来を買い戻していると思えば、安い投資だと思わないか?
さあ、コードを書いてテストを走らせろ。インフラを「管理するもの」から「保証するもの」へ進化させる時が来た。