Chef-Solo + Knife-Solo + Berkshelf 環境のつくりかた
Chef-Solo + Knife-Solo + Berkshelf 環境を構築するときに少しはまったので、まとめておきます。
ブログ投稿時点(2013/08/20)では knife-solo のバージョンだけ気をつけておけば大丈夫です。 knife-solo のバージョンが古いと2回目以降の実行時にうまくいかないためです。 その他の構築自体は難しくありません。
以下、構築手順です。
1. 前提
構築対象となるリモート側のサーバへはすでにSSHによるログインが可能であるものとします。
2. chef, knife-solo, berkshelf のインストール
以下のGemfileを用意してbundle install
を行います。
Gemfile
source "https://rubygems.org"
gem 'chef'
gem 'knife-solo', '>= 0.3.0.pre5'
gem 'berkshelf'
** knife-solo のバージョンについて **
指定しない場合、0.2.0系がインストールされますが、2回目以降の実行時にエラーとなります。 原因などはこちらが詳しいです。
Hack like a rolling stone - knife-solo 0.2.0 で rsync エラーによって苦しまないためのたったひとつの方法
3. cookbookの準備
Chefのリポジトリをつくる
$ knife solo init chef-repo
chef-repo内に以下の構成が生成されます。必要に応じてGit管理を行ってください。
$ tree chef-repo/
chef-repo/
├── cookbooks
├── data_bags
├── nodes
├── roles
└── site-cookbooks
** Cookbookを置く場所について **
自分でつくるCookbookはsite-cookbooks
以下に、公開Cookbookはcookbooks
以下に置きます。
knife-soloではcookbooks
配下は.gitignore
で除外対象となっており、後述のBerkshelfなどの利用を前提としているようです。
** knife-solo はsshコマンドのオプションが使えます。証明書の指定などがある場合に便利です。 **
4. Cookbookの作成
自分でCookbookをつくる場合
今回は環境構築をメインにするので、雛形作成の手順のみ。
$ knife cookbook create xxx -o site-cookbooks/
公開Cookbookを利用する場合
リポジトリ直下にBerksfile
を作成する
site :opscode
cookbook "public_cookbook_name"
5. リモート側でChef-Soloを実行する
実行するレシピの指定
nodes
以下にsevername.json
が作成されているので、run_list に実行したいレシピを指定する。
{
"run_list": [
"public_cookbook_name::recipe_name", "cookbook_name::recipe_name"
]
}
** 公開Cookbookも忘れずに追加しておきます **
リモート側でのChef-Solo実行準備
$ knife solo prepare username@servername
これにより、リモート側にChefがインストールされます。
リモート側でのChef-Solo実行
$ knife cook username@servername
これによりリモート側にCookbookが送信され、run_listで指定したレシピが実行されます。
6. Tipsなど
knife-soloでattributesを使う
nodes/servername.jsonに追加
{
"run_list": [
"cookbook_name::recipe_name"
],
"hoge": {
"fuga": "piyo"
}
}
この例ではrecipe内でnode.hoge.fuga
として値を利用できます。
Vagrant + Chef-Solo の環境構築は手軽にできますが、いざVagrant以外に適用しようとすると意外と面倒です。
今回のようにknife-soloをかませておくことで、対象のサーバを選ばずにChef-Soloを実行でき、とても便利です。
環境構築を行うときは、Berkshelfによる公開Cookbookの管理とあわせた今回の構成をおすすめします。