Knife-ZeroをマスターしてChef Soloの引退に備えよう!

今年の6月にChef Soloは役割を終え、今後引退への道をたどると言うアナウンスがChefの公式ブログでありました。Chef Soloがなくなるということは、必ずChef Serverが必要になると言うことでしょうか?答えはなんとYesです。

しかし安心してください。そのためにChef Zeroが用意されています。一言で言うと、Chef Zeroはローカルで動かせるChef Serverです。

そしてChef Clientをローカルモードで動かすことでローカルのChef Zeroに接続するため、別のChef Serverは必要ありません。要するにChef Soloと同じような感覚でChefを使い続けることができます。

更にKnife-Zeroを使うとChef Solo同様にセットアップ先のマシンにChef Clientを簡単に入れることができます。そこで今回はこのKnife-Zeroを使って脱Chef Soloの一歩を踏み出してみます。

なお以下の操作はすべてMacで行っています。Windows環境の方は適宜内容を置き換えるか、ローカルにLinuxの仮想マシンを立てるなどして試してみてください。

Chefでセットアップするサーバの準備

今回ははさくらのクラウドでサーバを2台作りました。ホスト名は以下とします。

  • knife-zero–01
  • knife-zero–02

今回使用したディスクのアーカイブは20GB Debian GNU/Linux 7.4.0 64bit(基本セット)ですが、ほかのOSでもおそらく問題はないでしょう。作成したサーバに公開鍵認証で接続できるように、作成時に公開鍵を登録しておきます。

ChefとKnife-Zeroの導入

Chefリポジトリの作成

ローカルの適当な場所に空っぽのChefリポジトリを作成します。以後の操作はすべてこのディレクトリ内で行います。

$ mkdir chef-repo
$ cd chef-repo

ChefとKnife-Zeroのインストール

以下の内容でGemfileを作成します。

source "https://rubygems.org"

gem 'chef'
gem 'knife-zero'
gem 'berkshelf'

ChefとKnife Zero、それから後で使うBerkshelfもついでに入れてしまいましょう。

$ bundle install

なおこの手順にはRubyが必要ですが、今回はRubyの導入に関しては省きます。

.chef/knife.rb

.chefディレクトリを作り、その中に以下の内容でknife.rbを作成します。

local_mode true

ローカルモードの使用は実行時のオプションで指定することもできますが、指定を忘れてしまって非ローカルモードとごっちゃになると想定通りの動きをしません。そこでハマってしまうのを防ぐためにもこのknife.rbの設定は必ずしておくべきです。

これでKnife-Zeroを実行する準備が整いました。

Chef Clientのインストール

セットアップ対象のサーバにChef Clientをインストールするためにはknife zero bootstrapを使います。

以下のコマンドでそれぞれのサーバーにChef Clientがインストールされます。

$ bundle exec knife zero bootstrap 133.242.xxx.xxx
$ bundle exec knife zero bootstrap 133.242.xxx.xxx

公開鍵認証に失敗する場合は必要に応じて-iオプションで秘密鍵を指定するなどしてください。

Chef Clientのインストールと同時にノードの情報が取得され保存されています。

この時点で以下のコマンドを打つと、

$ bundle exec knife node list

次のように表示されるでしょう。

knife-zero-01
knife-zero-02

またこれらのノードの情報はnodesディレクトリにもJSONファイルとして保存されているので、それらのファイルを直接確認することもできます。

レシピの適用

次に適当なクックブックのレシピを適用してみます。

クックブックの準備

今回はクックブックを管理するのにBerkshelfを使うと言うことで、以下の内容でBerksfileを作成します。

source "https://api.berkshelf.com"

cookbook 'zsh'

Berksfileの準備ができたらクックブックを取得します。

$ bundle exec berks vendor cookbooks

レシピの適用

このBerksfileはzshをインストールするだけですが、早速適用してみましょう。適用は knife zero bootstrap でもできますが、knife zero chef_clientを使う方がよいでしょう。

$ bundle exec knife node run_list add knife-zero-01 zsh
$ bundle exec knife node run_list add knife-zero-02 zsh
$ bundle exec knife zero chef_client 'name:knife-zero-01' --attribute ipaddress
$ bundle exec knife zero chef_client 'name:knife-zero-02' --attribute ipaddress

これでzshが使えるサーバを構築することができました。

ロールを使ったレシピの適用

さらにロールを使ってRubyを入れてみます。

クックブックの取得

Berksfileを以下のように修正します。

source "https://api.berkshelf.com"

cookbook 'zsh'
cookbook 'rbenv-install-rubies'

修正が済んだら再度クックブックを取得します。

$ bundle exec berks vendor cookbooks

ロールの作成

rolesディレクトリを作成し、その下にruby.jsonを置きます。

$ mkdir roles

ruby.json

{
  "name": "ruby",
  "default_attributes": {},
  "override_attributes": {},
  "json_class": "Chef::Role",
  "description": "",
  "chef_type": "role",
  "run_list": [
    "recipe[rbenv-install-rubies]"
  ],
  "default_attributes": {
    "rbenv_install_rubies": {
      "global_version": "2.1.5"
    }
  }
}

なお、このロールにはレシピが一つしか指定されていないのでありがたみが少ないですが、本格的な運用ではウェブサーバ、アプリケーションサーバ、DBサーバなどサーバの役割ごとにロールを作って、適用するレシピをまとめることで運用を楽にすることができます。

レシピの適用

ロールの準備ができたので、早速run_listにロールを追加してknife zero chef_clientを実行します。

$ bundle exec knife node run_list add knife-zero-01 "role[ruby]"
$ bundle exec knife node run_list add knife-zero-02 "role[ruby]"
$ bundle exec knife zero chef_client 'name:*' --attribute ipaddress

今度はchef_clientのnameの指定にワイルドカードを使ってみました。Chef Soloの時は少し工夫が必要だった複数サーバへの適用が簡単にできるので便利ですね。

このレシピはRubyをコンパイルするのでかなり時間がかかりますが、無事終わればRubyが使えるサーバができあがります。

終わりに

今回はKnife-Zeroの作者によるチュートリアルを元に内容を単純にアレンジして紹介しました。

元のチュートリアルはもう少し複雑で詳細なので、Knife-Zeroを本格的に使ってみようと思う場合はそちらも参照してください。

Chef Soloが終わるという話とChef Zeroという言葉が出てきたときには少し尻込みしてしまいましたが、Knife-Zeroのような便利なプラグインの助けもあり、個人的に今後はローカルモードとChef Zeroで行くことに何のためらいもありません。

既存のChef Soloで構築したインフラに関しては急いで乗り換える必要はないと思いますが、今後新しくChefでインフラを構築する機会があればChef SoloはやめてローカルモードとChef Zeroを使っていくことをおすすめします。

あわせて読みたい

>>サーバー設定ツール「Chef」応用編:knife-soloとData Bagを使う
>>サーバー設定ツール「Chef」の概要と基礎的な使い方