今回はWindow環境でVagrant+Chef+BerkShelfを使って、Immutable Infrastractureライクな環境作りの為のメモ。
とりあえずiptablesの設定とmysqlとrbenvを入れてみよう
【OS】
Window 7 64bit
Ruby 1.9.3p484
Vagrant 1.3.5
- Plugin
- vagrant-berkshelf 1.3.7
- vagrant-omunibus 1.2.1
Chef 11.10.2
BerkShelf 2.0.14
【これから作るVM環境】
CentOS-6.3 64bit
yum
mysql
rbenv
Windowsの各アプリケーションはインストーラーを使ってインストールしてあるけど、
BerkShelfはGemからのインストールなのでRubyが必要となっている。
まずはVM用の環境設定
berksコマンドでVM用のcookbookを作成する
# /test berks cookbook chef-repo
そして出来たディレクトリ内に移動して、各ファイルを編集する
# /test/chef-repo/Vagrantfile Vagrant.configure("2") do |config| # ここにホスト名を設定する config.vm.hostname = "chef-repo" # 登録してあるBoxを利用できるので、好きなBoxを設定する config.vm.box = "Berkshelf-CentOS-6.3-x86_64-minimal" # Boxが登録されていなければ、WEBからダウンロードしてインストール出来る # 例えば、ここから選んでダウンロードもできるよ # URL="http://www.vagrantbox.es/" config.vm.box_url = "https://dl.dropbox.com/u/31081437/Berkshelf-CentOS-6.3-x86_64-minimal.box" # VMにipアドレスを設定したい時に使う config.vm.network :public_network, ip: "192.168.0.100" config.berkshelf.enabled = true # 共有フォルダ設定 config.vm.synced_folder "../chef-repo", "/var/www/" # ネットワークが遅い現象の対策 # URL="https://github.com/mitchellh/vagrant/issues/1172" config.vm.provider :virtualbox do |vb| vb.customize ["modifyvm", :id, "--natdnsproxy1", "off"] vb.customize ["modifyvm", :id, "--natdnshostresolver1", "off"] end # バージョン xx.xx.xx のchefを使いたい場合 # config.omnibus.chef_version = "xx.xx.xx" # ここからがProvision時の設定内容 config.vm.provision :chef_solo do |chef| # 利用したいcookbookのパラメータをJSONとして設定する chef.json = { mysql: { # データベースのパスワード server_root_password: "test", server_repl_password: "test", server_debian_password: "test", bind_address: "127.0.0.1" } } # cookbooksに集約されているので、そこにだけパスを通す chef.cookbooks_path = "cookbooks" # rolesのパスも通す chef.roles_path = "roles" # roleを指定 chef.add_role("local") end end
# /test/chef-repo/Berksfile site :opscode metadata cookbook 'iptables', path: './site-cookbooks/iptables' cookbook 'mysql', git:'https://github.com/opscode-cookbooks/mysql.git' cookbook 'rbenv', ">= 1.4.1" , git: 'git://github.com/RiotGames/rbenv-cookbook.git'
# /test/chef-repo/roles/local.rb name "local" description "for local development" run_list( "recipe[chef-repo]", "recipe[yum::epel]", "recipe[yum::remi]", "recipe[iptables]", "recipe[mysql::client]", "recipe[mysql::server]" )
knifeコマンドでiptablesのcookbookを作成する
# /test/chef-repo knife cookbook create iptables -o site-cookbooks
レシピファイルと設定ファイルを作成する
# /test/chef-repo/recipes/default.rb include_recipe 'rbenv::default' include_recipe 'rbenv::ruby_build' # Rubyのバージョンが古いとエラーになることがあるので注意 rbenv_ruby "2.0.0-p353" do ruby_version "2.0.0-p353" global true end
# /test/chef-repo/site-cookbooks/iptables/recipes/default.rb service "iptables" do supports :status => true, :restart => true, :reload => true action [:enable, :start] end template "/etc/sysconfig/iptables" do source "iptables" owner "root" group "root" mode 0600 notifies :restart, 'service[iptables]' end
# /test/chef-repo/site-cookbooks/iptables/templates/default/iptables *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT
これで一通りの下準備はOK
あとはvagrantコマンドを実行して正常に起動するか確認する
# /test/chef-repo vagrant up
# /test/chef-repo vagrant ssl
VM内の設定が狙った通りになっていれば完了
はあ、構造がわかるまでは結構苦戦したなー
だけど依存関係をしっかり追えばわかってくる感じ
とにかくVagrantとChefの連携のやり方が様々あるからどれが正しいのかわかりづらい><
どれかしっかりとしたベストプラクティスが出てくるのを期待
次はDockerも使えるようになりたい^^
参照:
Vagrantとネットワーク設定
http://0xfffffff7.hatenablog.com/entry/2013/11/29/160912
今っぽい Vagrant + Chef Solo チュートリアル
http://qiita.com/taiki45/items/b46a2f32248720ec2bae
[Chef]入門Chef-Soloを片手にRailsアプリを動作させるところまでやってみた
http://d.hatena.ne.jp/ntaku/20130324/1364132658
VagrantとChef-soloについて初歩の備忘
http://havelog.ayumusato.com/develop/server/e562-vagrant_with_chef.html