serverspec を使って初めてのインフラテスト
仕事でserverspecを使ってテストを行ったのでその時のメモを公開します
provisoning toolにはchef(chef-solo)を使っています、今まではvagrant + chefでテスト環境を構築するだけでしたが production環境にもcookbookを定期用する事になりました、今まではテスト環境の構築だったので例えばiptablesはoffとか の設定をしていましたがそういうわけにも行かず一度全てのcookbookの見直しを行い、足りない部分は追加しました
production環境にcookbookを適用するにあたってやはりcookbookが正しいかどうかを1台づつ確認するのはさすがに手がかかり すぎるしコストもかかります、何より正しいかどうかもうたがしいです
って事でテストを書く事にしました、今となっては当たりの事ですが今までアプリのテストは書いてましたがサーバのテストを 書くのは初めてです
サーバのテストを行うにあたって色々ツールがあるようですが、一番簡単で汎用的なserverspecを使う事にしました
以下ログです
$ install
rubyはinstallされている前提です
# gem install serverspec
$ init
テストを作成するdirectoryに移動
# cd [test directory]
init
# serverspec-init Select OS type: 1) UN*X 2) Windows Select number: 1 Select a backend type: 1) SSH 2) Exec (local) Select number: 1 Vagrant instance y/n: n Input target host name: 192.168.33.10 + spec/ + spec/192.168.33.10/ + spec/192.168.33.10/httpd_spec.rb + spec/spec_helper.rb + Rakefile
色々聞かれるけどとりあえず 1) 1) n を選択
実際のテストに使ったResource Types
netを検索すると色々情報が出てきますがとりあえず公式サイトが一番わかりやすかったです
Resource Types に使えるresourceとサンプルコードが載っています
実際に使ったresourceを以下に紹介します
package resource
describe package('httpd') do it { should be_installed } end
be_installed
package('httpd') に記述されているpackageがinstallされているかをテスト
file resource
describe file('/etc/httpd/conf/httpd.conf') do it { should be_file } it { should contain "DocumentRoot \"/home/ecocatcms/current\"" } end
service resource
describe service('httpd') do it { should be_enabled } it { should be_running } end
port resource
describe port(80) do it { should be_listening } end
be_listening
port(80) に記述されているportが開いているかをテスト
command resource
describe command('convert --version') do it { should return_stdout /ImageMagick/} end
return_stdout
command('convert --version')に記述されたcommandを実行した結果から return_stdout /ImageMagick/ に書かれた記述が存在するをテスト 記述の仕方は正規表現も使える
iptables resource
describe iptables do it { should have_rule('-P INPUT ACCEPT') } it { should have_rule('-P FORWARD ACCEPT') } it { should have_rule('-P OUTPUT ACCEPT') } it { should have_rule('-A INPUT -p icmp -j ACCEPT') } it { should have_rule('-A INPUT -i lo -j ACCEPT') } it { should have_rule('-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT') } it { should have_rule('-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT') } it { should have_rule('-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT') } it { should have_rule('-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT') } it { should have_rule('-A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT') } it { should have_rule('-A INPUT -p tcp -m state --state NEW -m tcp --dport 587 -j ACCEPT') } it { should have_rule('-A INPUT -j REJECT --reject-with icmp-host-prohibited') } it { should have_rule('-A FORWARD -j REJECT --reject-with icmp-host-prohibited') } end
have_rule
have_rule('-P INPUT ACCEPT')に記述された設定がされているかをテスト
php_config resource
describe 'PHP config parameters' do context php_config('date.timezone') do its(:value) {should eq 'Asia/Tokyo'} end context php_config('post_max_size') do its(:value) {should eq '5000M'} end context php_config('upload_max_filesize') do its(:value) {should eq '5000M'} end context php_config('extension_dir') do its(:value) {should eq '/usr/lib64/php/modules'} end context php_config('enable_dl') do its(:value) {should eq 1} end end
selinux resource
describe selinux do it {should be_disabled} end
be_disabled
selinuxがdisabledになっているかをテストする、ほかにもbe_enforcing, be_permissiveがある
user resource
describe user('deploy') do it {should exist} it {should belong_to_group 'deploy'} it {should have_home_directory '/home/deploy'} it {should have_login_shell '/bin/bash'} end
exist
user('deploy') が存在するかをテスト
belong_to_group
user('deploy') がbelong_to_group 'deploy'に属しているかをテスト
have_home_directory
user('deploy') のhome directoryが should have_home_directory '/home/deploy' かどうかをテスト
have_login_shell
user('deploy') のshellが should have_login_shell '/bin/bash' かどうかをテスト
$ run test
以下のコマンドでテストを実行します
# rake spec
.........................................................
Finished in 2.2 seconds
57 examples, 0 failures
テストが成功したら「.」が表示されます、テストが失敗したら「F」で表示されて、エラーの内容が表示されます エラー内容と一緒に裏で吐かれているコマンドも一緒に表示されます
$ tips
serverspecはテストの実行時にserverspecを実行するPCにログインしているユーザでテストを実行するサーバにログイン しようとします
クライアントPCがmacでテストを行うサーバがlinuxなどの場合はデフォルトのままでテストを実行するとテストサーバに対して macにログインしているユーザ名でログインしようとしてしまします
僕の場合は「spec/spec_helper.rb」を以下のように編集しました
- c.ssh = Net::SSH.start(host, user, options)
+ options[:password] = "password"
+ c.ssh = Net::SSH.start(host, "user", options)
options[:password] = "password"
鍵認証の場合は問題ないかと思いますが、僕の場合は普通にpassword認証を行うので直接passwordを書き込みました
c.ssh = Net::SSH.start(host, "user", options)
「"user"」にテストを行う対象のサーバにログインするユーザ名を直接設定しています
今回はじめてインフラのテストをしましたが、serverspecはとても使いやすかったです、chefに依存してないところが気に入りました 開発環境のvagrantにも、本番のsakura VPSにも同じようにテストを流す事ができました
次回はdockerなんかを使ってCIをまわす環境を構築してみようかと思います
でわでわ、失礼します
OSをMarvericksにしてphp-buildでphpをinstallしたら「configure: error: Cannot find libz」って言われた時の対処方法
ターミナルから以下のコマンドを実行する
$ xcode-select --install
実行後installコマンドを発行
$ php-build 5.4.19 ~/.phpenv/versions/5.4.19
問題なくinstallできました
参考サイト
php freamwork なにを使おうか迷ったのでとりあえず調べてみた
今作ってるアプリはフロントをangularjsで作っていて、サーバサイドはjsonを返すだけの仕様にしています とりあえず先にフロントを作りこんだ状態でサーバはdummyのphpがあるだけです
サーバサイドのfreamworkなにつかおうと思って調べてみたので以下に書きます
比較対象のfreamwork
ちなみに僕はphoerなのでphp freamworkを比較しました
過去12ヶ月で比較
日本の場合
cakephpが突き出た感じ、laravelがもうちょい上がってるかとおもいきやそんなにでした
全ての国の場合
世界的にはCodeIgniterが完全に突き出てるが、laravelが急激に追い上げている感じでしね
どうするか?
日本ではcakephpの情報量の多さとコミュニティがしっかりしている点はかなりの魅力かと思います、 新しいfreamworkを追いかけてみるという点ではlaravelを追いかけるのも面白いと思います
cakephpは何度か触った事があるがlaravelはほぼ触ってないのでlaravelを触ってから検討しようかと思います
追記
今後の勉強も兼ねてrubyで作るのもありかと思います、ruby の場合は必然的にrailsになるのかな? json返すだけならSinatraでもいいのかな? まったくの知識ゼロなので調べてみるとしよう
またレポートします
「エンジニアのためのリーンスタートアップ」勉強会に参加してきました
DevLove関西の勉強会にいってきました、内容は「エンジニアのためのリーンスタートアップ」 僕自身起業しようとかそういった気持ちはないんですが、仕事で商品開発をしているのでその為 に役立つ事があるかと思って以前から書籍などには目を通していましたがあまり実感はなく実際の 話が聞ける良い機会だと思って参加してきました
僕が読んでいる本はこちら
紹介されていた本とは違ったので、上記の本が読み終わったら勉強会で紹介されていた以下の本も購入してみようかと思います
では勉強会で印象に残った事をメモ書きしましたので以下に書いていきます
リーンスタートアップ基本理解(和波俊久さん)
アイデアに価値は一切ない、マーケットが欲しいと思うようにアイデアを仕上げる
一番衝撃的な言葉でした
何を使って目的を達成するかが大事なポイント
同じパターンの成功例はないが、同じパターンの失敗例はある!!
マーケティング・リサーチをちゃんと行わない事がたたある、マーケティングの罠
自分に都合の良いデータだけを集めてしまう、会社に対して承認の判子を押させる為に!!
成功する前提でプロジェクトをスタートする為、ローンチしてもなにも起こらない、結果失敗する
マーケティング・リサーチではネガティブな情報を徹底的に検討する事が大事なポイント
この話はまさに現在働いている会社で起こっている事、会社の規模は20人程度ですが、自分のアイデアを正当化する為に 都合の良いデータを集めたり、成功する前提でのプロジェクトだったり、とあ〜あるあるって思いながらメモりました
実験を繰り返す
事業アイデアがフリマ化している
多産多死の時代
アイデアの価値は¥0
自分の思い込みをすてて、simpleにする事が大事
自分の思っている事は伝わらないと思ってほうがよい
マーケットがわかる言葉に置き換える
ここはかなり納得しました、僕自身伝えるのが下手くそなので、これから意識していこうと思いました
完成品は目指さない
仕事でのもの作りにおいてはかなり意識しているつもりだが、プログラマーのわるいくせが顔をだすので今後はもっと意識してぐっとこらえて 顧客からのフィードバックをもっと大事にしていこうと心に誓いました
また資料などに時間をかけすぎるなどの話はまさに現在進行形でしたので、考え直します
リーン・スタートアップを実践するうえで、現場が考える事が大事
提供される道具を教えられた通りに使うのではなく現場が判断し現場が使いやすいように考え、形を変えることが大事なポイント
上司などから強制的におこなった事は失敗する
リーンスタートアップ実践事例(齋藤瑛史)
マーケット・イン、プロダクト・アウトは既にスピードが遅い
妙に納得、調査だけに半年も時間をかけるって、マーケティングが得意な45歳ぐらいのおっさんに違和感を感じていたのはこの 事がと思いました
主にユーザインタビューからフィードバックを得ている
分析は資産である
ナレッジの蓄積
分析は基本的に1週間単位で行っているが、分析の項目として長期的な目で見ている内容もある
ユーザの獲得にはBlogが効果的だった
- 1日に2,3本postしている
個人的に気になって聞けなかった事あベンチマークはどのようにしたのかとかを聞きたかったです
ワークショップ(和波俊久さん)
ワークショップは基本的には手を動かすというかとなりの人と喋って自分が将来なにをするかを考えそれを発表する という形でした
自分が将来なにをするかを常に考える・言語化・書く・しゃべるこれは起業するとかではなく大事な事かなと心に刻みました
発表自体は1分間で話すでしたが、僕自身の発表は最後のほうだったので考えてまとめる時間があったのでうまく話せた方かな〜 と個人的には思っています
将来なにをしたいかを考える事は自分を商品として見た時にも結構大事なポイントやなと思い、自分自身を商品としてみた時に 自分の価値を伝える上で非常に大事なポイントになると思い今後ずっと考えてblogなどにアウトプットしていこうと思いました
また今後しゃべる機会があればどんどん喋っていこうと思います
一つこころ残りはなのは懇親会に参加出来なかった事です・・・
devLove関西に参加したのは2回目ですが、今後も参加していこうと思います
ありがとう御座いました
AirMac の設定を見なおしたら早くなりました
先日airmacを買って設定したところあんまり早くならなかった事をブログにpostしたところ @void_No3さんにtwitterでアドバイスを頂いたので設定を変更して見ました
@box406 速くするなら、SSIDを5/2.4GHzで分け、5のほうだけにつなぐ。マルチキャストレイトは中に(高すぎるとかえって遅くなることも)
オプションキーを押してリスト選んで5/2.4ともに11n『のみ』に
http://t.co/B3XiSGO2NB
— Kusakabe Youichi (@void_No3) 2013, 11月 25
なにも設定していない状態
設定変更後
めちゃくちゃはやくなった感はないですが、リビングでこの速度がでれば満足です、これからも設定都度設定を見直そうかと思います
@void_No3さん ありがとう御座いました
でわでわ
DevLove 関西 ~Decision~に行ってきました
初めてDevLoveのイベントに参加しました、今までに参加してきた技術系のイベントなどとは一味違っていて 開発系のイベントではあるが技術の話がでないのがなにか新鮮な感じがしました
僕が参加したセッションは以下になります
組織の中でアジャイルな開発をするということ 椎葉 光行(@bufferings)
プログラマから経営者へ変わる決断と、プログラマを一生の仕事にする決断 倉貫 義人(@kuranuki) 伊藤 淳一(@jnchito)
キャラ立ちしたエンジニアになる! 新原 雅司(@shin1x1)
大企業、未踏ソフトウェア、起業 - 様々な働き方から学んだ「モノ作り」のエッセンス 染田 貴志(@tksmd)
未来のために我々の帆をたてよう 市谷 聡啓(@papanda)
今回イベントに参加したきっかけは一度倉貫さんの話を聞いてみたいと思っていた事がきっかけでした 結果どのお話も印象的で得るものがたくさんあったかと思います
得に印象に残ったセッションを下に紹介させて頂きます
組織の中でアジャイルな開発をするということ 椎葉 光行(@bufferings)
椎葉さんの話は組織の中で実際にアジャイル開発を行ってその中で感じた事や実際に行った施策などの話をされて とても実践的な内容でした
得に印象に残ったのが本に書いてある事をそのまま実践されていない事でした、自分たちのスタイルに合わして 柔軟に対応してされていました、得に交渉可能スケジュールのつくり方は真似してみようと思いました
エンジニアでなくてもわかりやすいスケジュールはとても印象に残りました
あとやはりビジネスゴールの共有は改めて大事だと感じました
あと振り返り出来てないなーって自分に言い聞かせました
キャラ立ちしたエンジニアになる! 新原 雅司(@shin1x1)
僕自身がphperという事もあり、phpカンファレンスなどで発表している新原さんは何度か見た事はあります が今回はほぼ技術的な話題はなかったのでとても新鮮でした
なになにの人のように自分になにかのキャラをつける事で「知ってもらう」、「覚えてもらう」、「思い出してもらう」 たしかにこれ大事やとめちゃくちゃ思いました
自分にキャラをつける事で自分の商品価値を上げる事にも通じるなと真剣に考えさせられました
全てのセッションを通じて感じた事は自分に出来る事を理解し、商品としての自分の価値を正しく理解する事 が大事なのかなと感じました
あとやっぱ発表している人たちはすごく楽しんでいたのが印象的でした、自分もそうなりたいと強く思いました
これからも自分の興味のある分野にはどんどん参加していこうかと思います