Ansible × 閉域網:踏み台サーバ(Jumphost)を「透明化」する究極の接続設計
現場のインフラエンジニア諸君。管理対象が数台ならSSHの多段設定で凌げるが、数百台のクラスタを閉域網で運用する際、`ProxyCommand`の場当たり的な設定は「負債」でしかない。
今日は、Ansibleを使い倒し、踏み台サーバの存在を意識させない「透過的リモート管理」を実現する極限の構成を紹介する。これは単なる設定解説ではない。「いかにして接続のオーバーヘッドをゼロに近づけ、運用の認知負荷を下げるか」という設計思想の話だ。
—
1. SSH Configを「インフラのコード」として扱う
多くのエンジニアが陥る罠は、AnsibleのInventoryに接続情報を詰め込みすぎることだ。接続プロトコルに関わる複雑な設定は、AnsibleではなくSSHの責務として分離する。これが鉄則だ。
神設定:`~/.ssh/config` のベストプラクティス
踏み台経由の接続を抽象化し、Ansibleからは「直接接続しているかのように」見せる。
~/.ssh/config
踏み台サーバの定義
Host jumpbox
HostName jump.example.com
User admin
IdentityFile ~/.ssh/id_rsa_jump
閉域網内のターゲットノード(ワイルドカード活用)
Host 10.0..
# 踏み台を経由して接続。-Wオプションで標準入出力を転送する
ProxyCommand ssh -W %h:%p jumpbox
User deploy_user
IdentityFile ~/.ssh/id_rsa_internal
# 接続の多重化(ControlMaster)を有効化し、SSHハンドシェイクを高速化する
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
ControlPersist 10m
【プロの知見】 `ControlMaster` と `ControlPersist` は必須だ。Ansibleのタスク実行時に毎回SSHハンドシェイクを行っていては、数分レベルのオーバーヘッドが生じる。これを設定するだけで、2回目以降の接続は既存のコネクションを再利用し、爆速になる。
—
2. Ansible Inventoryの最適化:抽象化の美学
Inventoryには「どうやって繋ぐか」ではなく「どんな役割のノードか」を書くべきだ。
hosts.yml
all:
children:
production:
hosts:
app-server-01:
ansible_host: 10.0.1.10
app-server-02:
ansible_host: 10.0.1.11
vars:
ansible_ssh_common_args: ‘-o ProxyCommand=”ssh -W %h:%p jumpbox”‘
もし踏み台が複数あるような複雑なマルチホップ環境なら、`ansible.cfg` で `ssh_args` をグローバル制御するよりも、`group_vars` で制御するのがチーム開発では健全だ。
—
3. プロキシ環境下における「環境変数」の汚染を防ぐ
プロキシ越しにAPIを叩く際、`http_proxy` 環境変数がAnsible全体に干渉して事故を起こすケースが多い。`ansible.cfg` での制御は極めて重要だ。
ansible.cfg
[ssh_connection]
接続時にローカルの環境変数を不用意に持ち込まない
必要なプロキシ設定は環境ごとに個別に渡すのが鉄則
pipelining = True
【現場の教訓】 `pipelining = True` は必ず有効にせよ。Ansibleがモジュールを転送する際に、中間ファイルを作成せずパイプ経由で実行することで、I/Oと実行速度が劇的に向上する。
—
4. チーム開発を加速させる「神プラグイン」と設定ルール
必須プラグイン:`mitogen`
Ansibleの実行速度を10倍にする「Mitogen for Ansible」は導入検討の余地がある。既存のSSH接続を再利用し、Pythonインタープリタの起動回数を激減させる。
チーム開発のルール(隠れた鉄則)
1. `ansible.cfg` の共有: プロジェクトルートに必ず配置し、`ansible_managed` テンプレートを有効化せよ。自動生成ファイルに「誰がいつ変更したか」を刻み込むのは、SREとしての矜持だ。
2. `ansible-vault` の活用: 踏み台の鍵情報すらも平文で置いてはいけない。`ansible-vault` で暗号化し、秘匿情報をGitで安全に管理する。
—
5. 接続タイムアウトのトラブルシューティング
「なぜか繋がらない」をゼロにする。以下のチェックリストを叩き込め。
- SSH KeepAlive設定: 踏み台がセッションを切断するなら、`ServerAliveInterval 60` を `~/.ssh/config` に追記せよ。
- MTU値の確認: 閉域網でパケットサイズが制限されている場合、SSHのハンドシェイクでパケットがドロップすることがある。`ProxyCommand` に `-o TCPKeepAlive=yes` を追加する。
- verboseモードの活用: `ansible-playbook -vvvv` でSSHのデバッグログを追え。`debug1: next connection to jumpbox` の段階で止まっているなら、踏み台のIP到達性の問題だ。
—
最後に:エンジニアとしてのマインドセット
Ansibleは単なる自動化ツールではない。「手動運用の不完全さを排除し、再現可能な世界を構築するための抽象化レイヤー」だ。
踏み台サーバを越えることは、インフラの深淵に触れる第一歩である。ここで紹介した「透過的接続」を実装すれば、君のチームは「接続待ち」という無駄な時間から解放され、ビジネス価値を生むコードを書くことに集中できるはずだ。
さあ、今すぐ `~/.ssh/config` を書き換え、Ansibleの実行を「一瞬の儀式」に変えてこい。