fbpx

Chef-SoloからChef-Clientローカルモードへの移行 #opschef_ja #getchef_ja

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

はじめに

先の記事 [和訳] ソロからゼロへ: Chef Clientローカルモードへの移行 で取り上げられている「Chef-Zero」は一旦忘れましょう。私達は「Chef-SoloからChef-Clientローカルモードへの移行」を行いないたいのであって、「Chef-Clientローカルモードの技術背景であるChef-Zero」について深く知りたいのではありません。また、「Chef-SoloからChef-Zeroへ移行」のように誤解した言われ方をされることがあります。次に簡単に説明していきます。

Chef-Soloでは次図のように、ローカルファイルシステム上にあるCookbookやAttributeなどのポリシーを参照して収束を行います。

chef-solo

Chef-Clientローカルモードでは次図のように、Chef-Zeroという言うなればラッパーを自動的に介してローカルファイルシステム上にあるポリシーとNode Objectを参照して収束を行います。「自動的に」という部分がポイントで、別にChef-Zeroの設定が必要だとか、存在を意識しなけばいけないとか、そのようなことは通常はありません。

chef-client-local-mode

Chef-ClientとChef-Serverによるクライアント・サーバモードでは次図のように、Chef-ClientはChef-Serverに問い合わせ、Node Objectとの比較を行い、ポリシーを受け取って収束を行います。

chef-client

すなわちローカルモードとは、ローカルファイルシステムに存在するポリシーとNode ObjectをあたかもChef-Serverに存在するかのように扱うことのできる機能で、これを実現するためにChef-Zeroを使っているに過ぎないということです。だから、Chef-Zeroのことはひとまず知らないでいても問題ありません。

ローカルモードの利点は、

  • Solo非対応のCookbookをChef-Serverを使わずに利用できる。代表的な例はsearch機能
  • ローカルファイルシステムにNode Objectや永続的なAttributeを保持できる。
  • ローカルモードからクライアント・サーバモードへの移行が比較的簡単にできる。その逆もできる。

などが挙げられるでしょう。

では、Chef-Clientローカルモードの例をいくつか見ていきましょう。

下準備

環境としてUbuntu 12.04 LTSにChef DK 0.3.2をインストールしたものを準備します。


ubuntu@ubuntu:~$ sudo dpkg -i chefdk_0.3.2-1_amd64.deb
以前に未選択のパッケージ chefdk を選択しています。
(データベースを読み込んでいます ... 現在 49086 個のファイルとディレクトリがインストールされています。)
(chefdk_0.3.2-1_amd64.deb から) chefdk を展開しています...
chefdk (0.3.2-1) を設定しています ...
Thank you for installing Chef Development Kit!
ubuntu@ubuntu:~$

chef generate repo」コマンドでchef-repoを作成し、以降の作業ディレクトリとします。


ubuntu@ubuntu:~$ chef generate repo chef-repo
Compiling Cookbooks...
Recipe: code_generator::repo
* directory[/home/ubuntu/chef-repo] action create
- create new directory /home/ubuntu/chef-repo
:
:
:
(diff output suppressed by config)
ubuntu@ubuntu:~$

ubuntu@ubuntu:~$ tree -a chef-repo
chef-repo
├── LICENSE
├── README.md
├── Rakefile
├── certificates
│   └── README.md
├── chefignore
├── config
│   └── rake.rb
├── cookbooks
│   └── README.md
├── data_bags
│   └── README.md
├── environments
│   └── README.md
└── roles
└── README.md


6 directories, 10 files
ubuntu@ubuntu:~$

chef-repoはgit管理下に置いておきましょう。手順は特に記載しません。Chef Starter Kitの活用を参照してください。

ntp Cookbookを利用

ntp Cookbookを例として用います。


ubuntu@ubuntu:~/chef-repo$ knife cookbook site install ntp -o cookbooks
WARNING: No knife configuration file found
Installing ntp to /home/ubuntu/chef-repo/cookbooks
Checking out the master branch.
Creating pristine copy branch chef-vendor-ntp
Downloading ntp from the cookbooks site at version 1.6.5 to /home/ubuntu/chef-repo/cookbooks/ntp.tar.gz
Cookbook saved: /home/ubuntu/chef-repo/cookbooks/ntp.tar.gz
Removing pre-existing version.
Uncompressing ntp version 1.6.5.
removing downloaded tarball
1 files updated, committing changes
Creating tag cookbook-site-imported-ntp-1.6.5
Checking out the master branch.
Updating af5ff5c..00c932e
Fast-forward
:
:
:
Cookbook ntp version 1.6.5 successfully installed
ubuntu@ubuntu:~/chef-repo$

RoleをJSON形式で作成しましょう。
"json_class": "Chef::Role"」を忘れないでください。これを忘れると収束時に「ERROR: undefined method `run_list_for'」のようなエラーが出ます。


ubuntu@ubuntu:~/chef-repo$ vi roles/ntp.json
{
"json_class": "Chef::Role",
"name": "ntp",
"description": "ntp basic",
"default_attributes": {
"ntp": {
"servers": [
"0.ubuntu.pool.ntp.org",
"1.ubuntu.pool.ntp.org",
"2.ubuntu.pool.ntp.org",
"3.ubuntu.pool.ntp.org"
]
}
},
"run_list": [
"recipe[ntp]"
]
}
ubuntu@ubuntu:~/chef-repo$

Chef-Soloでの適用

Chef-Solo設定ファイルにCookbookディレクトリとRoleディレクトリのパスを指定します。


ubuntu@ubuntu:~/chef-repo$ vi solo.rb
current_dir = File.absolute_path( File.dirname(__FILE__) )
cookbook_path [ "#{current_dir}/cookbooks" ]
role_path "#{current_dir}/roles"
ubuntu@ubuntu:~/chef-repo$

Chef-Soloに与えるJSONデータファイルを作成します。


ubuntu@ubuntu:~/chef-repo$ vi ubuntu.json
{ "run_list": "role[ntp]" }
ubuntu@ubuntu:~/chef-repo$

では、Chef-Soloでこれを適用してみましょう。


ubuntu@ubuntu:~/chef-repo$ sudo chef-solo -c solo.rb -j ubuntu.json
:
:
:
Starting Chef Client, version 11.16.0
Compiling Cookbooks...
Converging 9 resources
Recipe: ntp::default
* package[ntp] action install
- install version 1:4.2.6.p3+dfsg-1ubuntu3.1 of package ntp
* package[ntpdate] action install (up to date)
* directory[/var/lib/ntp] action create (up to date)
* directory[/var/log/ntpstats/] action create (up to date)
* cookbook_file[/etc/ntp.leapseconds] action create
- create new file /etc/ntp.leapseconds
- update content in file /etc/ntp.leapseconds from none to 274665
--- /etc/ntp.leapseconds 2014-11-06 11:46:40.217680840 +0900
+++ /tmp/.ntp.leapseconds20141106-3646-mlugex 2014-11-06 11:46:40.229680841 +0900
:
:
:
- change mode from '' to '0644'
- change owner from '' to 'root'
- change group from '' to 'root'
Recipe: ntp::apparmor
* service[apparmor] action nothing (skipped due to action :nothing)
* cookbook_file[/etc/apparmor.d/usr.sbin.ntpd] action create
- update content in file /etc/apparmor.d/usr.sbin.ntpd from a88a6b to fdf13c
--- /etc/apparmor.d/usr.sbin.ntpd 2012-06-06 05:12:18.000000000 +0900
+++ /tmp/.usr.sbin.ntpd20141106-3646-r8gxtn 2014-11-06 11:46:40.285680841 +0900
:
:
:
* template[/etc/ntp.conf] action create
- update content in file /etc/ntp.conf from 4eb9a0 to c2c225
--- /etc/ntp.conf 2012-06-06 05:12:18.000000000 +0900
+++ /tmp/chef-rendered-template20141106-3646-d0oz7l 2014-11-06 11:46:40.293680841 +0900
:
:
:
* service[ntp] action enable (up to date)
* service[ntp] action start (up to date)
Recipe: ntp::apparmor
* service[apparmor] action restart
- restart service service[apparmor]
Recipe: ntp::default
* service[ntp] action restart
- restart service service[ntp]


Running handlers:
Running handlers complete
Chef Client finished, 6/11 resources updated in 9.094053298 seconds
ubuntu@ubuntu:~/chef-repo$

適用できたことを確認します。


ubuntu@ubuntu:~/chef-repo$ ps auxwwwf | grep '[ n]tpd'
ntp 4226 0.0 0.0 37780 2180 ? Ss 11:46 0:00 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 106:113
ubuntu@ubuntu:~/chef-repo$


ubuntu@ubuntu:~/chef-repo$ grep pool.ntp.org /etc/ntp.conf
server 0.ubuntu.pool.ntp.org iburst
restrict 0.ubuntu.pool.ntp.org nomodify notrap noquery
server 1.ubuntu.pool.ntp.org iburst
restrict 1.ubuntu.pool.ntp.org nomodify notrap noquery
server 2.ubuntu.pool.ntp.org iburst
restrict 2.ubuntu.pool.ntp.org nomodify notrap noquery
server 3.ubuntu.pool.ntp.org iburst
restrict 3.ubuntu.pool.ntp.org nomodify notrap noquery
ubuntu@ubuntu:~/chef-repo$

再度実行してみます。


ubuntu@ubuntu:~/chef-repo$ sudo chef-solo -c solo.rb -j ubuntu.json
:
:
:
Starting Chef Client, version 11.16.0
Compiling Cookbooks...
Converging 9 resources
Recipe: ntp::default
* package[ntp] action install (up to date)
* package[ntpdate] action install (up to date)
* directory[/var/lib/ntp] action create (up to date)
* directory[/var/log/ntpstats/] action create (up to date)
* cookbook_file[/etc/ntp.leapseconds] action create (up to date)
Recipe: ntp::apparmor
* service[apparmor] action nothing (skipped due to action :nothing)
* cookbook_file[/etc/apparmor.d/usr.sbin.ntpd] action create (up to date)
Recipe: ntp::default
* template[/etc/ntp.conf] action create (up to date)
* service[ntp] action enable (up to date)
* service[ntp] action start (up to date)


Running handlers:
Running handlers complete
Chef Client finished, 0/9 resources updated in 1.165747795 seconds
ubuntu@ubuntu:~/chef-repo$

無事に収束しました。

Chef-Clientローカルモードで適用する

ではChef Clientローカルモードで適用してみましょう。まずインストールしたntpパッケージをアンインストールしておきます。
なお、ntp Cookbookにはntp::undoというパッケージを削除するRecipeが含まれていますが、ここでは利用しません。


ubuntu@ubuntu:~/chef-repo$ sudo apt-get purge ntp -y
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
libopts25 libcap2
これらを削除するには 'apt-get autoremove' を利用してください。
以下のパッケージは「削除」されます:
ntp*
アップグレード: 0 個、新規インストール: 0 個、削除: 1 個、保留: 0 個。
この操作後に 1,511 kB のディスク容量が解放されます。
(データベースを読み込んでいます ... 現在 88343 個のファイルとディレクトリがインストールされています。)
ntp を削除しています ...
* Stopping NTP server ntpd
...done.
ntp の設定ファイルを削除しています ...
man-db のトリガを処理しています ...
ureadahead のトリガを処理しています ...
ubuntu@ubuntu:~/chef-repo$

chef-clientコマンドを「-z (--local-mode)」オプションを付与し、chef-soloと同様に「-j ubuntu.json」を付与して実行します。chef-soloディレクトリで実行することで、各種パスを指定するための設定ファイルが不要であることに注目です。


ubuntu@ubuntu:~/chef-repo$ sudo chef-client -z -j ubuntu.json
[2014-11-06T11:48:48+09:00] WARN: No config file found or specified on command line, using command line options.
Starting Chef Client, version 11.16.0
resolving cookbooks for run list: ["ntp"]
Synchronizing Cookbooks:
- ntp
Compiling Cookbooks...
Converging 9 resources
Recipe: ntp::default
* package[ntp] action install
- install version 1:4.2.6.p3+dfsg-1ubuntu3.1 of package ntp
* package[ntpdate] action install (up to date)
* directory[/var/lib/ntp] action create (up to date)
* directory[/var/log/ntpstats/] action create (up to date)
* cookbook_file[/etc/ntp.leapseconds] action create (up to date)
Recipe: ntp::apparmor
* service[apparmor] action nothing (skipped due to action :nothing)
* cookbook_file[/etc/apparmor.d/usr.sbin.ntpd] action create
- update content in file /etc/apparmor.d/usr.sbin.ntpd from a88a6b to fdf13c
--- /etc/apparmor.d/usr.sbin.ntpd 2012-06-06 05:12:18.000000000 +0900
+++ /tmp/.usr.sbin.ntpd20141106-4953-1x81mrr 2014-11-06 11:48:53.577680841 +0900
:
:
:
Recipe: ntp::default
* template[/etc/ntp.conf] action create
- update content in file /etc/ntp.conf from 4eb9a0 to c2c225
--- /etc/ntp.conf 2012-06-06 05:12:18.000000000 +0900
+++ /tmp/chef-rendered-template20141106-4953-1dzer39 2014-11-06 11:48:53.597680841 +0900
:
:
:
* service[ntp] action enable (up to date)
* service[ntp] action start (up to date)
Recipe: ntp::apparmor
* service[apparmor] action restart
- restart service service[apparmor]
Recipe: ntp::default
* service[ntp] action restart
- restart service service[ntp]


Running handlers:
Running handlers complete
Chef Client finished, 5/11 resources updated in 9.169450451 seconds
ubuntu@ubuntu:~/chef-repo$


ubuntu@ubuntu:~/chef-repo$ sudo chef-client -z -j ubuntu.json
[2014-11-06T11:49:44+09:00] WARN: No config file found or specified on command line, using command line options.
Starting Chef Client, version 11.16.0
resolving cookbooks for run list: ["ntp"]
Synchronizing Cookbooks:
- ntp
Compiling Cookbooks...
Converging 9 resources
Recipe: ntp::default
* package[ntp] action install (up to date)
* package[ntpdate] action install (up to date)
* directory[/var/lib/ntp] action create (up to date)
* directory[/var/log/ntpstats/] action create (up to date)
* cookbook_file[/etc/ntp.leapseconds] action create (up to date)
Recipe: ntp::apparmor
* service[apparmor] action nothing (skipped due to action :nothing)
* cookbook_file[/etc/apparmor.d/usr.sbin.ntpd] action create (up to date)
Recipe: ntp::default
* template[/etc/ntp.conf] action create (up to date)
* service[ntp] action enable (up to date)
* service[ntp] action start (up to date)


Running handlers:
Running handlers complete
Chef Client finished, 0/9 resources updated in 1.263372895 seconds
ubuntu@ubuntu:~/chef-repo$

このようにchef-soloコマンドの場合とまったく同じように利用できました。

ローカルモードによるchef-repoの閲覧・操作

ここで、Chef-Clientのローカルーモードがchef-soloと異なる重要な点を見てみましょう。先のローカルモードの実行で、chef-repoディレクトリ内に「nodes」というディレクトリができました。


ubuntu@ubuntu:~/chef-repo$ ls -laF nodes/ubuntu.json
-rw-r--r-- 1 root root 32285 11月 6 11:49 nodes/ubuntu.json
ubuntu@ubuntu:~/chef-repo$

ここに格納されているファイルが「Node Object」です。現在のNodeの状態やAttributeなどを含んでいます。


ubuntu@ubuntu:~/chef-repo$ view nodes/ubuntu.json
{
"name": "ubuntu",
"normal": {
"tags": [


]
},
"default": {
"ntp": {
"servers": [
"0.ubuntu.pool.ntp.org",
"1.ubuntu.pool.ntp.org",
"2.ubuntu.pool.ntp.org",
"3.ubuntu.pool.ntp.org"
],
:
:
:
"automatic": {
"network": {
"interfaces": {
"lo": {
"mtu": "16436",
"flags": [
"LOOPBACK",
"UP",
"LOWER_UP"
],
:
:
:
"recipes": [
"ntp",
"ntp::default",
"ntp::apparmor"
],
"roles": [
"ntp"
]
},
"run_list": [
"role[ntp]"
]
}
ubuntu@ubuntu:~/chef-repo$

オブジェクトの閲覧

knifeコマンドの各サブコマンドに「-z (--local-mode)」オプションを付与して実行することで、Node Objectのみならず、このchef-repoディレクトリ内の情報を操作できます。
なお、以降「WARNING: No knife configuration file found」という警告が頻出しますが、.chef/knife.rbが存在していないためです。省略可能なので、今回は無視してください。


ubuntu@ubuntu:~/chef-repo$ knife node list -z
WARNING: No knife configuration file found
ubuntu
ubuntu@ubuntu:~/chef-repo$


ubuntu@ubuntu:~/chef-repo$ knife node show ubuntu -z
WARNING: No knife configuration file found
Node Name: ubuntu
Environment: _default
FQDN: ubuntu
IP: 192.168.122.209
Run List: role[ntp]
Roles: ntp
Recipes: ntp, ntp::default, ntp::apparmor
Platform: ubuntu 12.04
Tags:
ubuntu@ubuntu:~/chef-repo$


ubuntu@ubuntu:~/chef-repo$ knife cookbook list -z
WARNING: No knife configuration file found
ntp 1.6.5
ubuntu@ubuntu:~/chef-repo$


ubuntu@ubuntu:~/chef-repo$ knife role show ntp -z
WARNING: No knife configuration file found
chef_type: role
default_attributes:
ntp:
servers:
0.ubuntu.pool.ntp.org
1.ubuntu.pool.ntp.org
2.ubuntu.pool.ntp.org
3.ubuntu.pool.ntp.org
description: ntp basic
env_run_lists:
json_class: Chef::Role
name: ntp
override_attributes:
run_list: recipe[ntp]
ubuntu@ubuntu:~/chef-repo$

オブジェクトの操作

Roleをknifeコマンドから修正してみましょう。


ubuntu@ubuntu:~/chef-repo$ knife role edit ntp -z
WARNING: No knife configuration file found
Saved role[ntp]
ubuntu@ubuntu:~/chef-repo$


ubuntu@ubuntu:~/chef-repo$ knife role show ntp -z
WARNING: No knife configuration file found
chef_type: role
default_attributes:
ntp:
servers:
0.jp.pool.ntp.org
1.jp.pool.ntp.org
2.ubuntu.pool.ntp.org
3.ubuntu.pool.ntp.org
description: ntp basic
env_run_lists:
json_class: Chef::Role
name: ntp
override_attributes:
run_list: recipe[ntp]
ubuntu@ubuntu:~/chef-repo$

ファイルも変わっています。


ubuntu@ubuntu:~/chef-repo$ git diff
diff --git a/roles/ntp.json b/roles/ntp.json
index 045d224..5a4d567 100644
--- a/roles/ntp.json
+++ b/roles/ntp.json
@@ -1,12 +1,11 @@
{
- "json_class": "Chef::Role",
"name": "ntp",
"description": "ntp basic",
"default_attributes": {
"ntp": {
"servers": [
- "0.ubuntu.pool.ntp.org",
- "1.ubuntu.pool.ntp.org",
+ "0.jp.pool.ntp.org",
+ "1.jp.pool.ntp.org",
"2.ubuntu.pool.ntp.org",
"3.ubuntu.pool.ntp.org"
]
ubuntu@ubuntu:~/chef-repo$

次はファイルを手で変更してみましょう。


ubuntu@ubuntu:~/chef-repo$ vi roles/ntp.json
ubuntu@ubuntu:~/chef-repo$ git diff
diff --git a/roles/ntp.json b/roles/ntp.json
index 5a4d567..0a4e92e 100644
--- a/roles/ntp.json
+++ b/roles/ntp.json
@@ -6,8 +6,8 @@
"servers": [
"0.jp.pool.ntp.org",
"1.jp.pool.ntp.org",
- "2.ubuntu.pool.ntp.org",
- "3.ubuntu.pool.ntp.org"
+ "2.jp.pool.ntp.org",
+ "3.jp.pool.ntp.org"
]
}
},
ubuntu@ubuntu:~/chef-repo$

もちろん、knifeコマンドからも変わっていることが確認できます。


ubuntu@ubuntu:~/chef-repo$ knife role show ntp -z
WARNING: No knife configuration file found
chef_type: role
default_attributes:
ntp:
servers:
0.jp.pool.ntp.org
1.jp.pool.ntp.org
2.jp.pool.ntp.org
3.jp.pool.ntp.org
description: ntp basic
env_run_lists:
json_class: Chef::Role
name: ntp
override_attributes:
run_list: recipe[ntp]
ubuntu@ubuntu:~/chef-repo$

収束させてみましょう。


ubuntu@ubuntu:~/chef-repo$ sudo chef-client -z
[2014-11-06T12:49:15+09:00] WARN: No config file found or specified on command line, using command line options.
Starting Chef Client, version 11.16.0
resolving cookbooks for run list: ["ntp"]
Synchronizing Cookbooks:
- ntp
Compiling Cookbooks...
Converging 9 resources
Recipe: ntp::default
* package[ntp] action install (up to date)
* package[ntpdate] action install (up to date)
* directory[/var/lib/ntp] action create (up to date)
* directory[/var/log/ntpstats/] action create (up to date)
* cookbook_file[/etc/ntp.leapseconds] action create (up to date)
Recipe: ntp::apparmor
* service[apparmor] action nothing (skipped due to action :nothing)
* cookbook_file[/etc/apparmor.d/usr.sbin.ntpd] action create (up to date)
Recipe: ntp::default
* template[/etc/ntp.conf] action create
- update content in file /etc/ntp.conf from c4c6f5 to 7f40b8
--- /etc/ntp.conf 2014-11-06 11:49:38.433680841 +0900
+++ /tmp/chef-rendered-template20141106-6541-1m6aoxp 2014-11-06 12:49:16.355507182 +0900
:
:
:
* service[ntp] action enable (up to date)
* service[ntp] action start (up to date)
* service[ntp] action restart
- restart service service[ntp]


Running handlers:
Running handlers complete
Chef Client finished, 2/10 resources updated in 3.312547399 seconds
ubuntu@ubuntu:~/chef-repo$


ubuntu@ubuntu:~/chef-repo$ grep pool.ntp.org /etc/ntp.conf
server 0.jp.pool.ntp.org iburst
restrict 0.jp.pool.ntp.org nomodify notrap noquery
server 1.jp.pool.ntp.org iburst
restrict 1.jp.pool.ntp.org nomodify notrap noquery
server 2.jp.pool.ntp.org iburst
restrict 2.jp.pool.ntp.org nomodify notrap noquery
server 3.jp.pool.ntp.org iburst
restrict 3.jp.pool.ntp.org nomodify notrap noquery
ubuntu@ubuntu:~/chef-repo$

問題なく収束できました。Node Objectも合わせて変わっています。


ubuntu@ubuntu:~/chef-repo$ head -15 nodes/ubuntu.json
{
"name": "ubuntu",
"normal": {
"tags": [


]
},
"default": {
"ntp": {
"servers": [
"0.jp.pool.ntp.org",
"1.jp.pool.ntp.org",
"2.jp.pool.ntp.org",
"3.jp.pool.ntp.org"
],
ubuntu@ubuntu:~/chef-repo$

オブジェクトの検索

Chef-Soloではできなかったknife searchもこのように使えます。


ubuntu@ubuntu:~/chef-repo$ knife search node 'name:ubuntu' -z
WARNING: No knife configuration file found
1 items found

Node Name: ubuntu
Environment: _default
FQDN: ubuntu
IP: 192.168.122.209
Run List: role[ntp]
Roles: ntp
Recipes: ntp, ntp::default, ntp::apparmor
Platform: ubuntu 12.04
Tags:


ubuntu@ubuntu:~/chef-repo$


ubuntu@ubuntu:~/chef-repo$ knife search role 'name:ntp' -z
WARNING: No knife configuration file found
1 items found

chef_type: role
default_attributes:
ntp:
servers:
0.jp.pool.ntp.org
1.jp.pool.ntp.org
2.jp.pool.ntp.org
3.jp.pool.ntp.org
description: ntp basic
env_run_lists:
json_class: Chef::Role
name: ntp
override_attributes:
run_list: recipe[ntp]


ubuntu@ubuntu:~/chef-repo$

Chef-Zeroを少し意識してみたい

さて、ここまででChef-Zeroがその顔を見せていた箇所があったでしょうか? まったくなかったでしょう。このようにChef-ClientローカルモードはChef-Zeroを意識しなくても使えます。

でも、Chef-Zeroを意識してみたいという方のためにknife serveというコマンドがあります。フォアグラウンドでChef-Zeroを起動し、Chef-Serverに問い合わせるのと同じようにchef-repoを扱うことができます。

knife serveにchef-repoディレクトリを指定するオプション「--chef-repo-path .」を付与して実行します。


ubuntu@ubuntu:~/chef-repo$ knife serve --chef-repo-path .
WARNING: No knife configuration file found
Serving files from:
repository at /home/ubuntu/chef-repo
One version per cookbook

>> Starting Chef Zero (v2.2.1)...
>> WEBrick (v1.3.1) on Rack (v1.5) is listening at http://localhost:8889
>> Press CTRL+C to stop


このように localhost:8889 でChef-Zeroが起動しました。これに対してknifeコマンドからアクセスしてみましょう。通常ではknifeコマンドが認証用の情報を要求するので、ダミーのユーザ名と秘密鍵をそれぞれ「-u dummy」「-k /opt/chefdk/embedded/apps/test-kitchen/support/dummy-validation.pem」として与え、「-s http://localhost:8889」で接続先Chef-ServerにChef-Zeroを指定します。


ubuntu@ubuntu:~/chef-repo$ knife node show ubuntu -u dummy -k /opt/chefdk/embedded/apps/test-kitchen/support/dummy-validation.pem -s http://localhost:8889
WARNING: No knife configuration file found
Node Name: ubuntu
Environment: _default
FQDN: ubuntu
IP: 192.168.122.209
Run List: role[ntp]
Roles: ntp
Recipes: ntp, ntp::default, ntp::apparmor
Platform: ubuntu 12.04
Tags:
ubuntu@ubuntu:~/chef-repo$

Node情報が取得できました。

Roleを編集してみます。


ubuntu@ubuntu:~/chef-repo$ knife role edit ntp -u dummy -k /opt/chefdk/embedded/apps/test-kitchen/support/dummy-validation.pem -s http://localhost:8889
WARNING: No knife configuration file found
Saved role[ntp]
ubuntu@ubuntu:~/chef-repo$

knife serveならば、永続的なデータ保存を行わないChef-Zeroでも、chef-repoにきちんと変更が反映されています。


ubuntu@ubuntu:~/chef-repo$ git diff
diff --git a/roles/ntp.json b/roles/ntp.json
index 0a4e92e..66cb5ea 100644
--- a/roles/ntp.json
+++ b/roles/ntp.json
@@ -4,10 +4,10 @@
"default_attributes": {
"ntp": {
"servers": [
- "0.jp.pool.ntp.org",
- "1.jp.pool.ntp.org",
- "2.jp.pool.ntp.org",
- "3.jp.pool.ntp.org"
+ "0.asia.pool.ntp.org",
+ "1.asia.pool.ntp.org",
+ "2.asia.pool.ntp.org",
+ "3.asia.pool.ntp.org"
]
}
},
ubuntu@ubuntu:~/chef-repo$

実はChef-Clientのローカルモードでは、このように内部的にChef-Zeroを起動しています。ただ、普通はChef-Zeroを意識する必要がないというのはこれまで紹介した通りです。

まとめ

Chef-SoloとChef-Clientローカルモードの比較と移行、そして誤解されがちなChef-Zeroについて簡単に紹介しました。特に難しく考えなくてよいことが伝わったでしょうか。
次回はローカルモードを用いてリモートサーバを管理するためのKnife-Zeroについて紹介します。


Author

Chef・Docker・Mirantis製品などの技術要素に加えて、会議の進め方・文章の書き方などの業務改善にも取り組んでいます。「Chef活用ガイド」共著のほか、Debian Official Developerもやっています。

Daisuke Higuchiの記事一覧

新規CTA