読者です 読者をやめる 読者になる 読者になる

orangain flavor

じっくりコトコト煮込んだみかん2。知らないことを知りたい。

FabricとCuisineを使って簡単に永続的なSSHトンネルを設定する

はじめに

インターネット越しにサーバー間で通信する際、通信内容を暗号化する方法としてSSHのトンネル(ポートフォワーディング)があります。autossh を使うと簡単にSSHトンネルを作れますが、サーバー間で 常時使う トンネルを作るための設定作業は意外と面倒です。

そこで、トンネルを作りたいと思い立ったときにコマンド1つで作れるよう、設定作業を自動化することにします。

初めはChef-Soloで設定しようかと思いましたが、Chef-Soloだと2台のホストにまたがる処理(クライアントで生成した公開鍵をサーバーにコピー)ができません。

このような用途に向いているツールとして、CapistranoやFabricがあります。Chefに慣れると冪等性がないのは辛いので、Fabric + Cuisine を使ってみました。

こんな構成のトンネルを、ワークステーションからコマンド1つで作れるようにします。

f:id:mi_kattun:20130805175118p:plain

前提条件

主にCuisineの制約条件から、以下の前提を満たす必要があります。

  • サーバー
    • OSがUnixベースである
  • クライアント
  • ワークステーション
    • Python/virtualenvがインストールされている
    • ServerとClientにSSHでログイン可能かつsudo可能である

完成形

というわけで 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はそこまでいかないような簡単な作業を自動化する用途に向いているでしょう。

参考サイト