【実務・中級編】AnsibleでSSH鍵の多重ホップとJump Host設定を極める:ProxyJumpとProxyCommandの高度な使い分け – インフラ構成管理(IaC)活用バイブル

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` に反映せよ。接続の待ち時間がなくなるだけで、インフラエンジニアの思考速度は一段階深まるはずだ。

タイトルとURLをコピーしました