Ansibleの深淵へ:Action Pluginで「リモートホストの負荷」を極限まで削ぎ落とす技術
こんにちは。クラウドインフラの現場で、Ansibleのタスクが走り終わるのをただ眺めるだけの時間に飽き飽きしていませんか?
Ansibleは非常に強力ですが、デフォルトの挙動に甘んじていると、本来なら「コントローラー(手元)」で完結するはずの処理を、わざわざ「リモートホスト」にSSH接続して実行させてしまい、CPUやメモリを無駄に浪費することがあります。
今日は、Ansibleの裏側の挙動を制御する「Action Plugin」を使って、リモートホストの負荷を激減させる、現場レベルの極意を伝授します。これをマスターすれば、あなたのAnsibleコードは単なるスクリプトから、洗練された「インフラ自動化の芸術品」へと進化します。
—
1. Action Pluginとは何か?:Ansibleの隠れた司令塔
Ansibleのタスク実行フローを理解すると、なぜAction Pluginが必要なのかが見えてきます。
- Normal Task (Module): コントローラーからモジュールをリモートホストにコピーし、そこで実行して結果を返す。これが標準です。
- Action Plugin: タスクの実行プロセスに「割り込む」特殊なプラグインです。モジュールが実行される前に、コントローラー側で何らかの処理を行うことができます。
なぜAction Pluginを使うのか?
「リモートホストの情報を集めてから処理を分岐させたい」「巨大なファイルをリモート側で加工せず、手元でテンプレート化して送り込みたい」といった時、Normal Taskだと無駄な通信や計算が発生します。
Action Pluginを使えば、「リモートホストには必要最小限のコマンドしか投げない」という制御が可能になります。これが、大規模環境で生き残るための「負荷軽減」の定石です。
—
2. 実践:Action PluginのHelloWorld
まずは、コントローラー側で「Hello!」とログを出し、その後でリモート側でコマンドを実行するシンプルなプラグインを作成しましょう。
ディレクトリ構成
Ansibleのプロジェクトルートに、以下の構成を作成してください。
.
├── action_plugins/
│ └── my_hello.py # ここにプラグインを書く
└── playbook.yml
Pythonコード: `action_plugins/my_hello.py`
Action PluginはPythonで記述します。`ActionBase`クラスを継承するのがルールです。
from ansible.plugins.action import ActionBase
class ActionModule(ActionBase):
def run(self, tmp=None, task_vars=None):
# 1. コントローラー側での前処理
print(“\n[INFO] コントローラー側で前処理を実行中…”)
# 2. リモートホストへ実行命令を投げる(通常のモジュール実行)
# ここではcommandモジュールを呼び出す例
result = self._execute_module(
module_name=’ansible.builtin.command’,
module_args={‘_raw_params’: ‘echo “Hello from Remote Host!”‘},
task_vars=task_vars
)
return result
これだけで、あなたの書いたロジックがタスク実行の「司令塔」になります。
—
3. 実践:リモートホストの負荷を激減させる設計
ここからが本題です。例えば、「リモートホストの数千個のログファイルを解析して、特定の文字列があればアラートを出す」という処理を考えてみてください。
これを普通に書くと、`shell`モジュールで`grep`を回し、大量のログをコントローラーに持ち帰ることになります。これはネットワークとリモートホストのCPUを殺します。
最適化の戦略
1. コントローラー側で判断: Action Plugin内で、事前にリモートの環境変数を取得し、「本当に解析が必要か?」を判定する。
2. パイプラインの構築: 不要ならリモート側でコマンドを叩かずに即終了(`skipped`扱いにする)。
抜粋:最適化のロジックイメージ
def run(self, tmp=None, task_vars=None):
# リモートホストの特定のファイルが存在するか、コントローラー側で事前にチェック
# 必要ならここでリモートの負荷を一切かけずにタスクを終わらせる
if not self._remote_file_exists(‘/var/log/my_app.log’):
return {‘skipped’: True, ‘msg’: ‘Target file not found. Skipping…’}
# 存在する場合のみ、最小限のコマンドを実行する
return self._execute_module(…)
—
現場で震えるほど役立つ「極限の知見」
Action Pluginを書く際に意識すべきは、「コントローラーをいかに賢くするか」です。
- 冪等性の担保: リモートホストにコマンドを投げる前に、現在の状態をクエリし、変更が必要な場合のみモジュールを叩くように設計してください。
- 通信回数の最小化: SSH接続を何度も繰り返すのはコストです。Action Pluginを使えば、一度の接続で複数の処理を完結させる最適化が可能になります。
まとめ:次に進むために
Action Pluginを使いこなすと、Ansibleは単なる「設定管理ツール」から「インフラを意のままに操るオーケストレーター」へと変貌します。
最初は「`self._execute_module`をどう活用するか」から始めてみてください。一度このパワーを理解すれば、もう元の「ただタスクを並べるだけのプレイブック」には戻れなくなるはずです。
さあ、あなたのコードで、過負荷に喘ぐリモートホストたちを解放してあげましょう!質問があればいつでもどうぞ。あなたのエンジニアリングを全力で応援しています。