VagrantとChefで
開発スピードを上げる話
kozy4324@gmail.com
アジェンダ
現状と問題
Vagrant
Chef
まとめ
訂正
開発スピードを上げる話
開発スピードを下げない話
現状と問題
現状(1)
複雑なアプリケーションスタック
+-------+
|BIG-IP | <= SSL通信はここで解決、ローカルでは代替Apacheが必要...
+-------+
|
+-------+
|Varnish|
+-------+
|
+-------+
|Apache |
+-------+
|Tomcat |
+-------+
|(App) |
+-------+
|Fluentd|
+-------+
|
+---------+---------+---------+
| | | |
+-------+ +-------+ +-------+ +-------+ +-------+
|Log | |Solr | |MySQL | |MongoDB| |etc... |
+-------+ +-------+ +-------+ +-------+ +-------+
現状(2)
バージョン管理されないサーバリソース
ホスト/ネットワーク設定
インストールされたパッケージ/ライブラリ
サービス/rc.dスクリプト/confファイル
cron設定
etc...
発生している事象
サーバ構成を確認するのが手間
サーバ構成の変更履歴を把握するのが難しい
同じ環境を構築するのに時間がかかる
productionと同じローカル環境を構築できない
問題
サーバ環境/構成に関して、
トレーサビリティが低い
メンテナンスビリティが悪い
ポータビリティが低い
使い捨てできるアドホックな環境がない
_人人人人人人人人人人_
> 開発スピードの低下 <
 ̄YYYYYYYYYY ̄
解決策
Vagrant + Chef
Vagrant
Vagrant
仮想化ソフトウェアのCLIツール
VirtualBox, VMwareに対応
配布されているboxでゲストOSを起動
Rubyの内部DSLで設定ファイルを記述
Win, Macにはインストーラーで簡単インストール
Vagrantで何ができる?
ゲストOSをCLIでサクっと起動できる
$ tree
.
!"" Vagrantfile
0 directories, 1 file
$ cat Vagrantfile
Vagrant.configure("2") do |config|
config.vm.box = "centos6_4"
config.vm.box_url = "http://developer.nrel.gov/downloads/
vagrant-boxes/CentOS-6.4-x86_64-v20130427.box"
end
$ vagrant up
$ vagrant ssh
$ cat /etc/issue
CentOS release 6.4 (Final)
Kernel r on an m
Vagrantで何ができる?
ゲストOSの破棄→作り直しがサクっとできる
$ vagrant destroy
$ vagrant up
Vagrantで何ができる?
環境をまるっとコピーして配布できる
$ vagrant package
$ tree
.
#"" Vagrantfile
!"" package.box <= packageコマンドで作成されたboxファイル
0 directories, 2 files
Vagrantで何ができる?
複数のゲストOSを立ち上げ、Privateネットワーク
を構築できる
$ cat Vagrantfile
Vagrant.configure("2") do |config|
config.vm.define :web do |web|
web.vm.box = "centos6_4"
web.vm.network :private_network, ip: "192.168.33.10"
end
config.vm.define :db do |db|
db.vm.box = "centos6_4"
db.vm.network :private_network, ip: "192.168.33.11"
end
end
$ vagrant up
$ vagrant ssh web <= 複数起動時は引数にvm-nameを渡す
Vagrantまとめ
Vagrantでローカル使い捨て環境が準備できる
設定ファイルをバージョン管理して配布すれば同じ
仮想化環境を利用できる
Chef
Chef
サーバ構成を管理するソフトウェア
Rubyの内部DSLで記述されたレシピと、各種属性
情報なども含めたクックブックで構成が表現される
クックブックを適用することで構成が定められた状
態となる(冪等性の保証)
サーバ上のあらゆるリソースをクックブックで表現
パッケージ,サービス,設定ファイル,cron設定, ...
クラサバなChef
Chef-soloとKnife-solo
ローカルではクラサバなChefはオーバースペック
単一サーバでクックブックを適用するChef-solo
リモートでChef-soloを実行するKnife-soloが便利
Knife-solo自体はChefのプラグイン
VagrantゲストOSの構成管理はホストOSから
Knife-soloを使うのがオススメ
Railsアプリのレシピ(1)group 'www' do
group_name 'www'
gid 505
action :create
end
user 'www' do
comment 'www'
uid 505
group 'www'
home '/home/www'
shell '/bin/bash'
password nil
supports :manage_home => true
action [:create, :manage]
end
git "/home/www/rails_app" do
repository '/path/to/repository.git'
revision 'HEAD'
user 'www'
group 'www'
action :sync
end
Railsアプリのレシピ(2)bash "bundle_install" do
user 'www'
cwd '/home/www/rails_app'
code 'bundle install --deployment'
action :run
end
template "/etc/init.d/unicorn_rails" do
mode "0755"
source "unicorn_rails.erb"
end
template "/home/www/rails_app/unicorn_rails.conf" do
mode "0644"
owner "www"
group "www"
source "unicorn_rails.conf.erb"
end
service "unicorn_rails" do
action [ :enable, :start ]
subscribes :restart, resources(:template => "/home/www/rails_app/
unicorn_rails.conf")
end
まとめ
最初に提示した問題
サーバ環境/構成に関して、
トレーサビリティが低い
メンテナンスビリティが悪い
ポータビリティが低い
使い捨てできるアドホックな環境がない
最初に提示した問題
トレーサビリティとメンテナンスビリティ
Chefクックブックがバージョン管理されれば解決
ポータビリティとアドホック環境
ローカルはVagrant+Chefで、本番環境もChefで
構築するポリシーとすれば解決
Chefクックブックは誰が
書いていく?
アプリケーションエンジニア、インフラエンジニア
両方で書いくべき(提案)
クックブックのテストはローカルVagrant環境で
クックブックはバージョン管理して共有すべき

VagrantとChefで開発スピードを上げる話