長らく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を一読すると理解が早いと思います。
- Chefのローカルモードだけでリモートサーバを運用してみようと、Knife-Zeroを作った。Nodeの構成情報もとれるよ。
http://qiita.com/sawanoboly/items/218a7b03ddec6be45e34
先ほど作ったレシピを使って、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からの移行は問題なさそう。