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



#概要

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

##index

###とりあえず、30分でchef-soloを動かそう！
###とりあえず、30分で他に人が作ったCookBookを使ってみよう！　

-------------------------------

##環境

```
CentOS 6.4 Minimal
```


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




##[手順１]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
```


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

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

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

```
yum install rsync openssh-clients
```


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

```
yum install wget vim man
```


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

```/etc/profile
export PATH=/opt/chefdk/embedded/bin:$PATH
```

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

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

```
gem install knife-solo
```


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

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

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

```
knife configure
```

レポジトリ作成


```
knife solo init chef-repo
```

CookBook作成

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

```
cd chef-repo
knife cookbook create base -o site-cookbooks/

```


##[手順６] レシピ作成

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

```site-cookbooks/base/recipes/default.rb

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




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


レシピを実行する側のサーバにchefをインストールします。
これは最初一回だけ実行すればいいです。

```
knife solo prepare xx@xxx.com
```

##[手順８]RunList登録

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


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

```chef-repo/nodes/xx.json

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

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

##[手順９]実行！

実際RunListに登録したレシピを実行します。
（この時内部的にはrsyncとsshを利用します。）


```
knife solo cook xx@xxx.com
```


##[手順１０]動作確認

正常に終わってなかったらエラーが出るはずです。
後、リモートサーバ側に行ってレシピに登録した動作が正常に実行されたか確認すれば良いかと思います。



---------------------------------


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



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

今回はBerkShelfというのを利用してコミュニティーにあるソースを取得します。
ただ、chefDKを使わないとBerkShelfをインストールするのが面倒でした。。
のでchefDKではない方でchef環境を構築した人は30分で終わるか断言できません。。

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

##[手順１]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に以下の設定を入れておきます。


```Berksfile
source "https://api.berkshelf.com"
cookbook 'mysql', '~>5.3.6'
```
このようにバージョンの指定は'~>5.3.6'のように指定できます。

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

##[手順２]cookbook取得

```
berks vendor cookbooks
```

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

```
cookbooks/mysqlディレクトリを削除して
berks update mysqlすればいいです。
```



##[手順３]取得した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
```



##[手順４]実行

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

```
knife solo cook xxx@xxx
```


##[手順５]動作確認

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

```xx@xxx
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
```


-----------------------------------------