しばたテックブログ

気分で書いている技術ブログです。

WindowsでFabricで遊ぶ


2015/12/05追記
SSHDをMicrosoft公式のOpenSSHに変えて遊びなおしてみました。

stknohg.hatenablog.jp

こちらも併せてご覧ください。


はじめに

はじめに断っておきますが、このエントリの内容はお遊びです。
最後以外まったく役に立ちませんのでご了承ください(

お仕事で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のポートを開けておく必要があります。

ユーザー認証の設定例

f:id:stknohg:20150217003106p:plain

f:id:stknohg:20150217003120p:plain

SFTPの設定例

f:id:stknohg:20150217003132p:plain

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.exePowerShell.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.cdfabric.context_managers.prefixは使えません。

    • Context Managerのcdprefix句では&&でwith内のコマンドを連結するため、&&でコマンドを連結できないPowerShellでは実行時エラーになります。 ちなみにCmd.exeなら以下の様なコードは利用可能です。
# -*- 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")
  • getputメソッドはSFTPのルート配下のディレクトリに対してのみ使えます。

    • もちろんfreeSSHd側でSFTPを有効にしている前提です。
  • fabric.colorsは使えません。

    • カラーコードのエスケープシーケンスが使えないので当然無理です。実行時にはエスケープシーケンスのコードが出力されるだけになります。

きちんと検証すればもっともっと制約は出てくると思います。

ちなみに、今回はSSHDにfreeSSHdを使いましたが、これをCygwin+bash+OpenSSHなんかにすればWindows上でもbashが動くのでこれらの制約が解消されてそれなりにFabricを使えるのではないかとは思います。
が、そこまでする気は起きませんでした。(あとCygwin入れたら負けかなって気持ちもあったので)

最後に

ここまでFabricの話をずっと書いておいてアレなんですが、Windows環境ならFabricを無理して使うよりvalentiaを使ったほうがみんな幸せになれます。間違いありません。

*1:正確にはparamikoの依存モジュールですが