Hack the World!

プログラミングや,ネットワークに関する話題を取り扱っています.知識をつけて,優雅にお仕事するのを目指しています.

更新が滞っていて申し訳ない。
最近はちょっとChefを勉強中です。

supervisord+unicornherder記事には割とアクセスが多いようなので、
そこら辺はChefをベースに組み立てをしようと考えています。

気づけばもう、2013年度も終わりですね。
来年度は色々と大きなことを考えているので、皆様よろしくお願いいたします。

graceful_life2013-12-15

取り留めもない日記
思いついたことをつらつらと書いてみた。

                                                      • -

最近ようやく自分に余裕が出てきたので勉強を再開した。

サーバーサイド、クライアントサイド共にこの1年のブランク(デスマ)のせいで遅れをとってしまっている。

Android

  • gradle build system
  • Dependency Injection (dagger,guice)
  • Gennymotion
  • 3.x、4.x 系の話題


Webアプリ

  • AltJS & Assets Management
  • Web Component


やりたいこと/生産性を高めるためにしなきゃいけない事はたくさんあるけども、どこかでこれを辞めなければいけないんだろうな。。。
また、泥臭い仕事に身をやつさなければならない。
自分一人で調べて活用するのは限界を感じている。

仲間を作れるポジションまでもう少しだ。
頑張ってみようかな?

                                                      • -

それはそうと仕事が何やらどんどん低レイヤーまでやらされる様になってきた。
まぁまだまだLinuxカーネルをちょっといじってみたりする程度ではあるが、
大学で勉強した内容が生きてきてちょっと楽しい。

数式とかはちょっと苦手だけど、わからなくもない。


理論と証明が伴わなければ、人には説明できないものね。


それはそれとして、工事的な所にも手を出さなくてはならなくなってきた。
デスマを渡って行くと、必然的にこういう仕事に当たることが多い。

ハードウェアを得意としてきたメーカーが、ソフトウェアに注力したけども、
ハードウェアに関するノウハウが絶えてしまった。

ヒトとお金と時間の管理だけして、場所やモノの管理を忘れてしまった。

そんな感覚
いや、もともとその程度の簡単なことすら出来ていなかったのかもしれない。
時間とお金とゆとりがあったからこそできていたのかもしれない。

そんなことを言ったって今を変えられるわけでは無い。
今をどうかえなきゃいけないのかを考えよう。

そんな中でも自分の価値を出していけるように、なんとかかんとかやっています。



と、いうわけで第一弾として、バーコードリーダーを買ってアプリを書いてみた。
(公開はしてないけども、興味があればご連絡ください。)

検品もらくらくできるようになった。
間違いも減らせる。
間違いが減るということは、後戻りのコストを減らすことが出来るということだ。

案件が忙しいせいで、正しく管理するのはコストだ。
上記を誠実に守れる人間が居るのでアレば、単なる取り越し苦労だけれども、
人間は誠実でもなければ、間違いを犯す。

だからこそ機械は正しくあるべきだし、そして人間がそれを正しく作ってやらなければならない。
人間が正しく作ってやるには限度があるけれど、それが「正しい」と定義してやることは出来る。

それは仕様です

なんて言葉もあるけどもこれは、正しさを前もって定義できなかった、ということだ。
そして、正しく作る事もまたとても難しい。


でもがんばろう。


誰も正しさを知らないのだから、それが正しいんだ!って広めよう。
そして、それを実現/遂行しよう。

それが、SE/SIerの仕事なのです。

楽々運用!Supevsord+unicorn/gunicornで作る、Linux daemon 手順 - trac/bloodhound  -

前回、supervisorや、unicornherderを用いた、Webアプリプロセスのdaemon化の概要について説明しました。
簡単な仕組みや、役割分担についても何となくご理解頂けたと思います。




1.概要編
2.手順編
2.1.trac with gunicorn(bloodhound)←今ここ
2.2.redmine with unicorn
3.その他




さて、今回は、trac(bloodhound) のDaemon化の具体的な設定を通じて、daemon化を共有したいと思います。

tracは、今回はApache bloodhoundを利用してみましょう。(事例も少ないので


設定手順は以下の通りです。

0.環境構築
1.Webアプリのgunicorn対応
2.Webアプリのunicornherder対応
3.supervisorからの、Webアプリの起動
4.supervisorの、init scriptの登録

                                                                  • -


0.環境構築


pythonは、virtualenvを使って、そのアプリ特有の環境を構築する事が出来ます。
幸い公式の構築手順もvirtualenvを使う設定方法を提供しています。
https://issues.apache.org/bloodhound/wiki/BloodhoundInstall



今回は、bloodhound自体のインストールは主題ではないので割愛します。
各自実施してください。

また、以下のコマンドを追加で実行してください。

sudo pip install gunicorn supervisor unicornherder


1.Webアプリのgunicorn/unicorn対応

bloodhound/tracは標準でWSGIスクリプトが提供されていますので、gunicorn対応は非常に簡単です。
公式手順に従えば、installerの配下に、bloodhound/site/cgi-binというディレクトリが出来ており、
trac.wsgiというファイルがそれに当たります。

bloodhound/site/cgi-binに移動し、ファイル名を変更するだけです。

cd bloodhound/site/cgi-bin
cp trac.wsgi bh_wsgi.py




2.Webアプリのgunicorn / unicornherderからの起動

ここでは、gunicorn / unicornherderをコマンドで起動してみましょう。
そうすることで、次の手順の入力内容を検証できます。

コマンドを実行したら,表示されたURLにアクセスし、正しく表示されるか確かめてみてください。
 http://127.0.0.1:8000

■gunicornを利用して起動

■実行結果

(venv)bh@buntu:~/apache-bloodhound-0.7/installer/bloodhound/site/cgi-bin$ gunicorn -w 4 bh_wsgi:application
2013-12-03 23:50:23 [9003] [INFO] Starting gunicorn 18.0
2013-12-03 23:50:23 [9003] [INFO] Listening at: http://127.0.0.1:8000 (9003)
2013-12-03 23:50:23 [9003] [INFO] Using worker: sync
2013-12-03 23:50:23 [9008] [INFO] Booting worker with pid: 9008
2013-12-03 23:50:23 [9009] [INFO] Booting worker with pid: 9009
2013-12-03 23:50:23 [9010] [INFO] Booting worker with pid: 9010
2013-12-03 23:50:23 [9011] [INFO] Booting worker with pid: 9011

■unicornherderを利用して起動

■コマンド例
    unicornherder -u gunicorn  ― [gunicorn option] bh_wsgi:application

■実行結果
(venv)bh@buntu:~/apache-bloodhound-0.7/installer/bloodhound/site/cgi-bin$ python /home/bh/.virtualenvs/bh/bin/unicornherder -u gunicorn -- -w 4  bh_wsgi:application
2013-12-03 23:51:09,142  INFO      Unicorn booted (PID 9018)

reverse proxyを通じて bloodhound を利用する場合は、SCRIPT_NAME(詳しくはPEP333参照)を指定する必要があります。

(SCRIPT_NAMEは環境変数です。)

SCRIPT_NAME=“/sub/path” unicornherder -u gunicorn  ― [gunicorn option] bh_wsgi:application

これで、http://127.0.0.1:8000/sub/path で、bloodhoundが動作する用になります。


検索用(私が中々辿りつけなかったので)
subpath / suburl / sub path / sub url


3.supervisorからの、Webアプリの起動

ここまでくればsupervisordの入力内容は非常に簡単です。
が、その前に supervisordのコンフィグひな形を準備しましょう

$ sudo echo_supervisord_conf >  /etc/supervisord.conf

これで、/etc/supervisord.conf にコンフィグファイルが出力されているはずです。
各自修正を行ってください。
今回に関係のあるセクションのみ記載します。

/path/to/ になっているところは適宜修正を行ってください。
※ 全てが同じ内容ではないので注意

■/etc/supervisord.conf 

[program:bloodhound]
command=/path/to/gunicornherder             ; the program (relative uses PATH, can take args)
process_name=%(program_name)s           ; process_name expr (default %(program_name)s)
numprocs=1                                                 ; number of processes copies to start (def 1)
directory=/tmp                                              ; directory to cwd to before exec (def no cwd)
umask=022                                                  ; umask for process (default None)
priority=999                                                  ; the relative start priority (default 999)
autostart=true                                              ; start at supervisord start (default: true)
autorestart=unexpected                               ; whether/when to restart (default: unexpected)
startsecs=1                                                   ; number of secs prog must stay running (def. 1)
startretries=3                                                ; max # of serial start failures (default 3)
exitcodes=0,2                                               ; 'expected' exit codes for process (default 0,2)
stopsignal=QUIT                                          ; signal used to kill process (default TERM)
stopwaitsecs=10                                          ; max num secs to wait b4 SIGKILL (default 10)
stopasgroup=false                                        ; send stop signal to the UNIX process group (default false)
killasgroup=false                                          ; SIGKILL the UNIX process group (def false)
user=chrism                                                  ; setuid to this UNIX account to run the program
redirect_stderr=true                                      ; redirect proc stderr to stdout (default false)
stdout_logfile=/path/to/logfile_stdout            ; stdout log path, NONE for none; default AUTO
stdout_logfile_maxbytes=1MB                     ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=10                          ; # of stdout logfile backups (default 10)
stdout_capture_maxbytes=1MB                  ; number of bytes in 'capturemode' (default 0)
stdout_events_enabled=false                      ; emit events on stdout writes (default false)
stderr_logfile=/path/to/logfile_stderr            ; stderr log path, NONE for none; default AUTO
stderr_logfile_maxbytes=1MB                     ; max # logfile bytes b4 rotation (default 50MB)
stderr_logfile_backups=10                          ; # of stderr logfile backups (default 10)
stderr_capture_maxbytes=1MB                  ; number of bytes in 'capturemode' (default 0)
stderr_events_enabled=false                      ; emit events on stderr writes (default false)
environment=SCRIPT_NAME=“/path/to”,PATH=/path/to/venv/bin   ; process environment additions (def no adds)
serverurl=AUTO                                          ; override serverurl computation (childutils)

設定ができたら、以下のコマンドを実行しましょう

supervisord -c /etc/supervisord.conf

設定を変更したら、以下のコマンドで有効化出来ます。
stdout_logfile, stderr_logfile に指定したファイルなどを参考にしながら、
起動できるか試してみてください。

supervisorctl reload

4.supervisorの、init scriptの登録

さて、最後に supervisord 自身の自動起動の設定をしておきたいと思います。
init script の実行順序の管理は、各OS毎に利用しているシステム・ツールが異なっています。



Ubuntu/debian 仕組み:LSB(Linux Standard Base )Init, 管理ツール:sysv-rc-conf
RHEL/CentOS 仕組み:Upstart   , 管理ツール:chkconfig
 Gentoo             仕組み:Upstart   , 管理ツール:insserve
Mac               仕組み:Launchd ,管理ツール:launchctl

次世代のSystemdというものも開発されているみたいですね。


Githubには昔ながらのinit script(SysVinit準拠)等が公開されています。
https://github.com/Supervisor/initscripts

Ubuntuスクリプトは、コマンドを叩くだけの簡易なスクリプトのようです。(これで十分ですが

いかのコマンドを実行すれば、自動起動が有効になります。

$ sudo curl -o supervisord https://raw.github.com/Supervisor/initscripts/master/ubuntu
$ sudo chmod 755 supervisord
$ sudo mv supervisord /etc/init.d/
$ sudo update-rc.d supervisord defaults
 Adding system startup for /etc/init.d/supervisord ...
   /etc/rc0.d/K20supervisord -> ../init.d/supervisord
   /etc/rc1.d/K20supervisord -> ../init.d/supervisord
   /etc/rc6.d/K20supervisord -> ../init.d/supervisord
   /etc/rc2.d/S20supervisord -> ../init.d/supervisord
   /etc/rc3.d/S20supervisord -> ../init.d/supervisord
   /etc/rc4.d/S20supervisord -> ../init.d/supervisord
   /etc/rc5.d/S20supervisord -> ../init.d/supervisord

キモは、一番下のupdate-rc.dです。
initscript内部に書いてある、# Default-Start:     # Default-Stop:     等の、runlevelを指定する行を読み取って、
内部で必要なシンボリックリンクを形成してくれます。

S20等の意味は、また別途次回紹介したいと思います。


スクリプト自身が上手く動かない場合はスライドにも記載したように、以下のコマンドにて実行しましょう。
$ sudo sh -x /etc/init.d/supervisord [action]


参考
 http://serverfault.com/questions/96499/how-to-automatically-start-supervisord-on-linux-ubuntu




最後に、今回はセキュリティやOSへの副作用を無視した手順を紹介しました。
社内システムであれば問題ないかもしれませんが、社外に公開するシステムであれば、ユーザーを専用に用意するなどの対応を行ってください。

次回は簡単に無視したものの覚書をしておこおうと思います。

楽々運用!Supevsord+unicorn/gunicornで作る、Linux daemon 概要

最近、redmineやら、joruri gwやら、python,pyramidで作った自作アプリやら、trac(bloodhound)やら、色んなサービスを動かしています。



しかしながら、インフラ周りを触れる人の少ないこと少ないこと。
公開されていて、簡素なドキュメントのあるWebアプリですら、挫折してしまうこと有りますよね。
(私にも身に覚えが。。。


と言うのは、Webに求められている事が大変多くなっていることに原因があると思われます。

javascriptなどを用いたアーキテクチャの変異などアプリケーション層が複雑化してきている事
フレームワークの手厚いサポートにより、
開発者はアプリケーション層に専念できるようになっていること(その反面、インフラまで手が伸びない。


また、昔ほど長期間エンジニアを抱えてる現場も少なくなってきたように感じます。
一つの言語やフレームワークを使ってノウハウを築く事も難しくなってきたと思います。
(最もその前にフレームワークなど各所で変更が発生ので、結局勉強は余儀なくされます。



さて、そんな中で、上に上げたようなrailsアプリやら、自分で作ったpyramidアプリを運用してますが、サーバサイドのインフラ周りに対する理解が不足しているので、少し教育がてら、
daemon周りの便利なツールの紹介やら手段を3回位に分けて、共有したいと思います。

1.概要編 ←今ここ
2.手順編
3.その他





スライドには詳しくは書きませんでしたが、
最近はWebアプリのプロセスは、純粋なhttpサーバとはプロセスを分離する事で、
インターブリターのプロセス起動のオーバーヘッドを減らしています。

これにより、ユーザーのストレスを軽減すると言う狙いがあります。


そのためフレームワーク側でも、それに最適なdaemonを動かしています。

supervisordを用いることで、daemonの作成コストを減らし、
複雑なシェルスクリプトを管理する必要性を排除しました。運用者の学習コストを減らしました。

また、実行ユーザを明示する事で、セキュリティに対する意識を植え付ける事ができたと思います。
(rootで動かしてたら意味ないですが。




所でこのスライドまだ発表してないのですが、どこか発表場所ありませんかね?


概要類はご理解いただけたと思うので
細かい設定類は、別記事としてあげようと思います。

書評:O'Reilly Media、SDN: Software Defined Networks - An Authoritative Review of Network Programmability Technologies

SDN: Software Defined Networks

SDN: Software Defined Networks

会社の図書施設に購入リクエストを投げたら買ってくれたので、レビューしてみます。


■基本情報

  • 出版社:O’REILLY MEDIA
  • 著者:Thomas D. Nadeau、 Ken Gray(Juniper社プラットホーム開発部所属)
  • 紙の本の長さ: 386 ページ
  • 価格(Kindle):¥ 2,927
  • 価格(PB *1 ):¥ 6,311 *2


本著は、基本情報にもあるJuniper社のSDNの一人者によって書かれた書籍であり、
当然SDNについても詳しく書かれているのだが、既存のネットワークのプログラム制御(Programmability)についても
幅広く解説した書籍でもある。

既存のネットワーク技術に触れながらその問題点を指摘し、SDNならこうであろう、と言った観点や
SDNの登場人物である、コントローラー、スイッチ、NFVの役割と現在の実装のアーキテクチャにも触れている。
また、後半部分では実際にありえる複雑なユースケースを例に挙げて居るため、非常に有用な書籍である。



オススメしたい読者を上げるとすると、ネットワーク技術者・ソフトウェア技術者どちらにも読んでもらいたい内容ではあるが、
それよりもSEが全体像を把握する為の書籍として抑えておいて欲しい事が書かれている。
そして、なにより今まさに大規模のネットワークの効率化をソフトウェアで出来ないか?また実現手法は?と検討している人にとって、
うってつけの書籍だと考えられる。



ジャンルを挙げるとすれば、読み物+技術調査報告書と言った物と捉えて手にとって欲しい。
これだけの幅広い内容が詰まって、1万円を切るのであれば(電子書籍なら3千円!)
なんたら報告書を数万円で買うことに比べればとても安い。

友人も苦慮していたが、市場調査報告書やらこんな感じの事をすれば楽になるよ、の様な社内報告書は上がってくるのだが、
中々具体的には、までリーチしない報告書がとても多い。
そんな中で、こういった具体的な手段までが書かれている報告書(書籍)は稀であり、有用だと考える。


また、ソフトウェア技術者として見ても、非常に勉強になる。
オープンソースのコントローラの内部実装や使われている技術用語を抑える事ができる。
また、非常に汎用的なフレームワークを使っているのが見て取れるため、
その技術を持っている人からすれば、仕事に繋げやすいのでは無いかと思われる。
また、全く知らない人も技術用語を抑える為にも、分からないなりに目を通して欲しい。(切実





私自身は、本書籍を元に、既存のレガシーネットワークでの自動化・効率化等を考えてみたい、と言うか考えなければいけないので、
Network Programmabilityという点で非常に助かっており、この本を元に策を練っていこうと考えています。
# ここでどこまで共有できるかはわかりませんが

仕事としても、こういった領域の話をできる会社さんは探していたりはするのですが、なかなか難しいですね。


社内にもこんな感じで情報共有したいけど、その前に日本語化してくれないものか。
と言うか、翻訳させてもらえないのかな?

企画の持ち込み方誰か教えてください。

*1:ペーパーバック

*2:2013/11/20現在の価格