Fabricを触っている 〜エンジニアであるということを今一度アピールしておきたい〜

前置き

このブログを書き始めてから既に4ヶ月が経過した。雑記から商品の紹介、糖質制限の経過報告や飛ばし記事、ゴシップ、恋愛や性愛、読書感想等様々な記事をテキトウに書いてきたが、僕の趣味や興味、仕事の範疇で一つだけ書いていないジャンルの記事があることにふと気がついてしまった。技術ネタである。

技術ネタ?と言われても分からない読者の皆様も多いと思うので簡単に説明すると、とある新しい技術の使い方とか、とある通信技術のTipsとか、とあるframeworkの比較だとか・・と言っても伝わらない人が殆どだと思うが、そういう専門的なコンピューター技術に関するネタだ。「グラブルの共闘を支えるリアルタイム通信技術」とか、「FGOの課金処理を支える基盤技術」とか、こういう言い方をすると分かりやすいかもしれない。

僕は所謂エンジニアだ。初対面の人に「僕の仕事は何だと思う?」と聞くと、99%の確率で5回連続で聞いても間違うし、見た目や服装から僕が技術者であることは想像できないと言われることが殆どだ。とは言え、みなさんが使っているようなサービスの裏側、みなさんが毎日必死に課金しているようなゲームの裏側を作る人間であることは間違いない。

少し話はそれるが、マッチングアプリ等でのプロフィールには「エンジニア」ではなく「デザイナー、クリエイティブ関係」と書いている。その方が「っぽい」と言われるし分かりやすくウケが良いからだ。申し訳ない。エンジニアと書いていても疑われるし、書いていないと「美容師?」「バンドマン?」と間違われること100回以上の経験がある。マッチングアプリ上の僕は、デザイナーかカメラマン、クリエイティブ・ディレクターを名乗っているので、遭遇した方は生暖かい目で見守ってほしい。

さて、今は会社でゲームサービスの裏側を作っているが、学生時代からウェブサービスのバックエンド側を長期インターンで学びながら作らせてもらったり、その経験が今の技術者である自分につながっていたりするのだが、今日はそんな技術ネタを、このブログに初めて書こうと思う。ネタは「Fabric」だ。以降技術ネタになるので、正直面白くないと思うので興味のある人だけ見て欲しい。

Fabricとは

FabricはPython 製のデプロイ・システム管理ツールだ。最近、構築や運用を自動化するための様々なツールが出てきているが、それぞれ特徴があるものの、使うまでに覚えることが多かったりして手間がかかることが多い。しかし、Fabric は非常にシンプルなツールで、今からすぐにでも使うことが出来る。Fabric はデプロイ・システム管理ツールで、類似のツールとしてRuby言語製のCapistrano がある。

Fabric特長は、シェルスクリプトを書き慣れた人がいきなり利用できるところだと感じる。シェルスクリプトとしてまとめていたコマンドをそのまま run() メソッドや sudo() メソッドで囲むだけで使うことが出来る。シェルスクリプトは何でもできるが、少しでも複雑なことをすると、非情なぐらい読みにくいスクリプトになってしまうことは、経験者なら誰しもがわかることだろう。

シェルスクリプトの良いところ

  • とりあえず動く
  • さくっとかける
  • bashが動く、zshが動く

シェルスクリプトの悪いところ

  • なぜか動かない
  • 全体的に構文がわかりにくい
    • $1 とか $*
    • 謎のfor文
    • 謎にスペースに厳密
    • 処理の流れを追うのが辛い
    • 並列処理の制御が難しい
    • いやもう触りたくない、、、

Fabricだったら・・

  • Pythonで動く
  • Capistrano的に使える
  • bashもzshも簡単に叩ける
  • リモートホストで任意のコマンド実行が可能
  • 並列処理や逐一処理もお手のもの 日本語ドキュメントがある!!!!

日本語ドキュメントがあるというのはとてもうれしいことで、技術者は往々にして英語に対して苦手意識を持っている人が多いのですが、大体最新技術等は英語で説明されたものしかなかったりするのですが、Fabricは日本語ドキュメントが用意されているのです。嬉しい。

導入

前提環境

  • OS X El Capitan Homebrew導入済み pyenv導入済み

pipのインストール

Installation — pip 8.1.1 documentation

こちらの公式サイトの手順通りにやれば問題ないが要点をつまむと

$ wget https://bootstrap.pypa.io/get-pip.py ~/Desktop

--2016-04-18 15:56:57-- https://bootstrap.pypa.io/get-pip.py
Resolving bootstrap.pypa.io... 103.245.222.175
Connecting to bootstrap.pypa.io|103.245.222.175|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1522812 (1.5M) [text/x-python]
Saving to: 'get-pip.py'

get-pip.py 100%[===================>] 1.45M 9.07MB/s in 0.2s

2016-04-18 15:56:58 (9.07 MB/s) - 'get-pip.py' saved [1522812/1522812]

/Users/madoka/Desktop: Scheme missing.
FINISHED --2016-04-18 15:56:58--
Total wall clock time: 0.6s
Downloaded: 1 files, 1.5M in 0.2s (9.07 MB/s)

$ python ~/Desktop/get-pip.py

fabricのインストール

$ pip install fabric

taskを作ってみる

hello world

fabfile.py

def hello():
    print("Hello world!")

shell

$ fab hello
Hello world!

Done.

引数渡し

fabfile.py

# coding: utf-8
 
def hello(name="world"):
    print("Hello %s!" % name)

shell

$ fab hello:name=まどか様
Hello まどか様
 
Done.

ローカルでシェルを叩く

fabfile.py

from fabric.api import local
 
def ls():
    local("ls -l")

shell

$ fab ls
[localhost] local: ls -l
total 16
-rw-r--r--  /hoge/Domain/Users  191  2  9 12:31 fabfile.py
-rw-r--r--  /hoge/Domain/Users  991  2  9 12:31 fabfile.pyc
 
Done. 

関数呼び出し

fabfile.py

from fabric.api import local
 
def pwd():
    local("pwd")
 
def ls():
    local("ls -l")
 
def pwd_ls():
    pwd()
    ls()

shell

$ fab pwd_ls

[localhost] local: pwd
/Users/a13379/Documents/workspace/madoka/fabric_tutorial
[localhost] local: ls -l
total 16
-rw-r--r--  /hoge/Domain/Users  191  2  9 12:31 fabfile.py
-rw-r--r--  /hoge/Domain/Users  991  2  9 12:31 fabfile.pyc
 
 
Done. 

リモートホストで実行

fabfile.py

# coding: utf-8
 
from fabric.api import *
from fabric.decorators import task
 
env.use_ssh_config = True
env.user = "madoka"
env.hosts = ['oreno-shinsekai']
 
@task
def remote_pwd_ls():
    remote_pwd()
    remote_ls()
 
def remote_pwd():
    run("pwd")
 
def remote_ls():
    run("ls -l")

shell

$ fab remote_pwd_ls
[oreno-shinsekai] Executing task 'remote_pwd_ls'
[oreno-shinsekai] run: pwd
[oreno-shinsekai] out: /home/share/madoka
[oreno-shinsekai] out:
 
[oreno-shinsekai] run: ls -l
[oreno-shinsekai] out: total 0
[oreno-shinsekai] out:
 
Done.
Disconnecting from 10.103.... done.

まとめ

このentryでは以下のことをやりました。

  • fabfileのタスクを定義し、それを fab で実行
  • local でローカルのシェルコマンドを呼び出し
  • settings で env 変数を変更
  • ホストリストの定義と run のリモートコマンド実行

ご存知の通り、Fabricはpython製なので、複雑になってこればコードを分けて部品化し構造化すれば良いし、python特有の処理でより完結なプログラムを書くことが可能だ。いつまでもシェル芸人をやっていないで、自動化の波に乗るしか無い。今まではRuby製のCapistranoしか触れる機会がなかったが、今回python製のFabricに触れることができとても楽しかった。Pythonは触ったことのない言語だったので、新しい言語を覚える良い機会にもなり幅が広がる。趣味でも業務でも、自分の知識を増やすことはとても楽しいので、これからも独学を続けつつ業務にも活かせれば良いなと思うばかりだ。

参考

パーフェクトPython (PERFECT SERIES 5)

パーフェクトPython (PERFECT SERIES 5)

  • 作者: Pythonサポーターズ,露木誠,ルイス・イアン,石本敦夫,小田切篤,保坂翔馬,大谷弘喜
  • 出版社/メーカー: 技術評論社
  • 発売日: 2013/03/05
  • メディア: 大型本
  • 購入: 1人 クリック: 65回
  • この商品を含むブログ (30件) を見る

Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)

Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)

  • 作者: Sebastian Raschka,株式会社クイープ,福島真太朗
  • 出版社/メーカー: インプレス
  • 発売日: 2016/06/13
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る