Ansibleの深淵へ:Action Pluginでリモート負荷を「ゼロ」に近づける極限最適化
Ansibleを使いこなしていると、必ず壁にぶつかる。「なぜ、このタスクにこれほど時間がかかるのか?」「なぜ、毎回全ホストに無駄な接続を繰り返すのか?」と。
多くのエンジニアは`shell`や`command`を叩き、あるいは既存のモジュールを組み合わせて満足する。だが、真のSREは違う。「コントローラー側で完結できることは、ネットワーク越しに行わない」。これが大規模インフラを制御するための鉄則だ。
今日は、Ansibleの隠された秘宝「Action Plugin」を解き放ち、リモートホストの負荷を劇的に削減する設計思想を伝授する。
—
1. Action Pluginとは何か:制御の「中枢」を奪還せよ
Ansibleの実行フローを正しく理解しているか?
- Normal Task (Module): コントローラーから引数をシリアライズし、リモートへ転送し、Pythonコードを送り込み、実行し、結果を回収する。これには多大なオーバーヘッドがある。
- Action Plugin: タスクの実行プロセスそのものを「コントローラー側」でハンドリングする。
Action Pluginの真価は、リモートホストに何も送らずに、あるいは最小限のペイロードだけでロジックを完結できる点にある。 大量ノードに対して「条件判定」や「複雑なデータ加工」を行う際、Action Pluginを使えば、リモート側のCPU負荷やネットワークトラフィックをゼロに抑え込める。
—
2. 実践:カスタムAction Pluginのコーディング
例えば、「リモートホストの情報を元に、複雑な計算を行い、特定の条件を満たす場合のみタスクを投げる」という処理を考えてみよう。
ディレクトリ構成は `plugins/action/my_custom_action.py` とする。
plugins/action/my_custom_action.py
from ansible.plugins.action import ActionBase
class ActionModule(ActionBase):
TRANSFERS_FILES = False # ファイル転送を無効化し、無駄な通信を遮断
def run(self, tmp=None, task_vars=None):
super(ActionModule, self).run(tmp, task_vars)
# 1. コントローラー側で計算(リモートへの負荷は0)
target_nodes = task_vars.get(‘ansible_play_hosts’, [])
result = {“changed”: False, “skipped”: True}
# ここで複雑なロジックを展開。
# 例:特定のフラグが立ったノードのみを精査し、次のステップを決定
if len(target_nodes) > 100:
result[‘msg’] = “大規模クラスタのため、特定ノードのみを対象化”
return result
このプラグインが強力なのは、`TRANSFERS_FILES = False` を設定することで、Ansibleの標準的な「モジュールファイル転送処理」をバイパスできる点だ。
—
3. 現場で震えるほど役立つ:最適化のベストプラクティス
「神」設定ファイル構成
チーム開発で最も避けたいのは、環境変数の汚染とハードコードだ。以下の構成を推奨する。
group_vars/all.yml
ansible_ssh_retries: 3
ansible_pipelining: True # 必須。これを有効にしないSREは即刻退場だ。
ansible_ssh_args: “-o ControlMaster=auto -o ControlPersist=60s -o ForwardAgent=yes”
- Pipeliningの有効化: モジュール実行時の接続数を劇的に減らす。これだけで実行速度が3〜5倍になることもある。
開発スピードを加速させるキーボードショートカット (VS Code)
Ansible開発における「黄金の組み合わせ」だ。
- `Ctrl + Shift + P` -> `Ansible: Lint Document`: 文法チェックを自動化せよ。
- `Alt + Up/Down`: YAMLのインデントを壊さずにタスクを移動。
- `Ctrl + /`: 複数タスクを一括コメントアウトし、デバッグの高速化。
導入すべき「神」プラグイン
- Ansible Lint: 規約違反を犯す者は、コードベースを汚す者と同義だ。CIに組み込むのは当然。
- mitogen for Ansible: これを導入するだけで、Pythonのシリアライズ・デシリアライズ時間が短縮され、実行速度が別次元になる。
—
4. チーム開発における「絶対ルール」
1. 冪等性(Idempotency)の証明:
`changed: true` をむやみに返さないこと。`command` モジュールを使うなら必ず `creates` や `removes` 引数で状態監視を行え。
2. モジュール化の徹底:
`tasks/main.yml` に100行以上書いているなら、即座に `include_tasks` で分割しろ。可読性は「正義」だ。
3. 設定の共有化:
`ansible.cfg` をプロジェクトルートに置き、`[defaults]` セクションで `collections_paths` や `roles_path` を絶対パスではなく相対パスで管理せよ。
—
最後に:エンジニアとしての矜持
Ansibleは単なる自動化ツールではない。インフラという巨大なシステムを、コードという「言語」で記述する芸術だ。Action Pluginを駆使し、リモートホストの負荷を限界まで削ぎ落とすことは、単なる最適化ではなく、エンジニアとしての「美学」である。
「動けばいい」という段階を卒業し、インフラの深淵を覗き込みたいなら、今すぐ Action Plugin の自作に取り掛かってほしい。その先には、これまで見えなかった最適化の景色が広がっているはずだ。
さあ、次は君のコードでインフラを支配する番だ。