こんにちは。インフラの現場で幾多の障害を乗り越えてきたエンジニアです。
Ansibleを使っていると、必ずぶつかる壁があります。それが「OSのアップデート」や「巨大なソースコードのビルド」など、実行に時間がかかりすぎてSSHセッションがタイムアウトする問題です。
デフォルトのAnsibleは、タスクが完了するまでじっと待ち続けます。しかし、1時間かかる処理を制御ノードからSSHで繋ぎっぱなしにするのは、ネットワーク的にも運用的にも悪手です。
今日は、Ansibleの真骨頂である「非同期実行(Async)」を使い、タイムアウトという悪魔を退治するスマートな設計術を伝授します。これをマスターすれば、あなたのインフラ管理は「ただの自動化」から「洗練されたオーケストレーション」へと進化しますよ。
—
1. なぜ「async」と「poll」が必要なのか?
通常、Ansibleのタスクは同期的に動きます。しかし、重い処理を投げると、制御ノードとターゲットノード間のSSH接続が長時間維持され、ルーターやファイアウォールのセッションタイムアウトで切断されることが多々あります。
ここで登場するのが `async` と `poll` です。
- `async`: タスクをバックグラウンドで開始し、最大待ち時間を指定します。
- `poll`: 非同期タスクの進捗を確認する頻度(秒)です。`0` にすると「確認しない(Fire and forget)」となり、並列実行の威力が最大限に発揮されます。
—
2. 環境構築:まずは基本の「キ」
Ansibleがインストールされていない環境で、最短で環境を整えます。
Pythonのvenv環境作成(依存関係を汚さないのがプロの流儀です)
python3 -m venv ansible-env
source ansible-env/bin/activate
Ansibleのインストール
pip install ansible
バージョン確認
ansible –version
—
3. HelloWorldを超えた「非同期並列実行」の設計
ただ動かすだけなら簡単ですが、現場で使える「冪等性を意識した並列実行」を実装しましょう。
実践:非同期OSアップデートPlaybook
—
- name: 並列OSアップデートによるタイムアウト回避の極意
hosts: all
become: yes
tasks:
- name: 巨大なOSアップデートを非同期で実行
ansible.builtin.command: /usr/bin/dnf update -y
# async: 3600秒(1時間)まで待つ
# poll: 0 にすることで、処理の完了を待たずに次のホストへ並列処理を投げる
async: 3600
poll: 0
register: dnf_sleeper
- name: 全ホストのバックグラウンド処理の完了を待機
ansible.builtin.async_status:
jid: “{{ dnf_sleeper.ansible_job_id }}”
register: job_result
until: job_result.finished
# 30秒おきにステータスを確認
retries: 120
delay: 30
ここが技術のポイント:
1. `poll: 0` の魔法: これを設定すると、Ansibleはタスクを投げた瞬間に「次」へ進みます。これにより、インベントリに登録された全ホストに対して、ほぼ同時にアップデート処理が始まります。
2. `async_status` による収束: 全ての並列処理が走り出した後、`async_status` を使って一括で完了を待機(Join)します。これにより、全ての作業が終わるまで確実に待機し、結果をレポートできます。
—
4. 現場で震えるほど役立つ「3つの注意点」
このテクニックを使う際、以下の点だけは必ず胸に刻んでください。
1. リソースの枯渇に注意: `poll: 0` で100台同時にビルドを走らせると、制御ノードではなく「ターゲットノード」のCPUやメモリがパンクします。`serial` キーワードを併用し、一度に処理するホスト数を制限するのが大人の設計です。
- 例:`serial: 5` (一度に5台ずつ非同期処理を実行する)
2. 冪等性の担保: `command` モジュールは冪等性がありません。可能な限り `ansible.builtin.dnf` や `apt` モジュールを使いましょう。ただし、モジュールが `async` をサポートしていないケースでは、シェルスクリプトで冪等性を担保した状態を作ってから呼び出すのが定石です。
3. ログの確認: バックグラウンドに回すと標準出力がリアルタイムで見えなくなります。重要な処理は必ずログファイルにリダイレクトして、後から追跡できるようにしてください。
—
さあ、自動化の深淵へ
いかがでしたか?`async` と `poll` を使いこなすだけで、これまで「終わらない……」と祈るしかなかった長時間タスクが、見事に制御可能なピースへと変わります。
最初は難しく感じるかもしれませんが、この「非同期処理を制御下に置く」という考え方は、Kubernetesのコントローラー設計や、分散システムの構築にも通じる本質的なスキルです。
これをマスターすれば、毎日の面倒な定型作業から解放され、あなたはよりクリエイティブな「アーキテクチャの設計」に時間を割けるようになります。応援していますよ!