yumってなに?)初心者が5日間でVM環境をchefで構築した話
はじめは
・環境構築とか全く触ったことないレベル。( yumって何?
・Vagrantももちろんはじめまして
・Rubyも全く触ったことないレベル( セミコロン[;]いらないの!?
からスタート。
最終的に書いたchefはこちら
環境
- ホストOS:Mac
- ゲストOS(vagrant):CentOS64
他)Apache/Mysql/PHP/PHP-Unit/memcache/git/subversion/jenkins
1日目(さくらVPS環境構築)
ふーん(´ー`)
2日目(vagrant、手動で環境構築)
・vagrantで仮想マシンを立てる。
ssh接続できるように、
$ vagrant ssh-config --host VMNAME >> ~/.ssh/config $ ssh VMNAME
としておいた
・apache,php,mysql手動インストール。
3日目(手動で環境構築、chef勉強)
・PHP-Unit/git/subversion/jenkins 手動インストール
・手動手順整える。destory up destory up ....
-> VMの環境を手動で構築する手順は こんな感じ になりました。
・chef solo 入門 読み始める
売り上げランキング: 237
4日目(chefさわる)
・chef solo 入門 読み終わる
・ドットインストール見る
・chef-solo / knife-solo インストール
#インストール $ curl -L https://www.opscode.com/chef/install.sh | sudo bash $ sudo gem install knife-solo $ knife configure #workstation設定 $ cd HOGE $ knife solo init chef-repo $ cd chef-repo $ knife solo prepare HOGE $ knife cookbook create set-up -o site-cookbooks/
・インストール系レシピを書く → githubはこちら
まずは普通のyum install系を書いた。
%w{ httpd ・ ・ ・ php-mbstring php-mcrypt }.each do |p| package p do action :install end end
あとは、service系
service "httpd" do supports :status => true, :restart => true, :reload => true action [:enable, :start] end service "mysqld" do supports :status => true, :restart => true, :reload => true action [:enable, :start] end service "memcached" do supports :status => true, :restart => true, :reload => true action [:enable, :start] end
5日目(レシピ書く・レシピながす)
・続:レシピ書く → githubはこちら
・適宜レシピ流してみる
なんかゲストOSでrsyncインストールしてないとレシピ流れなかった。
$ sudo yum -y install rsync
レシピ概要は、
テンプレート書いて
template "php.ini" do path "/etc/php.ini" source "php.ini.erb" mode 0644 end template "httpd.conf" do path "/etc/httpd/conf/httpd.conf" source "httpd.conf.erb" mode 0644 notifies :start, 'service[httpd]' end template "iptables" do path "etc/sysconfig/iptables" source "iptables" owner "root" group "root" mode 0600 notifies :restart, 'service[iptables]' end
jsonで設定できるようにし、
{ "httpd": { "port": 80, "server-tokens": "Prod", "server-name": "localhost", "allow-override": "All", "server-signature": "Off" }, "php.ini": { "timezone": "Asia/Tokyo" }, "run_list":[ "recipe[set-up]" ] }
rpm install系を書いて
remote_file "#{Chef::Config[:file_cache_path]}/remi-release-6.rpm" do source "http://rpms.famillecollet.com/enterprise/remi-release-6.rpm" not_if "rpm -qa | grep -q '^remi-release'" action :create notifies :install, "rpm_package[remi-release]", :immediately end rpm_package "remi-release" do source "#{Chef::Config[:file_cache_path]}/remi-release-6.rpm" action :nothing end
どうにもならなかったpearとjenkinsは
どうにもならなかったのでbashでそのままコマンド流すようにしました。
chefで重要な冪等性を保証するためのnot_ifが肝ですな。
これで何度実行しても同じ結果が返ってくる
bash "install_jenkins" do user "root" code <<-EOH yum -y install java-1.7.0-openjdk.x86_64 wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key yum -y install jenkins EOH not_if { ::File.exists?("/usr/bin/jenkins")} end
今となって思うこととしては、
cookbook使えばもっと楽なのかな?
ですね。
次はその辺も触っていきたい。