読者です 読者をやめる 読者になる 読者になる

初めてのシステムと日記

システムも日記も初めてです。

さくらVPSにChefをインストール

Chef

Chefとは

■Chef | Opscode http://www.opscode.com/chef/

Rubyで作られたサーバ構成管理ツールです。
サーバへのインストール、設定変更、ユーザ作成等、
設定や更新を自動化しサーバの状態を管理する事が出来ます。

 

Rubyをインストールする

ChefはRubyで作られているので当然Rubyが必要になります。
さくらVPSはデフォルトでRubyが入っていないためインストールします。

ChefはRuby2.x系に対応していないため、ここではRuby1.9系最新をインストールします。

※調べる限りRuby2.x系に対応させるようにする事は可能なようです。
http://at-aka.blogspot.jp/2013/04/chef-solo-ruby-2.0.html

// 必要なパッケージインストール
$ yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel openssl-devel git

// ソース取得
$ cd /usr/local/src/
$ wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p429.tar.gz
$ cd ruby-1.9.3-p429 

// インストール
$ ./configure
$ make
$ make install

// 確認
$ ruby -v
ruby 1.9.3p429 (2013-05-15) [x86_64-linux]

 

Chefをインストールする

Rubyのインストールが終わったらgemを使ってChefをインストールします。

$ gem install chef

 

リポジトリ、クックブック、レシピ

Chefではよく以下の言葉が使われます。

  • レシピ
    • インストールする、設定ファイルを書き換える、ユーザーを作る等の手順をコード化したファイル
    • 例) Apacheをインストールする
  • クックブック
    • あるレシピに必要なファイルやデータをまとめたディレクトリ
    • 例) Apacheをインストールするためのソースファイルを入れる
  • リポジトリ
    • 全てのクックブックをまとめたディレクトリ

  上記の言葉を用いるとChefは以下の階層で管理されています。

リポジトリ > クックブック > レシピ

 

knifeの設定をする

knifeとはchefの便利コマンドの1つで、
主にリポジトリやクックブックを作成するために使われるコマンドです。

設定をするには以下コマンドを打ちます。

$ knife configure

いろいろ聞かれますが全てデフォルトでOKです。

 

knifeでリポジトリを作成する 

ここからは実際にChefの作業に入ります。
まずはknifeを使ってリポジトリを作成します。

// chef-repoというリポジトリを作成
$ knife solo init chef-repo

// 構造確認
$ tree chef-repo/
chef-repo/
|-- cookbooks
|-- data_bags
|-- nodes
|-- roles
|-- site-cookbooks
`-- solo.rb

 

knifeでクックブックを作成する

リポジトリを作ったので、次にクックブックを作成します

$ cd chef-repo

// cookbooksディレクトリにhelloというクックブックを作成
$ knife cookbook create hello -o cookbooks
** Creating cookbook hello
** Creating README for cookbook: hello
** Creating CHANGELOG for cookbook: hello
** Creating metadata for cookbook: hello

// cookbooksの下にhelloクックブックが作成された
# tree -F
.
|-- cookbooks/
|   `-- hello/
|       |-- CHANGELOG.md
|       |-- README.md
|       |-- attributes/
|       |-- definitions/
|       |-- files/
|       |   `-- default/
|       |-- libraries/
|       |-- metadata.rb
|       |-- providers/
|       |-- recipes/
|       |   `-- default.rb
|       |-- resources/
|       `-- templates/
|           `-- default/
|-- data_bags/
|-- nodes/
|-- roles/
|-- site-cookbooks/
`-- solo.rb

helloクックブックが作成され、データやファイルを格納するディレクトリやレシピが確認出来ました。

各ディレクトリでよく用いられるのは以下があります。※今回は基本的に使いません。

  • attributes, data_bags
    • レシピ、設定ファイル等を扱うテンプレート内で動的に使いたい値を定義するファイルの置き場所
    • attributes:特定のクックブックが対象
    • data_bags:リポジトリ全体が対象
  • files, templates
    • 設定ファイル等の外部ファイルの置き場所
    • files:静的ファイル
    • templates:attributesを用いて動的に値を展開するファイル
  • nodes
    • レシピを記述するJSONファイルの置き場所
    • サーバ毎にファイル設置したりする

 

レシピを編集する

もろもろ設定が終わったので、レシピを作っていきます。
先ほどのクックブック作成でレシピのデフォルトファイルも作られたのでそれを編集します。
ここではとりあえずHellow Chef!というお決まりのログを表示します。

$ vim cookbooks/hello/recipes/default.rb 

#
# Cookbook Name:: hello
# Recipe:: default
#
# Copyright 2013, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
log "Hello Chef!"

次にどのレシピを実行するかを記述するJSONファイルを作成します。

このファイルはクックブック作成時には作られてないため、
nodesディレクトリ直下に新規に作成します。

$ vim nodes/localhost.json

// localhost.json
{
    "run_list": [
        "recipe[hello]"
    ]   
}

最後にChefが使うテンポラリディレクトリやパスを指定する設定ファイルを編集します。
ここでは、リポジトリ名の変更と、cookbook_pathを実際に作ったクックブックのpathに合わせればOKです。

$ vim solo.rb

file_cache_path           "/tmp/chef-repo"
data_bag_path             "/tmp/chef-repo/data_bags"
encrypted_data_bag_secret "/tmp/chef-repo/data_bag_key"
cookbook_path             [ "/tmp/chef-repo/site-cookbooks",
                            "/tmp/chef-repo/cookbooks" ]
role_path                 "/tmp/chef-repo/roles"

レシピと設定ファイルの準備が出来たので、実際にChefで動かしてみます。

$ chef-solo -c solo.rb -j ./nodes/localhost.json 
Starting Chef Client, version 11.4.4
Compiling Cookbooks...
Converging 1 resources
Recipe: hello::default
  * log[Hello Chef!] action write

Chef Client finished, 1 resources updated

Hello Chef!が表示されました。
表示されずエラーが出る場合は以下の点を確認して下さい。

  • solo.rbの各pathが間違ってないか
  • nodes/localhost.jsonのsyntaxが正しいか
  • nodes/localhost.jsonで指定しているレシピが正しいか
  • レシピのsyntaxが正しいか

 

まとめ

今回はひとまずさくらVPSでChefをインストールし、動作する所まで対応しました。
これだけだとまだChefの有効性がよく分からんな感じだと思います。

例えば私がよくやるサーバセットアップは、以下が結構お決まりです。

  • FWの設定
  • 不必要なサービス停止
  • 一般ユーザの作成と権限変更
  • Apacheのインストールと設定ファイル変更
  • MySQLのインストールと設定ファイル変更
  • PHPのインストールと設定ファイル変更
  • MySQLのユーザーとDB作成
  • 必要なモジュール群インストール

これをChefで例えると、

  • 1つ1つの作業をレシピに書き換える(初回のみ)
  • サーバ固定の値やミドルウェアバージョンはattributesで持たせる
    • 例えばDNSやIPが違う場合はattributesのみ変更すればOKとなる
  • サーバによっていらないものはJSONファイルのrun_listから消すだけでOK
  • 同じような構成の場合、また一から作業ではなく、リポジトリを持ってきてchef-soloを実行するだけでOK

という感じでルーチンワークだったサーバセットアップが自動化でき、
かつサーバ管理もクックブックやレシピを見れば分かるようになります。

実際、レシピを書いていると普段のサーバセットアップよりも楽しいですし(今流行のRubyだし)、
コストやストレス的な負担も考えると有効なツールだと思います。