このサイトは、只今WEB業界で活躍中のデザイナー、プログラマーの方々の情報を集めたweb統合情報サイトです。

web帳

記事詳細

2013.11.18

Vagrant + Chef Solo の基本的な使い方(設定方法)

前回、

VirtualBoxとVagrantで開発環境を構築

VirtualBoxとVagrantで開発環境を構築 その2 PHP + MySQLインストール

VirtualBoxとVagrantで開発環境を構築 その3 phpMyAdmin インストール centOS apache設定

と、Vagrant の設定を行ってきましたが、なんせこれを毎回行うとなると、非常に大変なことだと思います。

そんな構築を楽に行う為にChefを使っていきます。

Chef

Chefは、ファイルに記述した設定内容に応じて自動的にユーザーの作成やパッケージのインストール、設定ファイルの編集などを行うツールで、OPSCODEが開発しております。

OPSCODE

http://docs.opscode.com

Chef

http://www.opscode.com/chef/

そもそもChefってなんなの?ってことなんですが、

全体像はこちらのページに記載されているかと思いますが、

http://docs.opscode.com/chef_quick_overview.html

・WORKSTATION

・CHEF SERVER

・NODES

と大きく3つに分かれており、WORKSTATION(使っている PC)で設定したcpplbooksをknifeコマンドを用いて、CHEF SERVERに送られ、送られてきた情報を元にNODESに反映させる。といった流れになります。

今回は、ローカルでVagrant等で環境を構築した場合の設定で、・WORKSTATION ⇔ ・NODES のやり取りとなります。

Chef インストール

では早速、 Chef をインストールしていきましょう。

Chef を使うには ruby gem が必要となりますので、導入されていない場合はインストールしましょう。

バージョンの確認はそれぞれ、

[code]ruby -v[/code]
[code]gem -v[/code]

で確認できます。

公式サイト

Workstation Setup

https://learnchef.opscode.com/quickstart/workstation-setup

のページに記載されているコマンドを実行し、インストールしていきます。

それぞれの環境にあったコマンドを選択します。

macの場合は、

[code]curl -L https://www.opscode.com/chef/install.sh | sudo bash[/code]

となります。

ちょっと時間がかかりますので、しばらく待ちましょう。

インストール完了しましたら、knife-soloをインストールしましょう。

knife-soloはknifeのプラグインで、knifeのサブコマンドを使用出来るようになります。

[code]sudo gem install knife-solo [/code]

ここで当方はエラーが出てしまいました。お、おうぅ。

[code]ERROR: Failed to build gem native extension.[/code]
[code]You have not agreed to the Xcode license agreements[/code]

どうやらxcodeがうまくいっていない的な。。どうもXcodeをしばらく起ち上げていなかったわけで起ち上げ、規約書に同意して再度コマンドを打ちなおしたらいけました。よかった。

ここまでインストールし、gem listで確認すると、

[code]gem list[/code]

なんやかんや落ちてきたのが入っているのが確認出来るかと思います。

インストールできましたら、knife configureでKnifeコマンドの設定を行います。

[code]knife configure[/code]

基本、デフォルトで問題ないかと思いますので、リターンの連打を行います。

NODE 設定

続いてはNODEの方の設定を行っていきます。

NODEはVagrant + VirtualBoxとなりますので、インストールしていない方は、

VirtualBoxとVagrantで開発環境を構築

等を参考にしていただければと。

Vagrant の初期化を行い、Vagrantfileを作成します。

ディレクトリは、プロジェクトの(利用する)ディレクトリとなります。

今回はtest/vagrant/ 内に作ってみました。

[code]vagrant init centos64[/code]

初期化のコマンドで Vagrantfileが出来るかと思いますので、Vagrantfileの26行目

[code]# config.vm.network :private_network, ip: "192.168.33.10"[/code]

[code]config.vm.network :private_network, ip: "192.168.33.10"[/code]

コメントを外します。

また、ローカルipでアクセスする際は、Vagrantfileの22行目

[code]# config.vm.network :forwarded_port, guest: 80, host: 8080[/code]

[code]config.vm.network :forwarded_port, guest: 80, host: 8080[/code]

こちらもコメントアウト外すと良いかと思います。

例のコマンド vagrant up で起動するのを確認しましょう。

[code]vagrant up[/code]

問題なく立ち上がればOKです。

SSH設定

vagrant にSSHで接続する際は、

[code]vagrant ssh[/code]

で接続できるのですが、knifeコマンドから扱いやすくするためSSHの設定を行いましょう。

[code]vagrant ssh-config --host [sshエイリアス名] [/code]

で作成し、

[code]vagrant ssh-config --host [sshエイリアス名] >> ~/.ssh/config[/code]

で反映させます。

今回、hogegeで作成したので

[code]ssh hogege[/code]

のコマンドでvagrantにアクセス出来るようになります。

Chefリポジトリ(Cookbook)作成

Chefリポジトリ作成のコマンドは

[code]knife solo init [リポジトリ名][/code]

となります。

今回は test/ 直下にchef-repo というレポジトリ名で作ってみました。

[code]knife solo init chef-repo[/code]

とすると、

と、ディレクトリが作成されるかと思います。

ここで主に使うのは「site-cookbooks」「nodes」となります。

ここまで行いましたら、先ほどのレポジトリ直下へ移動し、

[code]cd chef-repo/ [/code]

Vagrant(node)の方に反映させていきます。

[code]knife solo prepare [sshエイリアス名][/code]

hogegeと設定しましたので、

[code]knife solo prepare hogege[/code]

となります。

処理完了後、反映されたことになります。

cookbook作成

それでは、cookbookを作っていきます。

作業はレポジトリ直下です。

[code]cd chef-repo/ [/code]

knifeコマンド cookbook createで、cookbookを作成します。

-o で出力先ですが、制作設定ファイルの格納先である site-cookbook/に指定。

[code]knife cookbook create [cookbook名] -o site-cookbooks/ [/code]

なにはともあれ、まずは、Hello Worldではないかと。。。 knife cookbook create hello で作ってみました。

すると、このような感じで、ファイルが出来るのでこのディレクトリの「recipes」以下にある 「default.rb」を扱っていきます。

default.rb

[code]log "Hello World"[/code]

を追記します。

このままでは反映されませんので、レポジトリ作成時に出来た

chef-repo/nodes/ [SSHエイリアス名].json

を修正します。今回は、

[code]chef-repo/nodes/hogege.json[/code]

となります。

[code]
{
"run_list":[
"recipe[hello]"
]
}
[/code]

このように runlistに先程のhelloを実行するに編集します。

このようにファイル作成しましたら、knifeコマンドで反映させていきます。

[code]knife solo cook [SSHエイリアス名][/code]

で反映することができます。

hogegeで作っていますので、

[code]knife solo cook hogege[/code]

となります。実行すると、

とlogが出力されていて成功したのが確認できます。

package インストール

と、Hello Worldと言っていてもしかたないので packageでインストールを行っていきましょう。

流れは上記と同じです。

packageによるvim のインストール

[code]
package "vim-enhanced" do
action :install
end
[/code]

serviceによる iptablesの指定

[code]
service "iptables" do
action [:stop, :disable]
end
[/code]

と、いままでコマンド叩いていたのがファイル形式で指定することが出来ます。

では、PHP、MySQL等一通りインストールしましょう。

default.rb

[code]
service "iptables" do
action [:stop, :disable]
end

%w{php php-common php-mbstring php-xml php-devel php-process php-cli php-pear php-mysql mysql-server httpd}.each do |p|
package p do
action :install
end
end

# apacheの起動 CentOSの場合
service "httpd" do
action [:start, :enable]
end

template "/var/www/html/index.html" do
source "index.html.erb"
mode 0644
end[/code]

と、手作業で行っていたのを一括で完了することが出来ます。

rubyが使えますので、 インストール対象を配列に格納して行うことも可能です。

[code]knife solo cook [SSHエイリアス名][/code]

で反映すると、ワサーっと入ってくるかと思います。

インストールした後、実行するとUPDATEの確認となりますのでご心配なく。

template

さらーと、

[code]
template "/var/www/html/index.html" do
source "index.html.erb"
mode 0644
end[/code]

と記述していたのですが、templateファイルとして扱うことも可能で、変数を渡すことも可能となっております。

template "/var/www/html/index.html"vagrantのパスとなります。

source "index.html.erb"cookbook内の対象ファイル

テンプレート格納先のディレクトリは

site-cookbooks/cookbook名/templates/default

となります。

試しに、

ああああああと書いた(適当ですみません。)

index.html.erbファイル

templateの格納先に格納し、ブラウザ(192.168.33.10)で確認。

上手くいきました。

また、更にテンプレートファイルに変数を渡すことも可能となっております。

変数の受け渡し

先程の「nodes」内のJSONファイルの、今回でいうところ「hogege.json」に記入して

変数の受け渡しを行う方法です。

hogege.json

[code]{
"user": {
"name": "webcyou!"
},
"run_list":[
"recipe[hello]"
]
}[/code]

テンプレート先 ファイル

index.html.erb

[code]
<html>
<p>Hello!! <%= node['user']['name'] %> </p>
</html>
[/code]

と、このように修正しました。

これを反映させると、

出来てるー!

httd.conf テンプレート化

更に、webサーバーの設定ファイルである、httd.confをテンプレート化していきます。

ssh [SSHエイリアス名] で、SSH接続し、httd.confをローカルの方へと持ってきます。

httd.confは以下に格納されております。

サーバー設定ファイル

[code]/etc/httpd/conf/httpd.conf[/code]

これをコピーしてきます。

[code]cp /etc/httpd/conf/httpd.conf /vagrant[/code]

すると、ローカルにも反映されますので、これをsite-cookbooks/cookbook名/templates/default にコピーして、拡張子をerbに変換。

site-cookbooks/cookbook名/recipes/default.rb

[code]
template "httpd.conf" do
path "/etc/httpd/conf/httpd.conf"
source "httpd.conf.erb"
mode 0644
end
[/code]

上記を追加後、nodeに反映。

[code]knife solo cook [SSHエイリアス名][/code]

これでテンプレート化完成。

直接扱うなり、jsonで設定した値を受け渡したりして設定を変更することが可能となります。

notifies

先ほど、webサーバーの設定ファイルである、httpd.confをテンプレート化したのですが、編集した際 Apacheの再起動が必要となります。

これを、手動で行うのではなく、ファイルが修正された際に行う様にしたい場合に notifies を利用します。

先ほどのrecipes/default.rb のhttpd.confの部分に以下を追記します。

[code]notifies :restart, 'service[httpd]'[/code]

を追記。

[code]
template "httpd.conf" do
path "/etc/httpd/conf/httpd.conf"
source "httpd.conf.erb"
mode 0644
notifies :restart, 'service[httpd]'
end
[/code]

これで、ファイルの変更があった際、Apacheの再起動が自動で行われます。

(httpd.conf変更後、knife solo cook [SSHエイリアス名]で反映)

その他

その他、公式ドキュメントである、

Resources and Providers Reference

http://docs.opscode.com/chef/resources.html

で、行えることが確認できます。

いやー色々とありますねー。

ではでは。

  • RSSを登録する

  • follow us in feedly

Graphical FrontEnd Engineer
- Daisuke Takayama

MAD CITY 北九州市で生まれ育つ。20代はバンド活動に明け暮れ、ふと「webデザイナーになりたい。」と思い、デジタルハリウッド福岡校入学。卒業後、数々の賞を受賞、web業界をざわつかせる。
現在、港区六本木で活動中。

WEBデザイナーの、WEBデザイナーによる、WEBデザイナーの為のサイト。「みんなで書こう!」と仲間を募ってみたが、結局書くのは自分だけとなってしまいました。日々のメモを綴っていきます。