今からお前んちこいよ

ベルリンにて細々とお勉強。

yumってなに?)初心者が5日間でVM環境をchefで構築した話

はじめは

 ・環境構築とか全く触ったことないレベル。( yumって何?
 ・Vagrantももちろんはじめまして
 ・Rubyも全く触ったことないレベル( セミコロン[;]いらないの!?

からスタート。

 

最終的に書いたchefはこちら

 

環境

  • ホストOS:Mac
  • ゲストOS(vagrant):CentOS64
     他)Apache/Mysql/PHP/PHP-Unit/memcache/git/subversion/jenkins

 

1日目(さくらVPS環境構築)

 ・さくらVPS環境構築

 

ふーん(´ー`)

 

 

 

2日目(vagrant、手動で環境構築)

 ・vagrantで仮想マシンを立てる。

    参考)Vagrant セットアップ (Mac) Qiita

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 入門 読み始める

入門Chef Solo - Infrastructure as Code
伊藤直也 (2013-03-11)
売り上げランキング: 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使えばもっと楽なのかな?

ですね。

 

次はその辺も触っていきたい。