chef soloの簡単な使い方、設定方法一覧

chef soloの簡単な使い方、設定方法一覧メモ。



chefとその他の類似ツール比較


chef soloを使うにあたって、まずはchefとその他の類似ツールの比較。


chef

今回紹介するツール。類似するツールの中では比較的新しく、rubyによるDSLで簡単に記述できることが強み。2013年2月頃にfacebookが肩入れすることが発表されたので今後主流になっていきそう。

後でもうちょい詳しく説明します。


puppet

chefがでる前は主流だったツール。私は使ったことないので詳しくないです。

gihyo.jpに18回にも渡る連載があったので、詳しく知りたい人は見るとよさそう。

連載:オープンソースなシステム自動管理ツール Puppet


fabric

pythonで書かれたシェルスクリプトの薄いラッパーみたいなもの。簡単なコマンドを複数台に適用する時に便利。ほぼシェルスクリプトなので複雑な作業をするのは面倒そう。fabricとchefを比較している下記の記事が分かりやすくてよかったです。

Chefに挫折したあなたへ。Fabricのすすめ



chefサーバーとchef solo


chefには、chefサーバーによるサーバークライアント構成と、chef soloによる単体構成の二通りの使い方があります。


chefサーバーについては下記の2つの記事が詳しいです。


開発サーバに chef を入れるときの 11の方法

サーバー構築自動化ツール Chef 最新版のインストール方法


chefをサーバークライアント構成で使おうとすると上記のように少し大変なのですが、スタンドアローン版のchef soloを使うともう少し簡単に導入できます。



chefサーバーとchef soloの比較


chefサーバーは複数台のサーバー構成を一括管理する時に便利です。その代わり、導入が少し面倒です。


chef soloは導入が簡単なため、小数のサーバーをchefで管理する時に便利です。その代わり、各サーバー内にログインして毎回chef soloを実行する必要があります。chefサーバーは設定の一括配布なのでこの手間がないです。


chef soloは、「chefサーバーを導入するほど台数は多くないけど、そのうち多くなるし、今のうちにchefに慣れておくか」という時に便利です。chef soloで使うクックブックやレシピはchefサーバーでも共通して使えるからです。


それではやっと、chef soloを使ってサーバー構成を管理する方法について解説していきます。



chefのインストール


chefのインストール前に、EC2サーバーの初期設定を行います。既にやっているならこの手順は不要です。

# timezoneを日本標準時に設定
sudo cp /usr/share/zoneinfo/Japan /etc/localtime

sudo yum update -y

chef本体をインストールするのは下記のコマンドです(設定とか他にもすることはあります)。gemを使う方法もあるのですが今回は紹介しません。


curl -L http://www.opscode.com/chef/install.sh | sudo bash

chefをインストールする時にchef soloもインストールされます。



knifeの設定


knifeはchefをインストールする時に一緒にインストールされます。gitコマンドのように、サブコマンドと組み合わせることでchefに関する色々な作業を行うことができます。


knifeを使うには下記のような初期設定が必要です。


※knife solo、chef soloだけを使う場合にはknife configureは不要のようです。


$ knife configure

WARNING: No knife configuration file found
Where should I put the config file? [/home/ec2-user/.chef/knife.rb]
Please enter the chef server URL: [https://ip-12-34-56-78.ap-northeast-1.compute.internal:443]
Please enter an existing username or clientname for the API: [ec2-user]
Please enter the validation clientname: [chef-validator]
Please enter the location of the validation key: [/etc/chef-server/chef-validator.pem]
Please enter the path to a chef repository (or leave blank):
*****

You must place your client key in:
  /home/ec2-user/.chef/ec2-user.pem
Before running commands with Knife!

*****

You must place your validation key in:
  /etc/chef-server/chef-validator.pem
Before generating instance data with Knife!

*****
Configuration file written to /home/ec2-user/.chef/knife.rb

EC2サーバーにec2-user(デフォルトのユーザー)でログインしていると上記のように表示されます。全部デフォルトのままでとりあえずOKです。443番ポート(https)はchef soloでは使いません。



knife soloのインストール


chef soloはログインしたサーバー内での実行を前提としていますが、knife soloを使うことで複数のリモートホストにchefをインストールしたりchef soloを実行したりできるようになります。


knife soloはgemでインストールします。


sudo /opt/chef/embedded/bin/gem install knife-solo --no-ri --no-rdoc

chefをインストールする時にrubyも一緒にインストールされるため、そのrubyと対応する/opt/chef/embedded/bin/gemにknife-soloをインストールしています。(元情報)


# vi ~/.chef/knife.rb

# 追記する。少なくともknife soloを使うだけならこの手順は不要なようです
knife[:solo_path] = '/tmp/chef-solo'

以上でknife soloの設定は完了です。knife soloには下記のコマンドが用意されています。


# 指定したホストにchef soloをインストール
knife solo prepare [host]
knife solo prepare [user]@[host]

# 指定したホストでchef soloを実行
knife solo cook [host]

# run_listを個別に指定
knife solo cook [host] -o hello::default, nginx::default

# 指定したホストに転送したレシピ類を削除
knife solo clean [host]

# 新規chefレポジトリを作る
knife solo init chef-repo

knife soloで実行するリモートホストのユーザーは、パスワードなしでsudoやchef soloを実行できる必要がある点にご注意ください。EC2サーバーのec2-userならこの条件を満たしています。



knife soloを使ってchefをリモートホストへインストール


knife soloを使ってlocalhostへchefをインストールします。chefは既にcurlでインストールされているのですが、この手順によりnodes/localhost.jsonが作成されるので実行しておく必要があります。


# 指定したホストにchef soloをインストール
knife solo prepare ec2-user@localhost -i [id_rsa]

今回はテストなのでlocalhostを指定していますが、実際はリモートホストを指定することになります。



chefリポジトリの作成


chefでは下記のような単位でサーバー構成を管理するファイルを扱います。レポジトリがだいたいサーバー一台相当で、レポジトリの中にクックブックが複数あり、クックブックの中にレシピが複数ある、という風になっています。


レポジトリ(キッチン) > クックブック > レシピ


レポジトリの準備は下記のコマンドで完了です。knife soloを使ってレポジトリを作成します。


knife solo init chef-repo

git cloneで同様の作業を行うこともできます。


git clone git://github.com/opscode/chef-repo.git

作成したレポジトリはgitで管理するようにしましょう。


cd chef-repo
git init
git add .
git commit -m 'first commit'


chefクックブックの作成


cookbooksディレクトリにhelloクックブックを作るには下記のコマンドを実行してください。


cd chef-repo
knife cookbook create hello -o cookbooks

クックブックを入れるディレクトリには、cookbooksとsite-cookbooksがよく使われるようです。


「cookbooksは第三者が作ったクックブックを入れる、site-cookbooksは自分が作ったクックブックを入れる」という使い分けが伊藤直也さんの資料で紹介されていましたが、今のところ使い分けは人それぞれのようです。


ちなみに、site*というディレクトリ名はdebian系の名残りのようです。



chefレシピの作成


cookbooks/hello/recipes/default.rbに下記のコードを記述してください。どれか1つだけでも、全部書いても大丈夫です。それぞれ対応したパッケージをインストールするレシピになります。


# vi cookbooks/hello/recipes/default.rb

# 「Hello Chef」と表示する
log "Hello Chef"

# zshをインストールする
package "zsh" do
  action :install
end

# 列挙されたパッケージを全部インストールする
%w{zsh gcc make readline-devel}.each do |pkg|
  package pkg do
    action :install
  end
end

「do ~ end」や「%w」はそれぞれrubyの記法です。「do ~ end」はブロックの最初と最後、「%w」は文字列配列の省略記法(["zsh", "gcc" ...]と同じ)になります。

chef soloの実行


まず、nodes/localhost.jsonを下記のように書き換えてください。


# vi nodes/localhost.json

# この行を
{"run_list":[]}

# このように書き換え
{"run_list":["recipe[hello]"]}

後は下記のコマンドで作成したレシピをリモートホスト内のchef soloから実行できます。


knife solo cook [user]@[host]

# EC2サーバーでlocalhostを指定する時
knife solo cook ec2-user@localhost -i [id_rsa]


knife soloからchef soloを実行する時は上記のコマンドのみで大丈夫なのですが、chef soloだけで実行する時はsolo.rb、localhost.jsonを自分で作る必要がありとても面倒です。その手順も一応書いときます。


※下記の2つのファイルはローカルホストのchef soloを単体で動かす場合のみ必要です。


# chef-repoディレクトリ直下のlocalhost.json

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

# chef-repoディレクトリ直下のsolo.rb

file_cache_path "/tmp/chef-solo"
cookbook_path ["/home/ec2-user/chef-repo/cookbooks"]

localhost.jsonとsolo.rbが用意できたら、下記のコマンドで実行できます。


sudo chef-solo -c ./solo.rb -j ./localhost.json


chefと冪等性


上記のchef-soloコマンド(= knife solo cook [host])は何回実行してもOKです。二度目以降は「action install (up to date)」と表示され特に何も行われません。これがシェルスクリプトとchefの重要な違いの1つであり、冪等性と呼ばれる性質になります。


冪等性(べきとうせい)

同じ操作を複数行っても結果が同じである性質のこと。例えば、num = 1は冪等ですが、num++は冪等ではないです。



参考リンク


図が入っていて分かりやすいし、開発環境と本番環境の使い分け等にも言及していて実践的です。

Chef Soloと Knife Soloでの ニコニコサーバー構築 (2) 〜導入編〜


著者プロフィール
Webサイトをいくつか作っています。
著者プロフィール