Ansible Molecule × Testinfra:インフラコードを「壊れない資産」に変える極意
こんにちは。インフラエンジニアの皆さん、日々の構築作業で「設定ファイルを書き換えたあと、本当に意図通りに動いているか不安で夜も眠れない」なんてことはありませんか?
手作業の確認から脱却し、インフラを「コード」として正しく管理するなら、Ansible MoleculeとTestinfraを避けて通ることはできません。今日は、インフラコードの品質を担保し、リグレッション(退行)を未然に防ぐための「テスト駆動型インフラ開発」の第一歩を、余すことなく伝授します。
—
1. なぜ「Molecule」なのか?
Ansibleは非常に強力ですが、書いたPlaybookが「冪等(べきとう:何度実行しても同じ結果になる)」かどうかを保証するのは至難の業です。
- Molecule: Ansibleのテスト用フレームワーク。コンテナやVMを自動で立ち上げ、Ansibleを実行し、テストを行い、最後に環境をクリーンアップするまでを自動化します。
- Testinfra: Pythonベースのテストツール。OSの内部状態(パッケージの有無、サービスの状態、ポートの開放状況など)を、まるで「そこにいるかのように」検査できます。
この2つを組み合わせることで、「書いたPlaybookが期待通りにサーバーを構築できているか」をCI上で自動判定する仕組みが完成します。
—
2. 環境構築:まずはここから
まずは必要な道具を揃えましょう。仮想環境(venv)を利用するのが鉄則です。
プロジェクトディレクトリの作成
mkdir my-ansible-role && cd my-ansible-role
仮想環境の構築
python3 -m venv .venv
source .venv/bin/activate
必要なパッケージのインストール
pip install molecule molecule-docker testinfra
※Dockerがインストールされている前提です。
—
3. Moleculeの初期セットアップ
Moleculeでプロジェクトを初期化します。今回はDockerコンテナをテスト環境として使います。
molecule init role my_role –driver-name docker
cd my_role
これで、ディレクトリの中に `molecule/default/` というフォルダが生成されます。ここがインフラテストの心臓部です。
—
4. 精度高い「HelloWorld」:Nginxをテストする
「Nginxがインストールされ、起動していること」を確認するテストを書いてみましょう。
Step 1: AnsibleでNginxをインストールする(Playbook)
`tasks/main.yml` に以下を記述します。
- name: Install Nginx
apt:
name: nginx
state: present
- name: Ensure Nginx is started
service:
name: nginx
state: started
enabled: true
Step 2: Testinfraで状態を検証する
`molecule/default/tests/test_default.py` を開き、以下のようにテストを書きます。
import testinfra
def test_nginx_is_installed(host):
# パッケージがインストールされているか
nginx = host.package(“nginx”)
assert nginx.is_installed
def test_nginx_is_running(host):
# サービスが起動し、有効化されているか
nginx = host.service(“nginx”)
assert nginx.is_running
assert nginx.is_enabled
—
5. 実行と検証:魔法のコマンド
準備は整いました。以下のコマンドを叩いてみてください。
molecule test
このコマンド一つで、以下のドラマが自動で進行します。
1. Dependency: 依存関係のチェック
2. Create: Dockerコンテナを立ち上げる
3. Prepare: 環境を整える
4. Converge: Ansible Playbookを適用する(ここでNginxが入る)
5. Verify: Testinfraが動いて状態をチェックする!
6. Destroy: コンテナを破棄する
もしPlaybookにバグがあれば、`Verify`の段階でエラーを吐いて教えてくれます。これが「壊れないインフラ」の第一歩です。
—
6. CI/CDパイプラインへの統合(GitHub Actions)
これをGitHub Actionsに組み込めば、プルリクエストを送るたびに自動テストが走ります。`.github/workflows/test.yml` に以下を配置するだけです。
name: Ansible Test
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run Molecule
run: |
pip install molecule molecule-docker
molecule test
—
最後に:エンジニアとして生き残るために
「動いたからOK」という手作業の時代は終わりました。「テストが通ったから安心だ」と言えることが、プロのインフラエンジニアとしての唯一の正義です。
最初はMoleculeの設定に苦労するかもしれません。しかし、一度このパイプラインを構築してしまえば、あなたは「サーバー構築のたびにドキドキする」必要から解放されます。
何か分からないことがあれば、いつでも聞いてください。インフラの自動化という、この最高にエキサイティングな旅を一緒に楽しみましょう!