FabricとCuisineを使って簡単に永続的なSSHトンネルを設定する
はじめに
インターネット越しにサーバー間で通信する際、通信内容を暗号化する方法としてSSHのトンネル(ポートフォワーディング)があります。autossh を使うと簡単にSSHトンネルを作れますが、サーバー間で 常時使う トンネルを作るための設定作業は意外と面倒です。
そこで、トンネルを作りたいと思い立ったときにコマンド1つで作れるよう、設定作業を自動化することにします。
初めはChef-Soloで設定しようかと思いましたが、Chef-Soloだと2台のホストにまたがる処理(クライアントで生成した公開鍵をサーバーにコピー)ができません。
このような用途に向いているツールとして、CapistranoやFabricがあります。Chefに慣れると冪等性がないのは辛いので、Fabric + Cuisine を使ってみました。
こんな構成のトンネルを、ワークステーションからコマンド1つで作れるようにします。
前提条件
主にCuisineの制約条件から、以下の前提を満たす必要があります。
完成形
というわけで orangain/permanent_ssh_tunnel を作りました。
例えば、ワークステーションで以下のコマンドを実行するだけで、dbclient:13306
から dbserver:3306
へ常時利用可能なトンネルが作られます。
$ git clone https://github.com/orangain/permanent_ssh_tunnel.git $ cd permanent_ssh_tunnel $ virtualenv venv (venv) $ . venv/bin/activate (venv) $ pip install -r requiements.txt (venv) $ fab setup:dbclient,dbserver,local_port=13306,remote_port=3306
メインの処理は最後の行だけで、以下のように引数を指定します。引数の詳細はfabfile.pyのsetup関数をご参照ください。
fab setup:<client>,<server>,local_port=<local_port>,remote_port=<remote_port>,…
処理内容
setupタスクでは、以下の処理をしてくれます。
- クライアント
-
autossh
ユーザーを作成する。 - 秘密鍵・公開鍵のペアを生成する。
- known_hostsにサーバーのエントリを追加する。
-
autossh
のパッケージをインストールする。 -
autossh
サービスのUpstart設定ファイルを作る。 -
autossh
サービスを起動する。
-
- サーバー
-
autossh
ユーザーを作成する。 - クライアントで生成した公開鍵をauthorized_keysに追加する。
-
Fabric+Cuisineを使ってみて
Fabricは、Pythonの関数がタスクとなり、SSHをラップしたrun関数を使ってリモートホストで処理を実行する、というわかりやすさが良い点です。
Cuisineは、Fabricで使える冪等性を保証した関数を追加するライブラリなので、Fabricのわかりやすさを保ったまま冪等に書けるのは魅力的です。
しかし、Cuisineは現在のところはUbuntuメインのようで、パッケージ関連の関数はyumなども使えるものの、サービス関連の関数はUpstartが前提となっています。
本格的なサーバー構成に使うのであればChef/Puppet/Ansibleなどが向いており、Cuisineはそこまでいかないような簡単な作業を自動化する用途に向いているでしょう。