Ansibleで多段踏み台(ProxyJump)を制する:SREが現場で絶対にやるべき「SSH接続の深淵」
現場でAnsibleを運用していると、必ず突き当たる壁がある。「開発環境、ステージング、本番とネットワークがセグメント分離され、しかも多段踏み台を通らなければターゲットに届かない」という、いわゆるネットワークの要塞だ。
多くのエンジニアは、この壁を前にして`ansible_ssh_common_args`を試行錯誤し、結局「動けばいい」という汚い設定で放置する。だが、それは技術的負債の始まりだ。今日は、世界最高峰のインフラ構築現場で培った、多段SSHを「透過的」かつ「爆速」に処理するためのプロの設計論を伝授する。
—
1. なぜ「ProxyJump」一択なのか:ProxyCommandの過去と未来
かつて、踏み台接続といえば`ProxyCommand`で`nc`(netcat)を叩くのが定石だった。しかし、OpenSSH 7.3以降、`ProxyJump`が標準となり、これが現代の正解だ。
ProxyJumpが優れている理由
- 簡潔さ: 設定が直感的で、多段構成(Jump1 -> Jump2 -> Target)を `-J jump1,jump2` と繋げるだけで表現できる。
- 効率: SSHプロトコルレベルで多重化を処理するため、TCP接続の確立が速い。
- 冪等性: 複雑なコマンド文字列をパースする必要がないため、Ansibleの実行時エラーが激減する。
—
2. Ansibleで多段踏み台を「完全自動化」する実装パターン
`ansible.cfg` や `inventory` にベタ書きするのはアンチパターンだ。チーム全員の環境で再現させるために、SSH Configの分離とAnsibleの変数管理を分離せよ。
実践的な `~/.ssh/config` の構成例
まず、SSH側で接続ルートを定義する。これによりAnsible側はホスト名を呼ぶだけで良くなる。
チームで共有すべきベース構成(~/.ssh/config)
Host jump-bastion
HostName bastion.example.com
User admin
IdentityFile ~/.ssh/id_rsa_team
Host target-server
HostName 10.0.1.5
ProxyJump jump-bastion
User deploy
# 重要: 多段転送時のタイムアウトを制御し、セッションを維持する
ServerAliveInterval 60
ServerAliveCountMax 3
Ansible側の最適化 (`ansible_ssh_common_args`)
Ansibleが接続する際、追加引数を最小限にするのが、クリーンなIaCの極意だ。
inventory/group_vars/all.yml
ansible_ssh_common_args: ‘-o ControlMaster=auto -o ControlPersist=60s -o ForwardAgent=yes’
解説:
- `ControlMaster=auto`: 接続を再利用する(SSHコネクションの多重化)。これだけでデプロイ速度が3倍変わる。
- `ControlPersist=60s`: 接続を60秒間維持し、連続するタスクで接続コストをゼロにする。
—
3. 踏み台経由のSCP/SFTPが遅い?「パイプライン」を解放せよ
Ansibleのデフォルト設定では、SSH接続ごとにSCP/SFTPのハンドシェイクが発生し、多段環境ではこれがボトルネックになる。
神設定:Pipeliningを有効化せよ
`ansible.cfg` で以下を設定するだけで、転送効率が劇的に向上する。
[ssh_connection]
デフォルトFalseだが、必ずTrueにする。
Pythonのスクリプトを一時ファイルに書き込まず、SSHセッション上で直接パイプする。
pipelining = True
※注意: `become`(sudo)を使用する場合、リモート側の `/etc/sudoers` で `Defaults requiretty` を無効化しておく必要がある。これを行わないとPipeliningは機能しない。
—
4. 現場の生産性を極限まで高める「隠し味」
① チーム開発で役立つ「設定の共有化ルール」
`inventory` ディレクトリの中に `ssh_config` を同封し、Ansible実行時に `-F` オプションで強制指定させる設計がベストだ。
実行コマンドのベストプラクティス
ansible-playbook -i inventory/prod site.yml \
–ssh-common-args=”-F ./ssh_config”
② 必須の神プラグイン/ツール
- `ssh-agent` の活用: 鍵をいちいちパスフレーズ入力するのは時間の無駄。`ssh-add -K` でキーチェーン管理し、`ForwardAgent=yes` で踏み台へ鍵を渡す。
- `mitogen for Ansible`: 転送量を極限まで減らしたいなら、これを見逃すな。Ansibleの通信を劇的に高速化する代替ストラテジーだ。
③ 開発スピードを上げるショートカット(VS Code)
VS Codeの `Remote – SSH` 拡張機能を使っているなら、`~/.ssh/config` を直接編集するのではなく、「Remote Explorer」からホストを追加し、SSH Configを自動生成させること。
そして、`Ctrl + Shift + P` で `Remote-SSH: Connect to Host` を呼び出すキーバインドをカスタマイズして、常にワンタッチでターゲットに飛び込める状態を作れ。
—
最後に:SREとしての心構え
「接続できない」というトラブルシューティングに時間を溶かすエンジニアは、一生「作業者」のままだ。
ネットワークの構造を理解し、SSHという古くからある強力なプロトコルの挙動を制御下に置くこと。それができれば、どんなに複雑なマルチクラウド環境であっても、Ansibleはあなたの最強の武器になる。
今日紹介した設定を、今すぐあなたのプロジェクトの `ansible.cfg` と `ssh_config` に反映せよ。接続の待ち時間がなくなるだけで、インフラエンジニアの思考速度は一段階深まるはずだ。