chef soloの簡単な使い方、設定方法一覧メモ。
chefとその他の類似ツール比較
chef soloを使うにあたって、まずはchefとその他の類似ツールの比較。
chef
今回紹介するツール。類似するツールの中では比較的新しく、rubyによるDSLで簡単に記述できることが強み。2013年2月頃にfacebookが肩入れすることが発表されたので今後主流になっていきそう。
後でもうちょい詳しく説明します。
puppet
chefがでる前は主流だったツール。私は使ったことないので詳しくないです。
gihyo.jpに18回にも渡る連載があったので、詳しく知りたい人は見るとよさそう。
fabric
pythonで書かれたシェルスクリプトの薄いラッパーみたいなもの。簡単なコマンドを複数台に適用する時に便利。ほぼシェルスクリプトなので複雑な作業をするのは面倒そう。fabricとchefを比較している下記の記事が分かりやすくてよかったです。
chefサーバーとchef solo
chefには、chefサーバーによるサーバークライアント構成と、chef soloによる単体構成の二通りの使い方があります。
chefサーバーについては下記の2つの記事が詳しいです。
サーバー構築自動化ツール 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) 〜導入編〜