狠狠撸

狠狠撸Share a Scribd company logo
モダン开発环境
@atty303
今日の内容
? 開発環境にまつわる問題
? スマートな開発環境とは?
? Vagrantによる仮想マシンの管理
? Chefによる構成管理
尝础惭笔开発に绞ります
開発環境にまつわる
憂鬱
? プロジェクトに参画したとき、アプリ
を手元で動かすのに○時間掛かった……
? 数年前のアプリのメンテナンスを依頼
されたが、環境を用意できなくて開発
に取り掛かることすらできない……
憂鬱
問題
? 構築手順が明文化されていない
? 構築作業が自動化されていない
憂鬱
? 開発環境では動いている機能が、本番
環境で動かない……
? Aさんの環境では動くけど、自分の環境
では動かない……
問題
? 環境に差異がある
? 構成管理が不足している
? メンバーが1つの開発開発を共有して使
っており、他人が開発中のコードが自
分に影響して開発が進められない……
? バグが混入したバージョンを特定した
いけど、環境を使っている他人に影響
するので戻せない……
憂鬱
問題
? 環境構築に手間が掛かるので、個人ご
とに環境を用意できていない
? 物理マシンを使っているので、環境を
増やすのにコストが掛かる
もっとスマートに
しよう!
必要なこと
? 一人ごとに独立していること
? 構築作業が容易であること
? 同一構成の再現が可能であること
? 構成をバージョン管理できること
独立性の確保
? 物理マシン
? クラウドサーバ
? 仮想マシン
Virtual Machine
(VM)
OS (Linux)
Webサーバ
アプリケーション
DBサーバ
物理マシン
OS (Mac,Windows)
Webサーバ
アプリケーション
DBサーバ
物理マシン(ホスト)
ハイパーバイザー (VMWare,VirtualBox, Hyper-V)
OS (Linux)
仮想マシン(ゲスト)
Webサーバ
アプリケーション
DBサーバ
OS (Linux)
仮想マシン(ゲスト)
VMのメリット
? コストがほぼゼロ
? 構成を簡単に変更可能
? スナップショット
VMのデメリット
? 性能が落ちる
? ホストに十分なパワーが必要
? 汎用パーツしか使えない
VM
=
ハードウェアの
ソフトウェア化
VMハイパーバイザー
製品名 価格 Windows Mac
OracleVirtualBox Free Yes Yes
MicrosoftVirtualPC Free Yes
Microsoft Hyper-V 高い Yes
VMWare Workstation ¥30,000 Yes
VMWare Fusion ¥5,000 Yes
Parallels Desktop ¥8,000 Yes
VMWare vSphere 高い
VMWare Fusion
デモ
容易性の確保
? 仮想マシン管理の自動化
? ミドルウェア構成の自動化
Vagrant
? VMの管理ツール
? テキストファイルにVMの設定を書く
? コマンド一発で痴惭作成と起动
モダン开発环境
? OSの構成管理ツール
? テキストファイルに構成を書く
? コマンド一発で构筑
OS (Mac,Windows)
Webサーバ
アプリケーション
DBサーバ
物理マシン(ホスト)
ハイパーバイザー (VirtualBox)
OS (Linux)
仮想マシン(ゲスト)
Chef
Vagrant
详细は后で
再現性の確保
? Vagrantによる仮想マシン構成の決定
? ChefによるOS内環境の決定
構成のバージョニング
? ただのテキストファイル
? ソースコードと同様
? Gitでバージョン管理が可能
Vagrant?le Cookbook
まとめ
必要なこと
? 一人ごとに独立していること
→ 仮想マシンを利用
? 構築作業が容易であること
→Vagrant + Chef で自動化
? 同一構成の再現が可能であること
→Vagrant + Chef で構成管理
? 構成をバージョン管理できること
→Vagrant?le + Cookbook を Git で管理
Vagrant
対応VM-HV
? VirtualBox
? VMWare Fusion
? VMWare Workstation
? ...and Amazon EC2
インストール
http://downloads.vagrantup.com/
ゼロからVMを
作ってみる
初期設定
$ vagrant box add ubuntu1204 https://s3.amazonaws.com/
gsc-vagrant-boxes/ubuntu-12.04.2-i386-chef-11-
omnibus.box
$ vagrant box add ubuntu1204 https://s3.amazonaws.com/
gsc-vagrant-boxes/ubuntu-12.04.2-server-amd64.box
VirtualBox
VMWare Fusion
プロジェクトディレクトリ
を作る
$ cd ~/work
$ mkdir hello_vagrant
$ cd hello_vagrant
Vagrant?leを作成
$ vagrant init ubuntu1204
VM起動
$ vagrant up
$ vagrant up --provider=vmware_fusion
VirtualBox
VMWare Fusion
VMにログイン
$ vagrant ssh
ファイル共有
$ touch README.md
$ ls
README.md Vagrantfile
$ vagrant ssh
ubuntu1204$ ls /vagrant
README.md Vagrantfile
VMを落とす
$ vagrant halt
VMを削除
$ du -sh .vagrant/
1.6G! .vagrant/
$ vagrant destroy
$ du -sh .vagrant/
0B! .vagrant/
Boxes
ubuntu1204
Boxes
centos63 centos54
プロジェクトA
ubuntu1204
プロジェクトB プロジェクトC
ubuntu1204 centos54
構築済みBoxes
http://www.vagrantbox.es/
Vagrant?le
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(“2”) do |config|
config.vm.box = “ubuntu1204”
end
Rubyで記述
复数痴惭
Vagrant.configure(“2”) do |config|
config.vm.define :web do |web|
web.vm.box = “ubuntu1204”
web.vm.network :private_network, ip: “192.168.99.1”
end
config.vm.define :db do |db|
db.vm.box = “ubuntu1204”
db.vm.network :private_network, ip: “192.168.99.2”
end
end
Vagrant?le
? up, haltなどのコマンドは全てのVMを対
象として実行される
? コマンドの後にVM名を追加すると、特
定VMだけを操作できる
$ vagrant ssh web
? VMの管理をコマンドで簡単にできる
? 1ファイルで構成を管理
? 复数痴惭構成も大丈夫
まとめ
作成したVMは初期状態だけど、
Webサーバなどのインストールや
設定はどうするの?
Provisioning
シェルスクリプト
Vagrant.configure(“2”) do |config|
config.vm.box = “ubuntu1204”
config.vm.provision :shell, :inline => <<EOT
apt-get update
apt-get -y install apache2-mpm-prefork
apt-get -y install libapache2-mod-php5
EOT
end
? up 時に自動実行
? up 後にも任意で実行できる
? halt → up を手軽に実行
$ vagrant provision
$ vagrant reload
? シェルスクリプトで事足りることもある
? 何も覚えることがないので楽ではある
? より坚牢に管理するために……
Chef
Vagrant.configure(“2”) do |config|
config.vm.box = “ubuntu1204”
config.vm.provision :chef_solo do |chef|
chef.add_recipe “apache”
end
end
Chef
まだ慣れていないので
さわりだけです……
インストール
? Vagrant + Chef のセットで使う場合は、
Boxにインストール済みのChefを使うの
が簡単
インストール
(chef + knife-solo)
$ gem install knife-solo
$ git clone git://github.com/matschaffer/knife-solo.git
$ cd knife-solo
$ bundle && bundle exec rake install
* http://shimotori.github.io/blog-it/2013/04/30/1-knife-solo-cautions/
Version 0.2.0
Version HEAD (0.3.0-pre3)
最初の一歩
Cookbook作成
vm$ cd /vagrant
vm$ knife cookbook create myrecipe -o cookbooks
vm$ ls -F cookbooks/
myrecipe/
vm$ ls -F cookbooks/myrecipe/
CHANGELOG.md README.md attributes/ definitions/
files/ libraries/ metadata.rb providers/
recipes/ resources/ templates/
Vagrant.configure(“2”) do |config|
config.vm.box = “ubuntu1204”
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = "cookbooks"
chef.add_recipe "myrecipe"
end
end
Vagrant?le
$ vagrant reload
...
[default] Running provisioner: chef_solo...
Generating chef JSON and uploading...
Running chef-solo...
[2013-05-17T11:07:27+00:00] INFO: *** Chef 11.4.0 ***
...
[2013-05-17T11:07:28+00:00] INFO: Chef Run complete in 0.017913367 seconds
...
動作確認
とりあえず动きました
驳颈迟を入れてみる
Recipe編集
package “git” do
action :install
end
cookbooks/myrecipe/recipes/default.rb
$ vagrant provision
...
[default] Running provisioner: chef_solo...
Generating chef JSON and uploading...
Running chef-solo...
...
[2013-05-17T11:24:54+00:00] INFO: Processing package[git] action install
(myrecipe::default line 10)
[2013-05-17T11:25:11+00:00] INFO: Chef Run complete in 17.741444756
seconds
...
実行
? destory → up しても再現される
Apache + PHP を
動かしてみる
[“apache2-mpm-prefork”, “libapache2-mod-php5”].each do |pkg|
package pkg do
action :install
end
end
service "apache2" do
supports :status => true, :restart => true, :reload => true
action [ :enable, :start ]
end
template "apache2-site-dev" do
path "/etc/apache2/sites-available/dev"
source "apache2-site-dev.erb"
owner "root"
group "root"
mode 0644
notifies :reload, 'service[apache2]'
end
execute "apache2-sites-disable-default" do
only_if { File.exists?("/etc/apache2/sites-enabled/000-default") }
command "a2dissite default"
notifies :reload, 'service[apache2]'
end
execute "apache2-sites-enable-dev" do
not_if { File.exists?("/etc/apache2/sites-enabled/dev") }
command "a2ensite dev"
notifies :reload, 'service[apache2]'
end
<VirtualHost *:80>
DocumentRoot <%= node['apache2']['document_root'] %>
EnableMMAP off
EnableSendfile off
</VirtualHost>
cookbooks/myrecipe/templates/default/apache2-site-dev.erb
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = "cookbooks"
chef.add_recipe "myrecipe"
chef.json = {
"apache2" => {
"document_root" => "/vagrant/web"
}
}
end
Vagrant?le
デモ
? サーバの管理は必ずChef経由で行う
? あるべき状態を定義する
まとめ
? ロール
? コミュニティのCookbook
? Chef Server
? VagrantなしでChefを使う(本番サーバ)
他にも
http://tatsu-zine.com/books/chef-solo
勉强中です
モダン开発环境
? 一人ごとに独立していること
? 構築作業が容易であること
? 同一構成の再現が可能であること
? 構成をバージョン管理できること
ご静聴
ありがとうございました
時間が余っていたら
みなさんも
やってみましょう!

More Related Content

モダン开発环境