chef-soloからchef-zeroへ

長らくchef-solo+knife-soloと連れ添ってきたのですが、
そろそろzeroの学習をしておこうと色々とchef-zero移行を解説なさっているサイトを見て回りました。
たくさん解説されていらっしゃるサイトがあるのですが、一応自分なりにもまとめてみます。

環境の準備

とりあえずrbenv,ruby,bundler、とインストールして、いつもの環境を作ります。
Gemfileはこんな感じの最小構成。こいつでbundle installします。

source "https://rubygems.org"

gem "chef"
gem "knife-zero"

テスト用のレシピを書く。

とりあえずテストとして、apacheをインストールするレシピと、それを適用するjsonファイルを用意します。

$ mkdir -p cookbooks/httpd/recipes
$ echo 'package "httpd" do
>   action :install
> end' > cookbooks/httpd/recipes/default.rb

$ echo '{ "run_list": "recipe[httpd]" }' > web.json

local_mode でプロビジョニングする

chef-soloであれば、cookbook_pathを記述したsolo.rbを用意してchef-soloを実行するところですね。

sudo bundle exec chef-solo -c solo.rb -j web.json

chef-zeroのlocal_modeを使うと、このような感じになるようです。solo.rbが不要になり、少しだけ楽になりましたね。

sudo bundle exec chef-client -z -j web.json

実行後、nodes/(hostname).json ができていました。
内部的にはchef-serverが動いているわけですから、このノード(localhost)の状態がchef-serverの管理下に置かれているということですね。
(Node Objectと言うそうです)

このあたりはchef-server的な仕組みで動いていると思うので、chef-serverを学習した方が理解がはさそうな気がします。

knife-zeroでリモートホストをプロビジョニングする

ローカルにあるレシピを使って、リモートホストをプロビジョニングする場合はknife zeroを使います。

仕組みやチュートリアル含め、開発者様のQiitaを一読すると理解が早いと思います。

先ほど作ったレシピを使って、knifeしてみましょう。

まずはリモートホストをknife zeroの管理に追加します。
mkdir で “許可がありません” とエラーになる場合は、sudoできる権限をつけてあげて –sudo を追加します。

bundle exec knife zero bootstrap remote.com --sudo

nodes/(hostname).jsonが作成されていると思います。
また、node showすると、ノードが管理されている事がわかります。

$ bundle exec knife node show remote.com --local-mode
Node Name:   remote.com
Environment: _default
FQDN:        remote.com
IP:          10.0.2.15
Run List:
Roles:
Recipes:
Platform:    centos 7.0.1406
Tags:

ローカルモードは今後常に有効にするので、設定ファイルを作成して省略できるようにしておきます。
環境によってはsudoを省略するオプションも記述しておいた方が捗りそうです。

mkdir .chef
echo 'local_mode true' > .chef/knife.rb
echo 'knife[:use_sudo] = true' >> .chef/knife.rb
bundle exec knife node show remote.com

それではレシピを適用してみましょう。
knife soloの場合は、nodes/(hostname).json のrun_listを記述してknife solo cookしていました。

bundle exec knife solo cook (hostname)

knife zeroの場合も、nodes/(hostname).json のrun_listを記述して、以下のコマンドを実行するだけです。

bundle exec knife zero converge '(query)' 

knife soloと違い、queryにマッチするホストをすべてプロビジョニングできるようです。
これはかなり便利そうです。

今回の用に単一ホストをプロビジョニングする場合は、このような感じで書きます。

$ bundle exec knife zero converge 'name:remote.com'

remote.com Starting Chef Client, version 12.5.1
remote.com resolving cookbooks for run list: ["httpd"]
remote.com Synchronizing Cookbooks:
remote.com   - httpd (0.0.0)
remote.com Compiling Cookbooks...
remote.com Converging 1 resources
remote.com Recipe: httpd::default
remote.com   * yum_package[httpd] action install
remote.com     - install version 2.4.6-31.el7.centos.1 of package httpd
remote.com
remote.com Running handlers:
remote.com Running handlers complete
remote.com Chef Client finished, 1/1 resources updated in 06 seconds

ちゃんとapacheがインストールされましたね。
knife node show してみるとレシピが追加されている事がわかります。

$ bundle exec knife node show remote.com

Node Name:   remote.com
Environment: _default
FQDN:        remote.com
IP:          10.0.2.15
Run List:    recipe[httpd]
Roles:
Recipes:     httpd, httpd::default
Platform:    centos 7.0.1406
Tags:

細かい点では変わったところもありますが、今までのレシピが全く使えなくなるという事はなく、
確かにchef-solo+knife-soloからの移行は問題なさそう。