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

Preview:

DESCRIPTION

2013/06/21 社内勉強会資料

Citation preview

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/issueCentOS 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" endend$ 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 :createend

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 :syncend

Railsアプリのレシピ(2)bash "bundle_install" do user 'www' cwd '/home/www/rails_app' code 'bundle install --deployment' action :runend

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環境で

クックブックはバージョン管理して共有すべき

Recommended