Edited at

chefdkでchef-solo環境構築(CentOS)

More than 3 years have passed since last update.


概要

chef入門ということでchef-soloを利用してchefのハンズオンをしてみたいと思います。


index


とりあえず、30分でchef-soloを動かそう!


とりあえず、30分で他に人が作ったCookBookを使ってみよう! 



環境

CentOS 6.4 Minimal


とりあえず、30分でchef-soloを動かそう![手順1~10まで]


[手順1]chefdkインストール

wget https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chefdk-0.7.0-1.el6.x86_64.rpm

rpm -ivh chefdk-0.7.0-1.el6.x86_64.rpm


[手順2]パッケージインストール

chefはrsyncとsshを利用するのでないと後で怒られました。

必須パッケージインストール

yum install rsync openssh-clients

その他パッケージインストール

yum install wget vim man


[手順3]環境変数設定

chefdkに置いてある各種プログラムを最優先させるため以下のように環境変数を設定しました。

export PATH=/opt/chefdk/embedded/bin:$PATH


[手順4]knife-soloインストール

なぜかchefdk中にはknife-soloは含まれてません。なので別途入れておきます。

gem install knife-solo


[手順5]chef-solo初期設定&レポジトリ作成&CookBook作成

どのディレクトリで実行しても構いません。

初期設定

色々と聞かれるけど全てデフォルトでOKです。

knife configure

レポジトリ作成

knife solo init chef-repo

CookBook作成

作成したレポジトリに移動してBaaeという名前のCookBookを作成します。

cd chef-repo

knife cookbook create base -o site-cookbooks/


[手順6] レシピ作成

Hello Word的にapacheとtreeをインストールするレシピを作ってみましょう


site-cookbooks/base/recipes/default.rb


%w{httpd tree}.each do |pkg|
package pkg do
action :install
end
end


[手順7] リモートサーバにchefインストール

レシピを実行する側のサーバにchefをインストールします。

これは最初一回だけ実行すればいいです。

knife solo prepare xx@xxx.com


[手順8]RunList登録

[手順7]が終わったらnodesフォルダーに該当ホストのjsonファイルができがあります。(xxx.com.json)

そのファイルに実行したいレシピを指定します。(この設定がないと何も実行しません)


chef-repo/nodes/xx.json



{
"run_list":[
"recipe[base]"
]
}

※cookbookの名前だけ指定するとデフォルトとレシピであるDefault.rbが実行されます。


[手順9]実行!

実際RunListに登録したレシピを実行します。

(この時内部的にはrsyncとsshを利用します。)

knife solo cook xx@xxx.com


[手順10]動作確認

正常に終わってなかったらエラーが出るはずです。

後、リモートサーバ側に行ってレシピに登録した動作が正常に実行されたか確認すれば良いかと思います。



とりあえず、30分で他に人が作ったCookBookを使ってみよう![手順1~5まで]

次はコミュニティーにあるCookBookを利用する方法について学びます。

今回はBerkShelfというのを利用してコミュニティーにあるソースを取得します。

ただ、chefDKを使わないとBerkShelfをインストールするのが面倒でした。。

のでchefDKではない方でchef環境を構築した人は30分で終わるか断言できません。。

chefDKを入れておいたらberksShelfはすでに利用できる状態です。(環境変数さえ合ってれば)


[手順1]berksShelf環境構築

先ほど作ったレポジトリディレクトリに移動

cd /opt/chef/chef-repo

berkshelf initを実行するため

以下のファイル作成


metadata.rb

name             'hoge'

maintainer tbpgr
maintainer_email 'sample'
license 'All rights reserved'
description 'Installs/Configures createdb'
long_description 'long_description'
version '0.1.0'
depends 'git'

それから

berks init

するとBerksfileが作成されてるはず

Berksfileに以下の設定を入れておきます。

source "https://api.berkshelf.com"

cookbook 'mysql', '~>5.3.6'

このようにバージョンの指定は'~>5.3.6'のように指定できます。

Berksfileに設定したmysqlのcookbookをコミュニティーから取得するコマンドを実行します。


[手順2]cookbook取得

berks vendor cookbooks

ちなみに特定cookbookにの最新情報取得には

cookbooks/mysqlディレクトリを削除して

berks update mysqlすればいいです。


[手順3]取得したcookbookのレシピを登録

nodeにレシピ登録


chef-repo/node/xx.json

  "recipe[mysql::server]"


(knife solo prepare xx@xxが実行済みという仮定でnodesの下にリモートサーバ側のホスト.jsonファイルがあるはずです)

Run List が更新されたか確認

(しなくてもいいが、実行する前にRunListが間違ってないかチェックできる)

knife node show xx(host) -z


[手順4]実行

登録したレシピをリモートサーバ側に実行させる

knife solo cook xxx@xxx


[手順5]動作確認

実行後エラーが出なくリモートサーバ側で確認したらmysqlがインストールされていました。

rpm -qa | grep mysql

mysql-5.1.73-5.el6_6.x86_64
mysql-libs-5.1.73-5.el6_6.x86_64
mysql-server-5.1.73-5.el6_6.x86_64


その他

他の人が作ったレシピを自分が作った

recipe内で呼び出して色々設定を変えることもできます。

その時は自分のレシピで

include_recipe

と記述すればよいです。

設定例


base/recipe/default.rb

include_recipe 'mysql::server'

mysql_connection = {:host => "localhost", :username => 'root',
:password => node['mysql']['server_root_password']}

mysql_database node['mysql_test']['database'] do
connection mysql_connection
action :create
end

mysql_database_user node['mysql_test']['username'] do
connection mysql_connection
password node['mysql_test']['password']
database_name node['mysql_test']['database']
host 'localhost'
privileges [:select,:update,:insert, :delete]
action [:create, :grant]
end