knifeクライアントの設定〜chef実行までのメモ。
knifeはchefの管理コマンドで、chefノード/chefサーバ/cookbookの管理から、ノードとレシピの紐付けなどknifeコマンドを介して行われる。以下、knifeクライアントとなるマシンを、chefノードとは別に構築するケースの手順を示す。




(1) 必要なパッケージをインストール

knifeコマンドはchefに梱包されているので、chefをインストールする。

1
2
yum install ruby ruby-devel ruby-ri ruby-rdoc ruby-static rubygems
gem install chef

(2) chef-serverの公開鍵をknifeクライアントマシンに配布

chefサーバの/etc/chef/validation.pemをknifeクライアントの/etc/chef/validation.pemに配置する。ここまではchef-clientのインストールと同じ。

(3) knifeの設定

knifeクライアントとなるマシンを、Admin権限をもつクライアントとしてchef-serverに登録する必要がある。なので次のようなコマンドをchefサーバで実行し、knifeクライアントマシンをchef-serverに登録する。

1
2
3
4
export EDITOR=vi
knife client create knife -a -k /etc/chef/client.pem
# ここで、「"admin":true」の要素をもつjsonが出力されるので「:wq」をタイプして保存。
# 続いて標準出力にknifeクライアントが持つべき秘密鍵が出力されるので、コピーしておく。

秘密鍵をknifeクライアントマシンに登録する。

1
2
3
# chefサーバで出力された秘密鍵をknifeクライアントマシンのclient.pemに保存。
mkdir /etc/chef
vim /etc/chef/client.pem

そしてknifeの設定を行う。knifeクライアントマシンで次のようなコマンドを叩く。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# knifeを実行するユーザになっておく。
# これは、knifeの設定ファイルが$HOME/.chef/knife.rbに作成されるため(設定ファイルの場所は変えられるけど)。
su - knife_user
# knifeの設定コマンドを叩く
knife configure

# 対話的に設定がなされる。次の通りで概ね問題ない。
Where should I put the config file? [~/.chef/knife.rb]
Please enter the chef server URL: [http://localhost:4000] http://xxx.xxx.xxx.xxx:4000
Please enter an existing username or clientname for the API: [] knife
Please enter the validation clientname: [chef-validator]
Please enter the location of the validation key: [/etc/chef/validation.pem]
Please enter the path to a chef repository (or leave blank): /home/knife_user/chef-repo

# デフォルトでは秘密鍵は$HOME/.chef/knife.pemを参照するようになっているので、
# 次のようにしてシンボリックリンクを貼っておく。
# もしくは$HOME/.chef/knife.rbのclient_key項目を編集して/etc/chef/client.pemを見るようにする。
ln -s /etc/chef/client.pem /home/knife_user/.chef/knife.pem

(4) 確認

次のコマンドを叩いて、ノードの一覧が取得できればOK

1
knife node list

ここまででknifeの設定は完了。続いて、cookbookの設定、レシピとノードの紐付け、chef-clientの実行までを記載する。

(5) Cookbookの作成

knifeクライアントマシンでCookbookの作成を行う。opscodeからchefリポジトリのひな形を落とし、knifeコマンドにてcookbookを作成する。

1
2
3
4
5
6
7
8
9
10
11
12
# (3)knifeの設定(knife configure)で設定したchef repository($HOME/.chef/knife.rbにも記載あり)にchef-repoを作成する。
cd /home/knife_user
# opscodeから
wget --no-check-certificate -O ./chef-repo.tar.gz http://github.com/opscode/chef-repo/tarball/master
tar xvfz chef-repo.tar.gz
mv opscode-chef-repo-a3bec38 chef-repo
# オーナをknifeを実行するユーザにしておく
chown -R knife_user. chef-repo

# 次のコマンドを叩いて、cookbook「test」を作成する。
# このコマンドにより、/home/knife_user/chef-repo/cookbooksの配下にtestディレクトリとひな形が生成される。
knife cookbook create test

(6) recipeの作成

cookbookを作成したらrecipeの作成にとりかかる。ここでは例として、chef-clientを実行すると、MySQL-serverのインストール、my.cnfの配置(とbind-addressの設定)、/etc/sysctl.confへのファイル配布(とsysctl -pの実行)を行う。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# /home/knife_user/chef-repo/cookbooks/testに移動
cd /home/knife_user/chef-repo/cookbooks/test
# 様々なディレクトリが確認できるが、
# 今回の例では<strong>files</strong>、<strong>templates</strong>、<strong>recipes</strong>に着目する。
ll
-rw-r--r-- 1 knife_user knife_user 88 104 16:26 README.md
drwxrwxr-x 2 knife_user knife_user 4096 104 16:26 attributes
drwxrwxr-x 2 knife_user knife_user 4096 104 16:26 definitions
drwxrwxr-x 3 knife_user knife_user 4096 104 16:26 <strong>files</strong>
drwxrwxr-x 2 knife_user knife_user 4096 104 16:26 libraries
-rw-r--r-- 1 knife_user knife_user 260 104 16:26 metadata.rb
drwxrwxr-x 2 knife_user knife_user 4096 104 16:26 providers
drwxrwxr-x 2 knife_user knife_user 4096 104 17:13 <strong>recipes</strong>
drwxrwxr-x 2 knife_user knife_user 4096 104 16:26 resources
drwxrwxr-x 3 knife_user knife_user 4096 104 16:26 <strong>templates
</strong>

 

files配下にsysctl.confを配置する。filesディレクトリには、各chef-clientノードにそのまま配布するような静的ファイルを配置する。ファイルの中にIPアドレスなど、各サーバによって動的に変化するパラメータがある場合は、後述するtemplates配下にerb形式で配置する。

1
2
3
4
5
# files配下にsysctl.confを配置するためのディレクトリを掘る。
# files/defaulsは既にあるので、その下にetcを作成する。
mkdir  -p files/default/etc
# 各chefノードに配布したいsysctl.confを、files配下に置く。
cp -p /xxx/xxx/sysctl.conf files/default/etc/

続いて、templates配下にmy.cnfをerb形式で配置する。

1
2
3
4
5
cp -p /xxx/xxx/my.cnf templates/default/my.cnf.erb
# ここで、ここでmy.cnf.erbのbind-addressは、各サーバのIPが自動で振られるように次のように記載しておく。
------------------------------------------------------
bind-address    = <%= node[:ipaddress]%>;
------------------------------------------------------

recipeの編集を行う。recipes/default.rbを次のような内容として保存する。前述したとおり、MySQL5.5.28-1のインストール、/etc/sysctl.confの配布と反映、my.cnfの配布を行うレシピである。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
execute "yum clean all"

mysql_packages = {
"MySQL-server" => {"version" => "5.5.28-1"}
}

mysql_packages.each{|key,value|
package key do
version value["version"]
action :install
end
}

cookbook_file "/etc/sysctl.conf" do

source "/etc/sysctl.conf"
owner "root"
group "root"
mode "0644"
end

execute "/sbin/sysctl -p"

template "/etc/my.cnf" do
source "my.cnf.erb"
owner "mysql"
group "mysql"
mode "0644"
end

(7) recipeとノードを紐づける

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# ノード一覧とノード名の確認
knife node list

mysql01
mysql02
・・・
# mysql01とrecipe[test]を紐づける
knife node run_list add mysql01 'recipe[test]'
# 確認
knife node show mysql01

Node Name: mysql01
Environment: _default
FQDN: mysql01
IP: 192.0.2.1
Run List: recipe[test]
Roles:
Recipes: test
Platform: centos 5.4

(8) cookbookのアップロード

knifeコマンドを用いて作成したtestクックブックをchef-serverにアップロードする。

1
2
3
4
# 以下のコマンドで全てのcookbookをアップロードする。
# ちなみに複数のcookbookを作成していて、
# アップロード対象を選びたい場合はknife cookbook upload xxxx(cookbook名)とする。
knife cookbook upload -a

(9) chef-clientの実行

ようやくchef-clientを実行する。各chefのノード(この例だとmysql01)で次のコマンドを叩く。

1
chef-client

(10) 確認

1
2
3
4
5
6
rpm -qa | grep -i mysql
→ MySQL-server-5.5.28-1.rhel5
cat /etc/my.cnf | grep bind
→ bind-address    = 192.0.2.1
cat /etc/sysctl.conf
→ 配布したsysctl.confの内容

以上がchefの設定&実行手順である。

(11) chefってか自動化について

3記事連載(?)で、puppetとならび自動化のツールの一つであるchefの構築手順および実行手順を示した。

で、俺の担当システムでchefを使っているかというと、最近担当になったシステムでは使っているが(元々いたメンバーがchefでやっていた)、あとはそうでもない。自動化は割とスクリプティングで十分だったりするケースもある。ここ1年くらい担当しているシステムでは、chefを構築したものの、結局は自作スクリプトとcapistranoの組み合わせでサーバ構築やファイル配布を行っていた。それで十分だったので。

結局のところ、システムの特性や環境にあったツール/手法を選択したらいいかな、と。「これからはサーバ構築/管理はchefやらpuppetでやる!」ってなると他のメンバにも啓蒙が必要だしね。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Set your Twitter account name in your settings to use the TwitterBar Section.