Chefの概要と基本的な使い方

chefとは

Chef is "Infrastructure as Code".

インフラの構成をコードで管理するためのフレームワーク

コマンドを実行するだけでセットアップの際に同様の環境を構築することができる

公式サイト: http://www.getchef.com/chef/

チュートリアル: https://learnchef.opscode.com/ 動画の説明が丁寧でとってもわかりやすい

f:id:n9lfcth9:20140221010948p:plain

大事な用語とその意味
用語 意味
Workstation cookbookを作成するknifeコマンドの実行, 作業サーバ
Chef Server chefの設定やcookbookを保存やノードに設定を反映させるなどchef全体を管理するサーバ
Node chef管理下に置かれているサーバ。ここに環境が構築される。仮想,物理サーバやクラウドインスタンスなどが該当
Cookbook サーバ構築のためのパッケージ。ファイル、テンプレート、ライブラリなどが含まれる
Recipe サーバ構築の流れを記述したファイル。Cookbookを構成する要素の一つ。複数のResourceと呼ばれる命令で構成される
knife workstationとchefサーバ間のインターフェースを提供するコマンドラインツール

1つのアプリケーションに対して1つのcookbookを作るのが一般的

サーバに反映させるまでの流れ

今回はstand-aloneモードで実行するため、chefサーバの構築は省略

  1. workstationへの各種インストールと設定
  2. Nodeの設定
  3. cookbookの作成
  4. Nodeへの反映

workstationへの各種インストールと設定

chefのインストール(MacOSの場合)

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

インストールしたらすごいたくさん「......」がでた

knife-soloプラグインのインストール

$ sudo gem install knife-solo

knifeコマンドの設定

$ knife configure

nodeの名前やchefサーバのURLなどを設定できるが、とりあえずはデフォルトの設定にした

Nodeの設定

今回はNodeにはVagrantを使用 http://www.vagrantup.com/

Vagrantファイルの作成

$ mkir vagrant
$ cd vagrant
$ vagrant init centos64

インスタンスを起動

$ vagrant up

ログイン簡略化のため、sshの設定に追記

$ vagrant ssh-config --host hoge >> ~/.ssh/config

cookbookの作成

ワークステーション上のvagrantディレクトリと同じ階層にchef用のリポジトリ作成した

$ knife solo init chef
$ tree chef
.
├── cookbooks
├── data_bags
├── environments
├── nodes
│   └── hoge.json
├── roles
└── site-cookbooks

site-cookbooksディレクトリの中でcookbookを作っていくことになる

Nodeにchefをインストール。chefリポジトリ内で実行。hogeには仮想マシンを指定する。user@hostという感じ

$ cd chef
$ knife solo prepare hoge

cookbookを作る。「hello」というcookbook名とする

$ knife cookbook create hello -o site-cookbooks/
$ tree site-cookbooks/
site-cookbooks/
└── hello
    ├── CHANGELOG.md
    ├── README.md
    ├── attributes
    ├── definitions
    ├── files
    │   └── default
    ├── libraries
    ├── metadata.rb
    ├── providers
    ├── recipes
    │   └── default.rb
    ├── resources
    └── templates
        └── default

11 directories, 4 files

recipesディレクトリのdefault.rbを編集

nodeのhoge.jsonで、nodeで使用するrecipeを指定。

{
    "run_list":[
        "recipe[hello]"
    ]   
}
recipeの作成

recipeには実行したいresourceを実行したい順番に記述していく。resourceの書き方については公式サイトに説明がある。

http://docs.opscode.com/chef/resources.html

resourceのフォーマットは以下のようになっている

<type> <name> do
    <attribute>(one or more)
    <action>(one or more)
end

簡単に言うと、typeは実行したいresouceの種類、nameは何に対して実行したいか、attributeはデフォルト変数、actionは何を実行したいか

recipeの例

package "vim-enhanced" do
    action :install
end

# service iptables stop
# chk config iptables off

service "iptables" do
    action [:stop, :disable]
end

# php mysql-server httpd
%w{php mysql-server httpd}.each do |p| 
    package p do
        action :install
    end 
end

service "httpd" do
    action [:start, :enable]
end

Nodeへの反映

Nodeに反映させるコマンドを実行。cookbookの設定にエラーが無ければ成功して反映される

$ knife solo cook hoge
Running Chef on hoge...
Checking Chef version...
Uploading the kitchen...
Generating solo config...
Running Chef...
Starting Chef Client, version 11.10.0
Compiling Cookbooks...
Converging 1 resources
Recipe: hello::default
  * log[hello] action write


Running handlers:
Running handlers complete

Chef Client finished, 1/1 resources updated in 0.918818871 seconds

ここまでがcookbookをnodeに反映させるための簡単な流れとなる

参考

特集 DevOps時代の必須知識:インフラストラクチャ自動化フレームワーク「Chef」の基本 - @IT http://www.atmarkit.co.jp/ait/articles/1305/24/news003.html

Chef入門 (全14回) - プログラミングならドットインストール http://dotinstall.com/lessons/basic_chef