tl;dr
2段以上ホップする多段SSH設定をinventoryで指定するなら、ProxyCommand用のシェルスクリプトを用意する。
inventoryとは(おさらい)
Inventory — Ansible Documentationより
- Ansibleで構成管理するホスト情報などを設定しておくもの
- デフォルトは
/etc/ansible/hosts
を利用するけど、-i <paht>
で指定できる - クラウド上のリソースから動的にinventoryを取得するDynamic Inventoryという機能もある
- 今回は詳細を割愛
- 単一のファイルに全情報を記載するのではなく、hostごと / groupごとの inventory を用意することもできる
SSHまわりの設定をinventoryで管理する話
以下のページに、inventoryで指定できるパラメータ一覧があります。
List of Behavioral Inventory Parameters
SSH用の色々な設定をinventoryで管理できます。
Ansibleを実行したあとで確認のために結局SSHしたりするので、
あまりInventoryで全部を管理することもないと思いますが git clone
してすぐデプロイできたり便利かもしれません。
(各々でssh_configを設定するところが属人化しちゃうのを、どうにかしたいと思いました。)
私がハッとしたのは ansible_ssh_common_args
というパラメーターで、多段SSHするための ProxyCommand
を設定できたことです。
ただ、以下のように2段以上ホップするときにinventoryでは1つのProxyCommandしか指定できないことに気づきました。
[ Local ] -> [ Proxy A] -> [ Proxy B ] -> [ Target host ]
そこでSSH自体のProxyCommandについて深掘りしてみると、以下のブログとマニュアルを見つけました。
コマンドは基本的にどのようなものでもかまいませんが,標準入力から入力をうけつけ標準出力に出力するものである必要があります。そして最終的にはどこかのマシンで動いている sshd サーバや inetd 経由の sshd -i に接続する必要があります
The command can be basically anything, and should read from its standard input and write to its standard output. It should eventually connect an sshd(8) server running on some machine, or execute sshd -i somewhere.
ProxyCommandは実はどんなものでもよくて、標準入力と標準出力をつないで最終的にどこかにSSHすればいいということで
inventoryで指定するProxyCommandをあるシェルスクリプト実行のコマンドにしました。
[target]
target001 ansible_host=zzz.zzz.zzz.zzz ansible_user=root ansible_ssh_private_key_file=/path/to/secret/key.pem ansible_ssh_common_args='-oProxyCommand="./proxy.sh"'
シェルスクリプト内部で好きなだけProxyCommandを指定することで、何段でもホップすることが可能になります。
以下のサンプルではncコマンドを使っていますが、ssh -W
でもいけると思います。
#!/bin/sh
ssh -i /path/to/secret/key.pem -p 22 -oProxyCommand="ssh -p 22 root@xxx.xxx.xxx.xxx nc yyy.yyy.yyy.yyy 22" root@yyy.yyy.yyy.yyy nc zzz.zzz.zzz.zzz 22
inventoryで指定した ansible_host
が意味なくなるのでは、とか色々とツッコミどころがありそうですが、とりあえずワークアラウンド的に2段以上のホップができるようになりました。
役立つ場面がすごく限られますが、誰かの役に立てると幸いです。