Fork me on GitHub

役立ちぬ開発史、それはただのブログ

覚えておくといい、ブログの時代は終わる。いつかその内、きっとたぶん…

わくわくChef再入門、知らなきゃマズいChef Soloの使い方!

| Comments

先日、大学の友人(米国人)がPHPを触ろうと、XAMPPをインストールしていたので、Vagrantを紹介しました。後日、その友人から「Vagrant良いよ〜!」っと言ってもらえ、満足感に浸りしました。色々と使い方とか教えようかなッと思ったんですが、さすが米国人だけあって、英語がスラスラ、サラサラと読めてしまいます(当たり前ですが)。あっという間にドキュメント等を読み倒して、使いこなしてました(多分もうオレよりも使える…??)。 Vagrant単体でもかなり便利なのですが、今回は一緒に使うともっと便利になるChefの使い方を紹介します。これは知らなきゃヤバイ!w
(なんで、Vagrantじゃないかって?Chefを忘れないために、先に形を残したかったんだ。それだけさ…)

Chefとは

Chefは、Opscodeが開発しているサーバー管理ツールのオープンソース・ソフトウェアで、大きさが様々なインフラに対して、サーバやアプリケーションを簡単に展開するための自動化フレームワークです。Rubyを使うことで、コードによってインフラの構成管理を行えます。

以上、「インフラストラクチャ自動化フレームワーク「Chef」の基本」と「サーバー設定ツール「Chef」の概要と基礎的な使い方」を超簡単にまとめました。詳しく知りたい方は、各リンク先を見ましょう。

インストール

Chefをインストールするには、以下のコマンドを実行すれば大丈夫です。

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

Chefは、gemパッケージとしても配布されています。なので、gemを使って、インストールもできます。

1
sudo gem install chef

次に、knife-soloをインストールします。

1
sudo gem install knife-solo

ちゃんとインストールできているかを確認します。

1
gem list

インストールができたら、knifeでクックブックを作成する前に、初回の設定を済ませましょう。

1
knife configure

色々と質問されますが、基本的にデフォルトで大丈夫なのでenterを押すだけでいいです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
WARNING: No knife configuration file found
Where should I put the config file? [/Users/hoge/.chef/knife.rb]
Please enter the chef server URL: [https://XXXXXXX.jp:XXX]
Please enter an existing username or clientname for the API: [hoge]
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:
  /Users/hoge/.chef/hoge.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 /Users/hoge/.chef/knife.rb

終わったら、インストールとknifeの設定は完了です。

ChefでHello World

まず、knifeコマンドを使って、新規のchefリポジトリを作成します。

1
knife solo init リポジトリ名

作成したリポジトリに移動し、knifeを使って、クックブックを作成します。

1
knife cookbook create hello -o cookbooks

これで、helloというクックブックをcookbooks内に作成します。 今回は、knife solo initで作成した際に、デフォルトで用意されたcookbooksディレクトリ内に作成しました。しかし、基本的にネット上で配布している自分では変更しないクックブックを入れるのが慣習になっています。自分で変更するものは、-o cookbooks-o クックブックのディレクトリ名にして、新しくディレクトリを作成しましょう。

次にレシピを作成します。cookbooks/hello/recipes/default.rbに、以下を追記しましょう。

1
log "Hello, World & Chef!"

ログで、"Hello, World & Chef!"と出力するレシピにします。

Chef Soloを実行するために、少し設定します。 まず、実行するレシピを書いたlocalhost.jsonを作成し、knife solo initで作成したリポジトリの直下に置きます。

1
2
3
4
5
{
    "run_list" : [
        "recipe[hello]"
    ]
}

次に、Chefが利用するテンポラリディレクトリやクックブックのパスの指定を書いたsolo.rbを作成して、これもknife solo initで作成したリポジトリの直下に置きます。

1
2
file_cache_path "/tmp/chef-solo"
cookbook_path ["/PATH/TO/リポジトリ名/cookbooks"]

これで、設定は完了しました。chef-soloコマンドを実行しましょう。Chef Soloはサーバーのあらゆるファイルを操作する性質があるため、実行するときは、sudoが必要です。

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

実行に少し時間がかかりますが、以下のように"Hello, World&Chef!"が出力されたら成功です。失敗してたら、どこかがおかしいので、見直しましょう。

1
2
3
4
5
6
7
Starting Chef Client, version 11.8.0
Compiling Cookbooks...
Converging 1 resources
Recipe: hello::default
  * log[Hello, World & Chef!] action write

Chef Client finished, 1 resources updated

以上、Chef Soloの流れは

  • レシピの作成
  • JSONファイルで実行するレシピの指定
  • chef-soloコマンドで実行

になります。

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

Hello Worldができたら、Chefのおおまかな流れがわかったと思います。Chefの良さを感じるのは、ここからです。cookbooks/hello/recipes/default.rbに、以下を追記します。

1
2
3
package "zsh" do
    action :install
end

そのあと、実行すると"zsh"がインストールされます。

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

インストール成功。

1
2
  * package[zsh] action install
    - install version 4.3.10-7.el6 of package zsh

インストール後にもう一度実行すると、既にインストールされているとスルーされます。

1
  * package[zsh] action install (up to date)

パッケージをまとめて入れる場合は、Rubyの強みを活かします。

1
2
3
4
5
%w{zsh gcc make readline-devel}.each do |pkg|
    package pkg do
        action :install
    end
end

ループを使って、実行するとzsh gcc make readline-develがまとめてインストールされます。

1
2
3
4
5
  * package[zsh] action install (up to date)
  * package[gcc] action install (up to date)
  * package[make] action install (up to date)
  * package[readline-devel] action install
    - install version 6.0-4.el6 of package readline-devel

この場合はほとんどスルーされてますが、何も入っていない場合は、ちゃんとインストールされます。

Chefの冪等性

Chefは、冪等性を保証しています。冪等性とは、Wikipediaより

ある操作を1回行っても複数回行っても結果が同じであることをいう概念である。

なので、Chefを何度実行しても、サーバーの状態は同じになります。さっきのzshの2回目のインストールがスルーされたのは、そのためです。

Resource

レシピを書く際に使用したlogpackageは、ChefのDSLになります。このレシピ内で、サーバーに何か影響を与えるものをChefでは、”Resource”と呼びます。 このResourceに一覧は、公式ドキュメントのResources and Providers Referenceで見れます。

おわりに

Hello Worldまではローカルでも試せますが、packageなどのResourceを試すにはサーバーが必要です。いつ壊しても問題ないサーバーでChefのテストをしたい、そんな時にVagrantが役に立つのです。今度Vagrantについて綴ろります。

またChefを学ぶ際には、伊藤直也さんの「入門Chef Solo」をすごく参考にしました。とても分かりやすく、また量もそんなに多くなく最後まで読めるので、Chefを学ぶにはうってつけです!!
ただ、内容が古くなっているところもあるため、書いてあるコードが全て実行できるわけではありません。

Comments