15
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Ansible 2でSSHまわりの設定をinventoryで管理しつつ多段SSHする話

Posted at

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段以上のホップができるようになりました。

役立つ場面がすごく限られますが、誰かの役に立てると幸いです。

15
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?