「私のPCでは動いたんですけど…」は、もう通用しない。
こんにちは!「LINUX工房」管理人の「リナックス先生」です。
全16回(入門8回+応用8回)にわたるAnsible講座、ついにグランドフィナーレです。
これまでの講座で、あなたのAnsibleスキルは飛躍的に向上しました。
しかし、チームで開発を進めると、最後の最後に立ちふさがる壁があります。
それは「実行環境の差異(依存関係地獄)」です。
先生、助けてください!
新しく入ったメンバーにPlaybookを渡したんですが、「エラーで動かない」って言われて。
調べたら、Pythonのバージョンが違うし、入ってるライブラリも違うし、Ansibleのバージョンまで古かったんです。
全員のPC環境を合わせるのって、無理じゃないですか?
それが「環境依存」の怖さね。
Pythonの世界では日常茶飯事だけど、インフラ自動化でそれが起きると致命的よ。
でも安心して。今のAnsibleには「Execution Environment (EE)」という答えがあるわ。
Ansible本体も、ライブラリも、コレクションも、全部まるごと「コンテナ」に閉じ込めて配るの。
これで「誰がどこで実行しても、絶対に同じ結果になる」世界が作れるわ!
本記事では、Ansibleの最新アーキテクチャである Execution Environment (EE) の概念と、自分専用の実行環境を作る Ansible Builder、そしてそれを実行する Ansible Runner (Navigator) の使い方を徹底解説します。
🚀 Ansible応用講座(全8回)完結!
現在地:【最終回】新時代の実行環境。Ansible Builder/RunnerによるExecution Environment (EE)
- 【第1回】静的ファイルは捨てろ。Dynamic InventoryによるAWS/クラウド環境の自動追従
- 【第2回】ロジックを極める。Loop制御、Block例外処理、Jinja2フィルタの魔術
- 【第3回】爆速化チューニング。Forks、Pipelining、Mitogenによるパフォーマンス改善
- 【第4回】標準機能で足りないなら。PythonによるCustom Module開発入門
- 【第5回】品質を保証する。MoleculeによるRoleの自動テストとCI連携
- 【第6回】Windowsも支配する。WinRM接続とPowerShell操作の完全ガイド
- 【第7回】ネットワーク機器の自動化。Cisco/Juniperスイッチの設定管理
- 【第8回】新時代の実行環境。Ansible Builder/RunnerによるExecution Environment (EE)
第1章:なぜ今、コンテナ化なのか? (What is EE?)
これまで私たちは、yum install ansible や pip install ansible で、OS上に直接Ansibleをインストールしてきました。
しかし、この方法には限界があります。
従来の問題点(Dependency Hell)
- Pythonライブラリの競合: 「AWSモジュールを使いたいから
boto3を入れたら、Azureモジュールの依存関係が壊れた」。 - OS依存: 「開発者のMacでは動くけど、CIサーバーのRed Hat Enterprise Linuxでは
libxmlが古くて動かない」。 - Ansibleバージョンの違い: 「AさんはAnsible 2.9、BさんはCore 2.14を使っているため、挙動が違う」。
解決策:Execution Environment (EE)
Execution Environment (EE) とは、「Ansibleを実行するために必要なすべてを詰め込んだコンテナイメージ」のことです。
- Ansible Core 本体
- Python (3.9など)
- 必要なPythonライブラリ (boto3, pywinrmなど)
- 必要なAnsible Collection (amazon.aws, cisco.iosなど)
- 必要なシステムパッケージ (git, opensshなど)
これらを1つのDockerイメージに固めてしまいます。
実行時は、このイメージを使ってコンテナを立ち上げ、その中でPlaybookを実行します。
これにより、どこで動かしても100%同じ環境が保証されます。
第2章:環境定義ツール「Ansible Builder」
EEを作るためには、Dockerfileを手書きする必要はありません。
Ansible Builder というツールを使えば、設定ファイルから自動的に最適なDockerfileを生成し、イメージをビルドしてくれます。
1. Ansible Builderのインストール
作業用の端末(コントロールノード)にインストールします。
※DockerまたはPodmanが動く環境が必要です。
pip install ansible-builder
2. 定義ファイルの作成
作業ディレクトリを作り、以下のファイルを用意します。
execution-environment.yml (メイン設定):
---
version: 3
images:
base_image:
name: quay.io/centos/centos:stream9 # ベースOS
dependencies:
galaxy: requirements.yml # コレクション
python: requirements.txt # Pythonライブラリ
system: bindep.txt # OSパッケージ
additional_build_steps:
prepend_base:
- RUN pip install --upgrade pip setuptools
requirements.yml (Ansible Collections):
--- collections: - name: amazon.aws - name: cisco.ios - name: community.general
requirements.txt (Python Libraries):
boto3>=1.26.0 botocore>=1.29.0 pywinrm>=0.4.3
bindep.txt (System Packages):
git [platform:rpm] gcc [platform:rpm] python3-devel [platform:rpm]
3. イメージのビルド
以下のコマンドで、Dockerイメージを作成します。
ansible-builder build --tag my-custom-ee:1.0
裏側でDockerfileが生成され、docker build が走り、必要なものが全て入った my-custom-ee:1.0 というイメージが完成します。
第3章:新しい実行CLI「ansible-navigator」
EEを作ったら、どうやってPlaybookを実行するのでしょうか?
従来の ansible-playbook コマンドは、ローカル環境のAnsibleを使おうとするため、EEを使ってくれません。
そこで登場するのが、ansible-navigator です。
これは、TUI(テキストユーザーインターフェース)を備えた新しいCLIツールで、裏側でコンテナ技術を使ってEEを起動し、Playbookを実行してくれます。
1. インストール
pip install ansible-navigator
2. 実行 (TUIモード)
ansible-navigator run site.yml --execution-environment-image my-custom-ee:1.0 --mode interactive
実行すると、画面が切り替わり、リッチなUIで実行ログが表示されます。
エラーが出たタスクの詳細をドリルダウンして確認したり、変数の値を見たりすることができます。
※Dockerが入っていない環境では動きません(Podman等が必要)。
3. 実行 (標準出力モード)
従来のようにテキストログだけを出したい場合(CI環境など)は、--mode stdout を使います。
ansible-navigator run site.yml \ --execution-environment-image my-custom-ee:1.0 \ --mode stdout \ --pull-policy missing
これで、「ローカルにAnsibleが入っていなくても、DockerさえあればAnsibleが実行できる」状態になりました。
第4章:プログラムから実行する「Ansible Runner」
ansible-navigator は人間が使うツールですが、システム(WebアプリやCIツール)からAnsibleを呼び出したい場合は Ansible Runner を使います。
これは AWX (Ansible Tower) のバックエンドでも使われている、Ansible実行エンジンのコアです。
Ansible Runnerの特徴
- Python API: Pythonプログラムの中からAnsibleを実行し、結果をオブジェクトとして受け取れる。
- ディレクトリ構造による入力: 引数ではなく、所定のディレクトリ(
env/,inventory/,project/)にファイルを置くことでパラメータを渡す。 - コンテナネイティブ:
process_isolation=trueにすると、自動的にコンテナ(EE)の中で実行してくれる。
Pythonからの実行例
import ansible_runner
r = ansible_runner.run(
private_data_dir='/path/to/my/project',
playbook='site.yml',
process_isolation=True,
process_isolation_executable='docker',
container_image='my-custom-ee:1.0'
)
print("{}: {}".format(r.status, r.rc))
for each_host_event in r.events:
print(each_host_event['event'])
これを使えば、「自社の管理画面ボタンを押したら、裏でAnsible RunnerがEEコンテナを立ち上げて処理を実行し、結果をDBに保存する」といったシステムが簡単に作れます。
第5章:移行ガイド(venv から EE へ)
多くの現場では、まだ virtualenv (venv) でAnsibleを動かしていると思います。
どうやってEEへ移行すべきでしょうか?
Step 1: 依存関係の洗い出し
まず、現在の環境に入っているものをリストアップします。
pip freeze > current_requirements.txt ansible-galaxy collection list > current_collections.txt
Step 2: Builder定義ファイルの作成
洗い出したリストを元に、第2章の手順で requirements.txt と requirements.yml を作ります。
この時、不要なものは削ぎ落とし、本当に必要なものだけを定義するのがコツです。
Step 3: CI/CDパイプラインの更新
JenkinsやGitHub Actionsで pip install ansible している部分を、docker pull my-registry/my-custom-ee:1.0 に置き換えます。
そして実行コマンドを ansible-playbook から ansible-navigator (または docker run ...) に変更します。
💡 プロの経験談:環境統一の恩恵
あるプロジェクトで、開発者が「新しいライブラリを使いたい」と言い出しました。
以前なら、全サーバーと全メンバーのPCにそのライブラリを入れて回る必要がありましたが、EE導入後は「Builderの設定ファイルを1行書き換えて、イメージをビルドし、Registryにプッシュする」だけで完了しました。
翌日には全員が新しいイメージを自動でPullして使っていました。
このスピード感こそが、EE最大のメリットです。
第6章:Ansible講座 総まとめ
全16回、本当にお疲れ様でした!
入門編から応用編まで、私たちが歩んできた道のりを振り返りましょう。
入門編(基礎力の習得)
- 構成管理の概念: エージェントレス、冪等性。
- 環境構築: インベントリとansible.cfg。
- Playbook: YAMLの書き方と基本モジュール。
- 変数とテンプレート: 環境ごとの設定切り替え。
- Role: コードの部品化と整理。
- VaultとHandlers: セキュリティと効率化。
- 実践演習: LAMP環境構築。
- GUI管理: AWXとCI/CD。
応用編(プロフェッショナルへの道)
- Dynamic Inventory: クラウド環境への追従。
- 高度なロジック: Loop制御とJinja2フィルタ。
- チューニング: Mitogenによる爆速化。
- カスタムモジュール: Pythonによる拡張。
- 自動テスト: Moleculeによる品質保証。
- Windows管理: WinRMとPowerShell。
- ネットワーク管理: Cisco/Juniperの自動化。
- 実行環境 (EE): コンテナによる環境のポータビリティ。
これからの学習指針
Ansibleの学習に「終わり」はありませんが、「基礎」はこれで完璧です。
今後は以下の分野に挑戦してみてください。
- Event-Driven Ansible (EDA): 「アラート検知 → 自動復旧」をイベント駆動で実現する最新技術。
- Ansible Automation Platform (AAP): エンタープライズ向けの商用機能(Meshネットワークなど)。
- Kubernetes Operator: k8sのリソースをAnsibleで管理する。
おわりに:自動化エンジニアとしての未来
あなたがこの講座で手に入れたのは、単なるツールの使い方ではありません。
「繰り返しの苦痛から自分とチームを解放する力」です。
手動作業は、いつか必ずミスを生みます。そして何より、エンジニアの貴重な時間を奪います。
Ansibleを使って作業をコード化し、テストし、コンテナ化することで、あなたは「オペレーター」から「アーキテクト」へと進化しました。
エラーが出ても恐れないでください。ログを読み(-vvv)、仮説を立て、修正する。
そのサイクルの数だけ、あなたは強くなります。
長期間のお付き合い、本当にありがとうございました。
あなたの作ったPlaybookが、世界のどこかで誰かの助けになることを願っています。
Happy Automating!
▼ Ansibleの集大成を実践する ▼
コンテナ環境でAnsible
「VPS」で自分専用環境
自動化のスペシャリストへ
「ITエンジニア転職」

コメント