サーバー構築初心者がプロビジョニングツール「chef」に挑戦してみました(前編) ~ chef13系での落とし穴 ~

はじめまして、WEBサービス開発グループでOJT中で2017年度新入社員の添野です。

みなさんは「プロビジョニング」という言葉を聞いたことがありますか?文献 [1] によればプロビジョニングとは「利用者から要求があった場合や障害時などに、必要な分だけのICTリソースを動的に割り当てる技術」だそうです。

今回はプロビジョニングツールとしてchefを取り上げます。またchefに同梱されているknifeツールのプラグインknife-soloも取り上げます。あわせて動作の確認も行います。なぜchefを紹介しようと思ったのか、それはOJTの業務の中でサーバー構築することがあり、また社内でchefが使用されていたので、今回のOJTでもchefを使用したからです。

まずchefについて簡単に説明をします。chefとは2009年1月に配信が開始されたインフラ構築を自動化するツールで、現在はバージョン13系まで出ています。複数台のマシンに同じ設定を施すときには便利なツールです。

またchefにはchefリポジトリを操作するためのknifeと呼ばれるツールがあります。そしてそのツールをより便利にするknife-soloプラグイン(2017年5月末現在ではバージョン0.6.0)というものがあります。詳細は文献 [2] に譲りますが、イメージは下図の通りです。

chef_solo_knife_solo

Recipe群とSettingsからノードを作成し、chef-clientがインストールされているマシンで、Recipeに記述した通りの手順が展開されていきます。なお図には無いですがknife-soloではリモートサーバーに対してもプロビジョニングを行えます。

chefではすなわちインフラをどのように構築するかという定義をRuby言語のソースコードとして記述していきます。それが先ほどのRecipeにあたります。この処理概念のことを「Infrastructure as Code」と呼びます。なお初心者でも読みやすい本として「Infrastructure as Code(オライリー社出版)」をおすすめしますので、興味を持った方は読んでみてください。

それではchefの世界にどんどん入っていきましょう。まずオムニバスインストーラ [3] を用いてChef Development Kit(以下ChefDK)とchefを導入します。

なぜオムニバスインストーラが二つ必要なのか。その理由はchefの最新バージョンにおいてレシピの作り方が大きく変わったからです。昔(chefの11系など)は次のような書き方をしていましたが、

chefの12系の最新バージョンや13系では次のような書き方をする必要があります。chefコマンドに関してはChefDKをインストールしないといけません。なおchef-soloのみを使う場合には下の行のコマンドだけで十分です。

次にknifeコマンドを便利にするknife-soloプラグインのインストールについて説明します。knife-soloのインストールはchefに同梱されているgemコマンドで行います。

おやおや?、knife-soloプラグインだけをインストールするつもりが余計なgemファイルが二つインストールされましたね。

この状態でknife-soloを実行してみると・・・

コンフリクトが起きていますね。

ここで実際にインストール済みgemリストを確認しておきます。

net-sshとnet-ssh-gatewayにおいてバージョン違いのものが混在していますね。どちらかのバージョンをアンインストールする必要があります。

knife-soloプラグインを正常に動作させるため試行錯誤をしました。結果としてchefに元から入っているnet-ssh 4.1.0、net-ssh-gateway 2.0.0をアンインストールするとknife-soloが正常に動作することが判明しています。なおもう一方をアンインストールした場合にはコンフリクトが解消されないことが判明しています。

またGemfileで記述されているchef-soloとknifeについても以下のようなバージョンチェックを緩める細工をする必要があります。

ようやくこれでchefとknife-soloのインストールが完了しました。なおknife-soloのインストールに関してはオチがありますが、それは詳しいことは後編の記事に書きます。急いでいる方は後編をお読みください。

さて、ここからは動作確認をします。今回は簡単のためにHello Worldをログとして出力するレシピの作成、そしてそのレシピを実行してみます。レシピの作成場所はユーザのホームディレクトリ配下としておきます。

まず、以下のコマンドでchef-repoというテンプレートディレクトリを作成します。

「WARNING: No knife configuration file found」はknifeに対する初期設定をしていないために表示された警告です。「knife configure」を用いて初期設定を行うことができますが、今回の場合は設定をしなくても大丈夫ですので割愛いたします。knife configureについて詳しいことは文献 [4] に譲ります。

次に、レシピの本体である~/chef-repo/site-cookbooks/hello/recipes/default.rbに以下の記述を行います。

次に、どのレシピを実行するかを司る~/chef-repo/nodes/hello.jsonに以下の記述を行います。

最後に、クックブックの場所を司る~/chef-repo/solo.rbに以下の記述を行います。

総括すると・・・

directory
になります。

最後にユーザーのホームディレクトリ(=今回の場合はchef-repoディレクトリの直上)内で以下のコマンドを実行します

結果を見ると「log[Hello World] action write」の行があるので正常に動作していることが分かります。これであなたもchefマスターに一歩近づきましたね。

これにて前編は終了です。ご付き合いいただきありがとうございました。ニフティでのものづくりを垣間見られる「ニフティものづくりブログ」へのご愛顧を今後ともよろしくお願いします。

後編はknife-soloプラグインのインストールについてのオチを記事にします。お楽しみに。