chefを動かす

今回は、chefを使ってみたいと思います。
前提として、chef、svnサーバがあることとし、主に利用する側に焦点を当てていきます。
かなり、特定の環境に特化しているかもしれませんが、、

基本の3工程

cookbookを作成する

cookbookを作成します

knife cookbook create ${cookbook_name} -o /opt/chef-repo/cookbooks

結果、指定したフォルダにファイルとともにテンプレート?を生成してくれます。

svnを利用している場合は、以下で対象フォルダのみコミットできます。

svn add ${cookbook_name} --force
svn commit -m "${commit message}"

今回はjavaのインストールをやってみます。
cookbook/recipes/default.rb を編集します

package "{java package name}" do
  action :install
end
//パスを通す場合(環境に依存します)
# add java path
script "path_java" do
  interpreter "bash"
  user "root"
  group "root"
  code <<-EOH
    if [ ! -f /usr/bin/java ] ; then 
        ln -s /usr/local/java/bin/java /usr/bin/java
    fi
 EOH
end

最後に変更をshefサーバに知らせます

knife cookbook upload {$cookbook name} -o /opt/chef-repo/cookbooks
roleを作成する

以下のコマンドでロールが作成されます

knife role create ${role_name} --editor=vi

参照する場合、

knife role show ${role_name}

指定したファイルで上書きする場合、先ほど
下記のように記述をしたファイルを作成し、
${role_name}.rb 任意ですが、こんなファイルを作ります。

name "${role_name}"
description "${role_name}"
run_list(
    "recipe[${cookbook_name}]"
)

そして、以下のコマンドでupdateします

knife role from file 追加したロールのファイルのフルパス
clientから

実際に配置を行いたいサーバで実行します。
chef-clientはすでに入っているものとします。

まずnodeファイルを作ります。
いろんな書き方があるとは思いますが、こんな感じです。
詳しくはまだ調べてないので、こんな感じで、指定します。
ファイル名は任意ですが、${server name}.json とかが適当でしょうかね

{
    "normal": {
        "service_attr": {
            "env": "${env}",
            "manager": "false",
            "client": "true"
        },
        "tags": [
        ],
        "ip": "${server ip}"
    },
    "name": "${server name}",
    "override": {
    },
    "default": {
    },
    "json_class": "Chef::Node",
    "automatic": {
    },
    "chef_environment": "${env}",
    "run_list": [
        "role[${role name}]"
    ],
    "chef_type": "node"
}

今度はクライアントから、knifeコマンドで通知してあげます。

sudo knife node from file chef/node/${server name}.json

これで準備が整ったのでchefの実行です

sudo chef-client

完了です。

雑感

cookbookでは今回、recipeしか使っていませんが、
templeteなども便利そうなので使っていけたらと思いました。
あと、filesとか