Chefを使ったリモートサーバーのプロビジョニング方法

1009-01

はじめに

前回の記事Chef Soloを使った仮想マシンのプロビジョニングの方法では、VagrantChef Soloを使用したVagrant Boxのプロビジョニングについて解説しました。しかし、前回の方法では他の仮想インフラ上で稼働しているリモートサーバーのプロビジョニングを行うことができません。

そこで今回は、VirtualBox上にプロビジョニングサーバーを構築し、リモートサーバーのプロビジョニングを行う方法を解説します。この方法によって、仮想マシンだけで無く、物理マシンもプロビジョニングできるようになります。

インストール環境

物理マシンおよび、仮想マシン環境は、下記のとおりです。

マシン物理マシンプロビジョニングサーバークライアントサーバー
OSWindows 7 UltimateUbuntu 13.10
ホスト名PAPAubuntu-serverubuntu-client
IPアドレス192.168.0.253192.168.0.20192.168.0.21
UNIX環境Cygwin 1.7.25n/a
仮想化ソフトウエアVirtualBox 4.2.18 r88780

1009-02 1009-03

プロビジョニングサーバにインストールするソフトウエアは、下記のとおりです。

ソフトウエアバージョン
rubyruby-1.9.3p194
gemgems-1.8.23
rakerake, version 10.0.4
makeGNU Make 3.81
gitgit version 1.8.3.2
ruby-devruby-dev 1.9.3
Chef Solochef-11.8.0
Knife Soloknife-solo-0.4.0
Berkshelfberkshelf-2.0.10

なお、Ubuntu OSのインストールは既に終了しているものとします。また、物理マシンから仮想マシンへのSSH接続のためにSSH認証鍵の設定を行っています。

また、VitrualBoxコンソール上では作業しにくいため、TeraTermで、サーバーにリモート接続します。

SSH認証鍵の準備

knife-soloを用いたプロビジョニングでは、VAGRANTと同様にSSHによるクライアントとの接続が行われます。このため、事前にサーバー上に管理ユーザーのSSH認証鍵を作成し、ユーザー認証キーとしてクライアントに設定する必要があります。 以下の手順で、管理ユーザーの認証鍵の生成と、ユーザー認証鍵の設定を行います。

①ユーザー認証鍵の生成

管理ユーザーアカウントで、サーバーにログインして以下のコマンドを実行します。

$ ssh-keygen -t rsa -N ""
実行すると、パスフレーズ無しのRSA認証鍵が生成されます。

1009-06

②ユーザー認証鍵の設定

下記のコマンドを実行して、ユーザー認証公開鍵を設定します。

サーバー上のユーザー認証公開鍵をクライアントに転送します。

$scp ~/.ssh/id_rsa.pub chef-client:/tmp

1009-07

クライアント上で、authorized_keysに転送された公開鍵を設定します。

$ mkdir -p ~/.ssh
$ cp /tmp/id_rsa.pub ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys

1009-09

③SSH接続確認

サーバー上で、以下のコマンドを実行して、接続できるか確認します。

$ ssh chef-client

パスフレーズ無しで、クライアントに接続できます。
1009-11

ソフトウエアのインストール

以下の手順で、プロビジョニングに必要な環境を構築します。

①Rubyパッケージのインストール

ruby関連のパッケージを、以下のコマンドを実行してインストールします。

$ sudo apt-get -y install ruby1.9.1
$ sudo apt-get -y install rake
$ sudo apt-get -y install make
$ sudo apt-get -y install ruby-dev
$ sudo apt-get -y install git

1009-12

インストールが終了したら、以下のコマンドを実行して、正しくインストールされているか確認します。

$ ruby -v && gem -v

1009-18

②Gemパッケージのインストール

gemパッケージを、以下のコマンドを実行してインストールします。

$ sudo gem install chef --no-ri --no-rdoc
$ sudo gem install knife-solo --no-ri --no-rdoc
$ sudo gem install berkshelf --no-ri --no-rdoc

1009-19

インストールが終了したら、以下のコマンドを実行して、正しくインストールされているか確認します。

$ chef-solo -v && knife -v && berks -v

1009-22

以上で、プロビジョニングに必要なソフトウエアのインストールが終了します。

Chef Solo環境の設定

プロビジョニングに必要なソフトウエアが準備できましたので、下記の手順でChef Solo環境の設定を行います。
この作業は、一般ユーザーで行って下さい。

①knifeの初期化

以下のコマンドを実行して、knifeを初期化します。

$ knife configure

初めて実行すると、knife構成ファイルの場所やChefサーバのURLを聞いて来ますが、全てデフォルトで指定します。
初期化が終了すると、$HOME/.chef/knife.rb が生成されます。

1009-23

②秘密鍵のコピー

前回の記事で使用したPEMファイルをそのまま使用します。
この秘密鍵は、OPSCODE Communityで公開されているCookbookをインストールする際に使用しますので、scpコマンドを使用して、秘密鍵をプロビジョニングサーバーにコピーします。scpが利用できない場合、秘密鍵を他の方法でサーバーにコピーして下さい。

$ scp puniochan.pem 192.168.0.20:/home/punio/.chef/punio.pem

1009-24

コピーが終了したら、秘密鍵ファイルのパーミッションを600に変更します。

$ chmod 600 ~/.chef/punio.pem

以上で、knifeの初期設定が終了します。

③Cookbookリポジトリの作成

リポジトリは、Cookbookを登録するフォルダです。
以下のコマンドを実行して、リポジトリを作成します。ここでは、chef-repoとしています。
実行すると、自作および、公開Cookbook用のフォルダなどが作成されます。

$ knife solo init chef-repo

1009-26

④Berkshelfの初期化

Berkshelfは、サードパーティの公開Cookbookを簡単にインストールできるツールです。
先程作成したリポジトリフォルダのchef-repoに移動し、以下のコマンドを実行して、Belkshelfを初期化します。

$ berks init

初期化が終了すると、chef-repoフォルダ配下にBerksfileなどが生成されます。
.gitignoreがコンフリクトしている旨のメッセージが表示されますので、”y”を入力して上書きします。

1009-27

⑤Cookbook検索パスの設定

<

p> knifeコマンドを用いて、サーバー上のCookbookの検索パスを設定します。
検索パスを設定しない場合、サーバー上のCoolbookの検索に失敗し、プロビジョニングができませんので注意して下さい。

$ vi ~/.chef/knife.rb

knife.rbに、以下の行を追加します。

cookbook_path [
  '/home/punio/chef-repo/site-cookbooks',
  '/home/punio/chef-repo/cookbooks'
]

1009-29

プロビジョニングの動作確認

ここまでの作業で、プロビジョニングに必要な環境の構築が完了しましたので、Cookbookをインストールしていない状態で、knife soloコマンドを実行して、プロビジョニングが正常に動作するか、下記の手順で確認します。
以降の作業は、全てリポジトリフォルダのchef-repoに移動して行います。

①クライアントのセットアップ

Chefがインストールされていないクライアントに対して必ず行って下さい。Chefがインストール済みのクライアントには、インストールする必要はありません。

$ knife solo prepare chef-client
1009-31
クライアントのホスト名または、IPアドレスを指定して、コマンドを実行すると、クライアントのユーザーパスワードを聞いて来ますので、パスワードを入力します。入力すると、クライアントのChef Soloの有無がチェックされ、インストールされていなければChef Soloをインストールします。
成功したら、以下のコマンドを実行して、クライアント上にChef Soloが正しくインストールされているか確認します。
$ chef-solo -v && knife -v
1009-32 また、終了するとサーバー上にクライアントのノードファイルが作成されますので、以下のコマンドを実行して確認します。
$ cat nodes/chef-client.json
1009-33 prepareコマンドを複数のクライアントに実行すると、nodeフォルダ配下にホスト名.jsonファイルが作成されますので、プロビジョニングサーバー上で、複数のクライアントのプロビジョニングを行うことができます。
$ prepare直後のnodeファイル中のrun_listには、実行するCookbookが指定されていない状態になります。

②プロビジョニングの実行

プロビジョニングの準備ができましたので、プロビジョニングの動作を確認します。
Cookbookが指定されていない状態で、プロビジョニングを行うためクライアントには何もインストールされません。

$ knife solo cook chef-client
1009-34 終了すると、実行したリソース数が表示されます。今回は、Cookbookが指定されていない状態で行ったため、リソース数はゼロになります。
以上で、プロビジョニングの動作確認は終了です。

自作Cookbookの作成とプロビジョニングの実行

プロビジョニングの動作確認が終了したら、実際に自作および、公開Cookbookをリポジトリにインストールして、クライアントのプロビジョニングを行います。ここでは、2回に分けてCookbookを作成し、その都度プロビジョニングを行います。

①自作Cookbookの作成

自作Cookbookを、以下のコマンドを実行して作成します。

$ knife cookbook create mycook1 -o site-cookbooks
実行すると、指定したCookbookのテンプレートが、site-cookbooks配下に作成されます。

1009-35

②レシピの作成

作成されたテンプレート中のrecipesフォルダ中のdefault.rbを下記のとおり編集します。


$ vi ~/chef-repo/site-cookbooks/mycook1/recipes/default.rb

package "yum" do
  action :install
end

上記は、yumコマンドのインストールを行うレシピです。

③run_listの編集

chef-client.jsonを下記のとおり編集します。


$ vi ~/chef-repo/nodes/chef-client.json

{
  "run_list":[
    "mycook1"
  ]
}

run_list中に、実行するレシピとして作成したCookbookを指定しています。

④プロビジョニングの実行

以下のコマンドを実行して、クライアントのプロビジョニングを実行します。

$ knife solo cook chef-client
実行すると、run_listで指定したレシピmycook1がクライアントに転送され、クライアント上で実行されます。

1009-41

同様に、sambaおよび、trafshowパッケージをインストールするレシピを作成するため、以下のコマンドを実行します。

$ knife cookbook create mycook2 -o site-cookbooks
1009-43

default.rbを下記のとおり編集します。
%w{samba4 trafshow}.each do |pkg|
  package pkg do
    action :install
  end
end

chef-client.jsonを下記のとおり編集します。
{
  "run_list":[
    "mycook1",
    "mycook2"
  ]
}
今回作成したCookbookを追加しています。

プロビジョニングを実行します。
$ knife solo cook chef-client
以上で、sambaおよび、trafshowパッケージがインストールされます。 1009-48

公開Cookbookのインストールとプロビジョニングの実行

下記の手順で、公開Cookbookをインストールします。ここでは、OPSCODE Communityでも評価が高いnagiosレシピをインストールします。

1009-49

①公開Cookbookの指定

以下のコマンドを実行して、BerksfileにインストールするCookbookを追加します。

echo "cookbook 'nagios'" >> Berksfile

②公開Cookbookのインストール

以下のコマンドを実行して、Cookbookをインストールします。

$ berks install -p cookbooks
実行すると、指定したCookbookが依存する全てのCookbookがインストールされます。

1009-50

③run_listの編集

chef-client.jsonを下記のとおり編集します。


$ vi ~/chef-repo/nodes/chef-client.json

{
  "run_list":[
    "mycook1",
    "mycook2",
    "nagios"
  ]
}

1009-52

④プロビジョニングの実行

以下のコマンドを実行して、クライアントのプロビジョニングを実行します。

$ knife solo cook chef-client
実行すると、run_listで指定したレシピnagiosがクライアントに転送され、クライアント上で実行されます。

1009-53

以上で、公開Cookbookのインストールが終了します。
ここで注意すべき点として、公開Cookbookの対応OSが挙げられます。公開Cookbookは、CPSCODE Communityに登録しているユーザーが作成したCookbookですから、Cookbookが対応するOSもさまざまです。したがって、プロビジョニングを行うクライアントのOSに対応していない公開Cookbookをインストールするとエラーとなり、クライアントにインストールすることはできません。

まとめ

ここまで、Chefを使ったリモートサーバのプロビジョニング方法について解説しました。knife-soloは、クライアントのプロビジョニングをマスターサーバー上で管理できるソフトウエアですが、プロビジョニングサーバーとして利用できるOSは、Linux系に限定した方が望ましいと言えます。また、公開Cookbookの対応OSにもばらつきはありますが、これらのCookbookを参考にして、自作Cookbookを作成することもできます。knife-soloを用いたクライアントのプロビジョニングには、少なからず制約もありますが、クライアントのプロビジョニング情報を一元管理し、さまざまなクライアントのプロビジョニングを行えるメリットは大きいため、今回の解説を参考にして仮想マシンだけで無く、物理サーバーのプロビジョニングにも適用してみては如何でしょうか。

Comments are closed.