2015/12/05追記
SSHDをMicrosoft公式のOpenSSHに変えて遊びなおしてみました。
こちらも併せてご覧ください。
はじめに
はじめに断っておきますが、このエントリの内容はお遊びです。
最後以外まったく役に立ちませんのでご了承ください(
お仕事でFabricをちょこっと使ってて、その環境はCentOSやRHELなんですが、私がメインで扱うのはWindowsなのでWindows環境でFabricがどこまで使えるのか試してみたのが今回の内容になります。
Fabricについて
Fabricが何なのかについては下の記事が人気がある様なのでそちらで確認してください。
一般的にはデプロイツールとして捉えられていますが、個人的には単純なリモートシェルの実行ツールだと思って気軽に使ってます。
WindowsにFabricをインストールする
WindowsにFabricをインストールするのは割とあっさり出来ます。
以下に手順を示します。Windows 8.1で動作確認をしています。
Pythonのインストール
最初にPythonをインストールします。
FabricはまだPython3系には対応してないのでPython2をインストールします。
Pythonの公式バイナリを適当にインストールしてください。
最新のVer.2.7.9ならpipも初期インストール可能なので一緒にインストールしてください。
Microsoft Visual C++ Compiler for Python 2.7のインストール
Fabricの依存モジュールの1つであるpycrypt
*1をインストールする際にバイナリモジュールのビルドが必要になるためVC++コンパイラをインストールします。
http://aka.ms/vcpython27からダウンロードしてインストールしてください。
ちなみに、コンパイラが無いままFabricをインストールしようとすると以下の様なエラーメッセージが表示されます。
building 'Crypto.Random.OSRNG.winrandom' extension warning: GMP or MPIR library not found; Not building Crypto.PublicKey._fastmath. error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat). Get it from http://aka.ms/vcpython27
Fabricのインストール
あとはpipからFabricをインストールするだけです。
pip install fabric
ついでにCuisineもインストール可能です。
pip install cuisine
これでWindowsでもFabricを利用することができます。
WindowsをSSHサーバーにする
Windowsには標準のSSHDが存在しません。
なので外部のツールを使用しなければならないのですが、今回はfreeSSHdを使ってSSHサーバーを立ててみます。
動作確認はWindows Server 2012 R2で行っています。
freeSSHdのインストール
freeSSHdのダウンロードページからfreeSSHd.exe
をダウンロードしてインストールしてください。
インストール時に聞かれることはほとんど無いので画面の指示に従って適当にインストールしてください。
freeSSHdの設定
freeSSHdの設定は基本的にデフォルトでOKなのですが、認証ユーザーの設定とSFTPを有効にしておいてください。 あと、Windows FirewallのSSHのポートを開けておく必要があります。
ユーザー認証の設定例
SFTPの設定例
Windows Firewallの設定例
# PowerShellでTCP22ポートを開ける例 New-NetFirewallRule -Name SSH-In -DisplayName SSH-In -Description "SSH inbound communication." -Enable True -Profile Any -Direction Inbound -Action Allow -Protocol TCP -LocalPort 22
WindowsでFabricで遊ぶ
FabricをインストールしたWindows 8.1からSSHサーバーにしたWindows Server 2012 R2に対してコマンドを実行して遊びます。
Fabricはデフォルトでシェルにbashを使う様になっているため、最初にこれをWindows向けに変えてやる必要があります。
fabfile.py
の中で以下の様にenv.shell
の値をCmd.exe
かPowerShell.exe
に変えるとWindowsでもコマンドを実行することができます。
fabfile.py例
# -*- coding: utf-8 -*- from fabric.api import * def check_ipaddress(): # Windows Server相手なのでシェルを変える # Cmd.exe / PowerShellどちらでも使うことができます。 env.shell = "Cmd.exe /C" #env.shell = "PowerShell.exe -Command" run("ipconfig /all")
fab
コマンドはWindowsでも他のプラットフォームでも同じコマンド体系ですので適当に実行します。
コマンド実行例
fab -H 192.168.0.100 -u use_name -p password check_ipaddress
Windowsでの制約
Fabric(やCuisine)は内部処理でbashやその他Unix系シェルで動作することを前提とした部分が多数あるため、WindowsでFabricを扱おうとすると様々な制約が出てきます。
その制約を何点か記載します。
sudo
メソッドは使えません。- Windowsにsudoコマンドが無いため実行時エラーとなります。
シェルをPowerShellにした場合、
fabric.context_managers.cd
やfabric.context_managers.prefix
は使えません。- Context Managerの
cd
やprefix
句では&&
でwith内のコマンドを連結するため、&&
でコマンドを連結できないPowerShellでは実行時エラーになります。 ちなみにCmd.exeなら以下の様なコードは利用可能です。
- Context Managerの
# -*- coding: utf-8 -*- from fabric.api import * def get_user_dir(): env.shell = "Cmd.exe /C" # cdやprefixはシェルがCmd.exeなら使える with cd("C:\\Users\\"): with prefix ("echo Sample Prefix"): run("dir")
get
、put
メソッドはSFTPのルート配下のディレクトリに対してのみ使えます。- もちろんfreeSSHd側でSFTPを有効にしている前提です。
fabric.colors
は使えません。- カラーコードのエスケープシーケンスが使えないので当然無理です。実行時にはエスケープシーケンスのコードが出力されるだけになります。
きちんと検証すればもっともっと制約は出てくると思います。
ちなみに、今回はSSHDにfreeSSHdを使いましたが、これをCygwin+bash+OpenSSHなんかにすればWindows上でもbashが動くのでこれらの制約が解消されてそれなりにFabricを使えるのではないかとは思います。
が、そこまでする気は起きませんでした。(あとCygwin入れたら負けかなって気持ちもあったので)
最後に
ここまでFabricの話をずっと書いておいてアレなんですが、Windows環境ならFabricを無理して使うよりvalentiaを使ったほうがみんな幸せになれます。間違いありません。
*1:正確にはparamikoの依存モジュールですが