Sqale の Puppet と Chef (と テスト)

hiboma
@hiboma
Sqale の
Puppet と Chef
2013年5月10日金曜日
• 伊藤洋也 (いとう ひろや)
• 株式会社 paperboy&co. 6年目氏
• 弟 30年目氏
• 技術基盤エンジニア
• ホスティングの開発業務に関わってる時間が多め
@hiboma
2013年5月10日金曜日
どっちも買って下さい
2013年5月10日金曜日
前置きの話
• レンタルサーバー / ホスティング
• 分譲マンションモデル
• リソースの切り売り
2013年5月10日金曜日
ユーザーで共有されるリソース
システム管理者用リソース
PHP Perl Ruby Python Apache postfix sshd
user A user B user C user D
ユーザーごとのリソース (任意のタイミングで追加/削除)
レンサバ モデルレイヤ
nagios munin fluentd ldap
ftpd
resque
2013年5月10日金曜日
Sqale
2013年5月10日金曜日
2013年5月10日金曜日
2013年5月10日金曜日
http://www.slideshare.net/mizzy/inside-sqales-backend-at-sapporo-ruby-kaigi-2012
Sqaleのバックエンド諸々
2013年5月10日金曜日
* PaaS *
2013年5月10日金曜日
今日の話
• アプリがうごく環境
• 「コンテナ」と呼んでいます
2013年5月10日金曜日
Sqaleのコンテナ
• Rubyコンテナ
• Nginx + Rackアプリ
• PHPコンテナ
• Apache2.4 + PHP-FPM
2013年5月10日金曜日
コンテナの実体
• LXC ( Linux Container )
• chroot + namespace + cgroup
• 仮想化 = 隔離、分離、制限
• プロセスレベルでの仮想化
• chroot な環境を作らないといけない !
• 構成管理だ!
2013年5月10日金曜日
構成管理
• ということで構成管理の話
2013年5月10日金曜日
構成管理
• Sqale は 基本的に Puppet 管理
• appサーバー(Rails)とか
• gitリポジトリ管理サーバーとか
• アプリをビルドする build サーバーとか
• queueサーバー(resque) とか ... etc
• ユーザのアプリを動かすサーバーが特殊
• Puppet と Chef
2013年5月10日金曜日
EC2 Instance
PHP Apache phpenv ruby unicorn nginx
chef-solo で chroot環境chef-solo で chroot環境
ldap munin nagios rbenv kernel cgroup
Puppet の土台
/var/rootfs/ruby/var/rootfs/php
lxc-start lxc-start lxc-start lxc-start
2013年5月10日金曜日
Puppetのレイヤ
• LDAP とか munin とか nagios とか 何かいろいろ
• ログインしてオペできる土台
• カーネルも
• LXC を動かせる土台
2013年5月10日金曜日
Puppet + AWS 自動化
http://www.slideshare.net/lamanotrama/on-aws-sqale
2013年5月10日金曜日
Chefのレイヤ
• Puppet の土台の上に
• chroot 環境を chef-solo で作る
• ユーザーごとの環境も chef-solo で作る
• ユーザー追加のタイミングで作る
2013年5月10日金曜日
Chefでchroot環境
• chroot 環境を Chef 管理
• /var/rootfs/php # PHP用
• /var/rootfs/ruby # Ruby用
• chroot してから chef-solo 流す
• レシピは mount --bind してホストOSを参照
• レシピの作り方は慣例通り
• Ruby や PHPに必要なものをガッと入れる
2013年5月10日金曜日
Why Chef ?
• chroot するので ホスト名ベースでレシピを当てられない
• なので chef-solo にした
• puppet apply でもできるかも
2013年5月10日金曜日
#レンサバあるある
2013年5月10日金曜日
#レンサバあるある
• ユーザを追加する度に環境作成
• アカウントの追加
• ストレージ ($HOME) の作成
• mkdir したり
• uid:gid 変えたり
• パーミッション変えたり
• ミドルウェアの設定追加
• 例) httpd.conf
2013年5月10日金曜日
#ホスティングあるある
• たんぽぽ作業
• chef-solo で作ろう
2013年5月10日金曜日
ユーザー作成
user node.username do
action :create
end
directory "/var/www/#{node.username}" do
owner node.username
group node.username
action :create
mode "0755"
end
template "/etc/httpd/conf.d/#{node.username}.conf" do
notifies :restart, "service[httpd]"
source "httpd.conf.erb"
owner "apache"
group "apache"
mode "0644"
end
service "httpd" do
action :restart
end
{
"username": "sushi",
}
attribute/sushi.json
2013年5月10日金曜日
ユーザー作成
• attributeで変数を注入 *1
• ユーザー名を変えて環境複製
• べき等性 = 上書き、やり直しも簡単
(注) 任意の値を入れると死ぬので要バリデート
2013年5月10日金曜日
ユーザー削除
• 消す時にも便利
• べき等性が効いてくる
user node.username do
action :remove
end
directory "/var/www/#{node.username}" do
action :delete
end
file "/etc/httpd/conf.d/#{node.username}.conf" do
notifies :restart, "service[httpd]"
action :delete
end
service "httpd" do
action :restart
end
2013年5月10日金曜日
chef-solo -j <URL>
• でも attribute ファイル作るの面倒じゃないですか ...
• chef-solo -j <URL> 便利 そう
$ sudo chef-solo -j http://chef-api.example.com/user/fuga
chef-api.example.com
ユーザ収容のサーバーs
① kick
② chef-solo
2013年5月10日金曜日
Sqale
• sqale でも ユーザごとに attribute を作って管理
2013年5月10日金曜日
コンテナ作成のchef-solo
{
"run_list": [
"role[create_container_ruby]"
],
"sqale": {
"consecutive_number": "1",
"container_id": "1",
"port_offset": "0",
"project_name": "ruby",
"role": "ruby",
"username": "namahage"
}
}
$ sudo chef-solo -j namahage_sqale_1.json
• Resqueワーカーが chef-solo
attribute/namahage-ruby-1.json
2013年5月10日金曜日
仕様変更
• 仕様変更したい場合も chef-solo
• 1. レシピ更新
• 2. chef-solo 再度実行
• 3. コンテナのプロセスを再起動
• 4. 仕様 update !
• ユーザ名に依存しちゃうような仕様を変える際に便利
2013年5月10日金曜日
DSL
• #{node.key.value} と埋め込むのはイマイチ
• ふつうのRubyのコードっぽくなるし ...
• 内部DSLを逸脱するので若干 BK な匂い
2013年5月10日金曜日
DSL
• ラップするクラスを入れてキレイに
• "define" でラップするのも良いですかね
directory lxc.userfs_root "/home/sqale/current" do
owner "sqale"
group "sqale"
mode "0755"
recursive true
action :create
end
directory "/var/sqale/namahage/ruby/1/home/sqale/current"
after
2013年5月10日金曜日
• puppet apply でもできそう ?
• antipopさん お願いします
2013年5月10日金曜日
混ぜるな危険 !!!!1
• Puppet と Chef が混在 していましたが ...
• 管理しているスコープが違うのでOK
• 特殊事例
2013年5月10日金曜日
#テスト
2013年5月10日金曜日
#テスト
• 「Puppet, Chef」でプロビジョニング しました!!」
• 期待通り動くのかな ?
• 手作業で確認するの ?
• 変更する度に ?
2013年5月10日金曜日
Infrastructure as Code
• コード書いたらテストですよねー
2013年5月10日金曜日
#あるある
• パッケージの追加が怖い
• パッケージのアップデートが怖い
• パッケージの削除が怖い
• 設定追加が怖い
• 設定変更が怖い
• 設定削除が怖い
• 意図しないところで不具合
2013年5月10日金曜日
#あるある
• 振る舞いが把握できてないとこわい
2013年5月10日金曜日
#テスト
• 振る舞いをテスト = 動く仕様
• 「あれ、この設定なんだったかな...」
• テストで思い出す
• require "serverspec"
• Puppet, Chef のリファクタリング
• 振る舞いを保証して マニフェスト/レシピをいじる
2013年5月10日金曜日
EC2 Instance
PHP Apache phpenv ruby unicorn nginx
Chef の chroot環境Chef の chroot環境
ldap munin nagios rbenv kernel cgroup
Puppet の土台
/var/rootfs/ruby/var/rootfs/php
lxc-start lxc-start lxc-start lxc-start
2013年5月10日金曜日
Sqaleのテスト
• 1. chef-solo で LXCの作成/起動
• 2. LXCの外からプロセスが起動しているかテスト
• nginx, unicorn, supervisord, sshd, syslogd ...
• 3. SSHでログイン、コンテナでRSpecを実行
• 4. chef-soloで LXCの停止/削除
2013年5月10日金曜日
RSpecの中味
• ユーザーさんの行動を模擬テスト
• SSHログインできる?
• /etc/init.d/nginx で操作できる?
• Rails動く? Sinatra動く?
• bundle install できる?
• シェルコマンド使える?
• ログ見れる?
• cron 動いてる ?
• セキュリティ制限効いてる?
• cgroupのリソース制限効いてる?
2013年5月10日金曜日
RSpec / Railsの例
describe "rubyコンテナでRailsをUnicornで動かす" do
before(:all) do
system("/etc/init.d/rails stop")
end
it "アプリケーション /home/sqale/current に配置することができること" do
system("tar xfz /home/sqale/rspec/misc/rails_app.tar.gz").should be_true
system("rm -rf /home/sqale/current").should be_true
system("mv rails_app /home/sqale/current").should be_true
end
it "Railsを /etc/init.d/rails で 起動することができる" do
system("/etc/init.d/rails start").should be_true
end
it "HTTPリクエストを出して200が返ってくること" do
response = http_get
response.code.should == "200"
response.body.should == "hello,world"
end
end
2013年5月10日金曜日
RSpec / rbenvの例
%w{ 2.0.0-p0 2.0.0-preview1 1.9.3-p327 1.9.3-p286 1.9.3-p194 }.each do |version|
context "rbenv で #{version} に切り替える場合に" do
it "バージョン切り替えできていること" do
rbenv_global(version)
end
it "rubyのパスが通っていること" do
system("which ruby >/dev/null").should be_true
end
it "irbのパスが通っていること" do
system("which irb >/dev/null").should be_true
end
it "gemsのパスが通っていること" do
system("which gem >/dev/null").should be_true
end
it "bundlerのバージョンが #{@bundler_version} であること" do
`bundle -v`.split[2].should == @bundler_version
end
end
2013年5月10日金曜日
RSpec / PHP Pearの例
describe "phpコンテナのpear" do
it "pearでライブラリをインストールできること" do
system("pear install Numbers_Roman").should be_true
end
it "pearでインストールしたライブラリを読み込めること" do
File.write("numbers_roman.php", <<'....')
<?php
require_once 'Numbers/Roman.php';
$roman = new Numbers_Roman();
echo $roman->toNumeral(1);
....
`php numbers_roman.php`.chomp.should == "I"
end
end
2013年5月10日金曜日
#お問い合わせあるある
• 「○○コマンドは使えますか?」
• 「○○ライブラリは使えますか?」
• 確認作業 => テストで残しておく
• サポートした仕様がデグレードしないようにする
2013年5月10日金曜日
#テスト
• 「○○できない」こともテスト
• su, sudo できないとか
• LXC を reboot できないとか
• forkbomb 対策できてるかとか
• されると困るアクションをテスト
2013年5月10日金曜日
Rspec / ○○できない
it "/var/log/messagesを読み込めないこと" do
expect { File.read("/var/log/messages") }.to raise_error(Errno::EACCES)
end
it "/var/log/secureを読み込めないこと" do
expect { File.read("/var/log/messages") }.to raise_error(Errno::EACCES)
end
it "cgroup の fork.remaing で fork bomb対策が施されている" do
# forkbomb するワンライナー
system "perl -e 'for(0..255){$i = fork;exit 255 unless defined $i;$i == 0 && sleep 1 && exit 0; }'"
$?.success?.should be_false
end
context "カーネルの制限で sqaleユーザーはポートをbindできない" do
it "httpdの予約ポート 8000 ~ 10000 をbindできない" do
(8000..10000).each do |port|
expect { TCPServer.open(port) }.to raise_error(Errno::EACCES)
end
end
2013年5月10日金曜日
#テスト
• 手続きをRSpec化
• 一般ユーザ権限で実行 = ユーザーの取れる行動
• パッケージの有無とかは見てない
• ホスティングだと価値高いテスト
2013年5月10日金曜日
SqaleのJenkins
• Jenkins で毎日 LXC のテスト
• yum も毎回 update
• RSpecが通る = 振る舞い保証
2013年5月10日金曜日
終わり
2013年5月10日金曜日
1 of 53

Recommended

今日から使い始めるChef by
今日から使い始めるChef今日から使い始めるChef
今日から使い始めるChefMasahiro NAKAYAMA
7.6K views34 slides
20140828 #ssmjp 社内チューニンガソンで優勝したはなし by
20140828 #ssmjp 社内チューニンガソンで優勝したはなし20140828 #ssmjp 社内チューニンガソンで優勝したはなし
20140828 #ssmjp 社内チューニンガソンで優勝したはなしMasahiro NAKAYAMA
2.3K views27 slides
ChefとPuppetの比較 by
ChefとPuppetの比較ChefとPuppetの比較
ChefとPuppetの比較Sugawara Genki
29.4K views47 slides
Puppetのススメ by
PuppetのススメPuppetのススメ
PuppetのススメGosuke Miyashita
22.8K views102 slides
Itcamp長崎2012 capistrano by
Itcamp長崎2012 capistranoItcamp長崎2012 capistrano
Itcamp長崎2012 capistranokumachang_LL
452 views37 slides
Ansible handson ood2016 by
Ansible handson ood2016Ansible handson ood2016
Ansible handson ood2016Hideki Saito
1.6K views47 slides

More Related Content

What's hot

2014/11/08 第3回 一撃サーバー構築シェルスクリプト勉強会(懇親会もあるよ!) 発表資料 by
2014/11/08 第3回 一撃サーバー構築シェルスクリプト勉強会(懇親会もあるよ!) 発表資料2014/11/08 第3回 一撃サーバー構築シェルスクリプト勉強会(懇親会もあるよ!) 発表資料
2014/11/08 第3回 一撃サーバー構築シェルスクリプト勉強会(懇親会もあるよ!) 発表資料Yasutaka Hamada
1.8K views94 slides
Chef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsug by
Chef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsugChef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsug
Chef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsugTakeshi Komiya
11.8K views33 slides
Chefを利用した運用省力化とDevOpsの取り組みについて by
Chefを利用した運用省力化とDevOpsの取り組みについてChefを利用した運用省力化とDevOpsの取り組みについて
Chefを利用した運用省力化とDevOpsの取り組みについてYuuki Namikawa
7.3K views42 slides
Ansible 入門 #01 (初心者向け) by
Ansible 入門 #01 (初心者向け)Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)Taro Hirose
6.2K views34 slides
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料 by
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料Yasutaka Hamada
2.4K views105 slides
Fabricでサーバー管理をDRYにしよう by
Fabricでサーバー管理をDRYにしようFabricでサーバー管理をDRYにしよう
Fabricでサーバー管理をDRYにしようmax747
10.7K views31 slides

What's hot(20)

2014/11/08 第3回 一撃サーバー構築シェルスクリプト勉強会(懇親会もあるよ!) 発表資料 by Yasutaka Hamada
2014/11/08 第3回 一撃サーバー構築シェルスクリプト勉強会(懇親会もあるよ!) 発表資料2014/11/08 第3回 一撃サーバー構築シェルスクリプト勉強会(懇親会もあるよ!) 発表資料
2014/11/08 第3回 一撃サーバー構築シェルスクリプト勉強会(懇親会もあるよ!) 発表資料
Yasutaka Hamada1.8K views
Chef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsug by Takeshi Komiya
Chef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsugChef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsug
Chef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsug
Takeshi Komiya11.8K views
Chefを利用した運用省力化とDevOpsの取り組みについて by Yuuki Namikawa
Chefを利用した運用省力化とDevOpsの取り組みについてChefを利用した運用省力化とDevOpsの取り組みについて
Chefを利用した運用省力化とDevOpsの取り組みについて
Yuuki Namikawa7.3K views
Ansible 入門 #01 (初心者向け) by Taro Hirose
Ansible 入門 #01 (初心者向け)Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)
Taro Hirose6.2K views
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料 by Yasutaka Hamada
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
Yasutaka Hamada2.4K views
Fabricでサーバー管理をDRYにしよう by max747
Fabricでサーバー管理をDRYにしようFabricでサーバー管理をDRYにしよう
Fabricでサーバー管理をDRYにしよう
max74710.7K views
Ansible ではじめるインフラのコード化入門 by Sho A
Ansible ではじめるインフラのコード化入門Ansible ではじめるインフラのコード化入門
Ansible ではじめるインフラのコード化入門
Sho A9.2K views
Okinawa Open Days 2015 Handson - Ansible by Hideki Saito
Okinawa Open Days 2015 Handson - AnsibleOkinawa Open Days 2015 Handson - Ansible
Okinawa Open Days 2015 Handson - Ansible
Hideki Saito6.5K views
Ansibleで始めるサーバ管理勉強会(2014年10月1日) by CLARA ONLINE, Inc.
Ansibleで始めるサーバ管理勉強会(2014年10月1日)Ansibleで始めるサーバ管理勉強会(2014年10月1日)
Ansibleで始めるサーバ管理勉強会(2014年10月1日)
ネットワークエンジニアのための Puppet / Chef by npsg
ネットワークエンジニアのための Puppet / Chefネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chef
npsg8.1K views
2日間Fabricを触った俺が
 色々解説してみる by airtoxin Ishii
2日間Fabricを触った俺が
 色々解説してみる2日間Fabricを触った俺が
 色々解説してみる
2日間Fabricを触った俺が
 色々解説してみる
airtoxin Ishii4.4K views
第1回 一撃サーバー構築シェルスクリプト勉強会 by Yasutaka Hamada
第1回 一撃サーバー構築シェルスクリプト勉強会第1回 一撃サーバー構築シェルスクリプト勉強会
第1回 一撃サーバー構築シェルスクリプト勉強会
Yasutaka Hamada5.6K views
意識の低い自動化 by greenasparagus
意識の低い自動化意識の低い自動化
意識の低い自動化
greenasparagus68.5K views
HTTP/2 in nginx(2016/3/11 社内勉強会) by Yoko TAMADA
HTTP/2 in nginx(2016/3/11 社内勉強会)HTTP/2 in nginx(2016/3/11 社内勉強会)
HTTP/2 in nginx(2016/3/11 社内勉強会)
Yoko TAMADA1.7K views
イベント駆動プログラミングとI/O多重化 by Gosuke Miyashita
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
Gosuke Miyashita15.4K views
Ansible quickstart by Hideki Saito
Ansible quickstartAnsible quickstart
Ansible quickstart
Hideki Saito5.4K views

Similar to Sqale の Puppet と Chef (と テスト)

Elasticsearch at CrowdWorks by
Elasticsearch at CrowdWorksElasticsearch at CrowdWorks
Elasticsearch at CrowdWorks佑介 九岡
12.2K views37 slides
実は怖くないDevOps by
実は怖くないDevOps実は怖くないDevOps
実は怖くないDevOpsMasanori Ishigami
1.4K views57 slides
Railsの基礎 by
Railsの基礎Railsの基礎
Railsの基礎Junya Ishihara
1.5K views18 slides
Movable Type 6 Overview - New York Perl Mongers Tech Talk by
Movable Type 6 Overview - New York Perl Mongers Tech TalkMovable Type 6 Overview - New York Perl Mongers Tech Talk
Movable Type 6 Overview - New York Perl Mongers Tech TalkYuji Takayama
27.1K views43 slides
広島Ruby勉強会#35 - Chef入門 by
広島Ruby勉強会#35 - Chef入門広島Ruby勉強会#35 - Chef入門
広島Ruby勉強会#35 - Chef入門Tomokazu Ogawa
6K views80 slides
意図を表現するプログラミング by
意図を表現するプログラミング意図を表現するプログラミング
意図を表現するプログラミングAtsuhiro Kubo
5.3K views39 slides

Similar to Sqale の Puppet と Chef (と テスト)(20)

Elasticsearch at CrowdWorks by 佑介 九岡
Elasticsearch at CrowdWorksElasticsearch at CrowdWorks
Elasticsearch at CrowdWorks
佑介 九岡12.2K views
Movable Type 6 Overview - New York Perl Mongers Tech Talk by Yuji Takayama
Movable Type 6 Overview - New York Perl Mongers Tech TalkMovable Type 6 Overview - New York Perl Mongers Tech Talk
Movable Type 6 Overview - New York Perl Mongers Tech Talk
Yuji Takayama27.1K views
広島Ruby勉強会#35 - Chef入門 by Tomokazu Ogawa
広島Ruby勉強会#35 - Chef入門広島Ruby勉強会#35 - Chef入門
広島Ruby勉強会#35 - Chef入門
Tomokazu Ogawa6K views
意図を表現するプログラミング by Atsuhiro Kubo
意図を表現するプログラミング意図を表現するプログラミング
意図を表現するプログラミング
Atsuhiro Kubo5.3K views
2013OSC関西@京都_CloudStackとCloudFoundaryがまるわかり! by Midori Oge
2013OSC関西@京都_CloudStackとCloudFoundaryがまるわかり!2013OSC関西@京都_CloudStackとCloudFoundaryがまるわかり!
2013OSC関西@京都_CloudStackとCloudFoundaryがまるわかり!
Midori Oge2.5K views
minneで学ぶクラウド脳 by Uchio Kondo
minneで学ぶクラウド脳minneで学ぶクラウド脳
minneで学ぶクラウド脳
Uchio Kondo2.4K views
Haikara by jewel12
HaikaraHaikara
Haikara
jewel12694 views
OSC Tokyo fall LT~Dockerで分散処理をやってみた by atk1234
OSC Tokyo fall LT~Dockerで分散処理をやってみたOSC Tokyo fall LT~Dockerで分散処理をやってみた
OSC Tokyo fall LT~Dockerで分散処理をやってみた
atk12341.1K views
Ruby way-openstack.keynote by Uchio Kondo
Ruby way-openstack.keynoteRuby way-openstack.keynote
Ruby way-openstack.keynote
Uchio Kondo6.8K views
Djangoとweb2pyをapacheに組込む by 2bo 2bo
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む
2bo 2bo2.2K views
Mtddc kyusyu-lightningtalks by Yuji Takayama
Mtddc kyusyu-lightningtalksMtddc kyusyu-lightningtalks
Mtddc kyusyu-lightningtalks
Yuji Takayama1.3K views
第20回CloudStackユーザ会_ApacheCloudStack4.4新機能紹介 by Midori Oge
第20回CloudStackユーザ会_ApacheCloudStack4.4新機能紹介第20回CloudStackユーザ会_ApacheCloudStack4.4新機能紹介
第20回CloudStackユーザ会_ApacheCloudStack4.4新機能紹介
Midori Oge2K views
長いの by emasaka
長いの長いの
長いの
emasaka969 views
2012/03/31 Apacheスタートスクリプト読書会発表資料 by Yasutaka Hamada
2012/03/31 Apacheスタートスクリプト読書会発表資料2012/03/31 Apacheスタートスクリプト読書会発表資料
2012/03/31 Apacheスタートスクリプト読書会発表資料
Yasutaka Hamada1.3K views

Sqale の Puppet と Chef (と テスト)