IDCF テックブログ

IDCF テックブログ

クラウド・データセンターを提供するIDCフロンティアの公式テックブログ

セルフクラウドでChefを使い始めるまで―第2回 Chef Workstation・Node構築編

※この記事は公開されてから1年半以上経過しています。情報が古い可能性がありますのでご注意ください。

前回に引き続き、Chef環境構築手順について解説します。今回は、Chefの役割のうち、Workstationを構築する手順を説明いたします。

Workstationは、ChefのServerやNodeに対して指示をだす「knife」コマンドを実行する環境です。knifeコマンドは拡張が可能であり、様々なクラウドAPIの実行もサポートしています。今回は、セルフクラウドのAPI、すなわちCloudStackのAPIを実行するために、「knife-cloudstack-fog」という拡張を利用します。
このツールはClougeny社のChirag Jog、Datapipe社のJeff Moody、dfuentes77(アカウント名)、私の4名で開発を行っています。ソースコードなどの詳細は私のgithubアカウントのリポジトリにてご覧ください。

 

Chef Workstation(knife-cloudstack-fog 実行環境)の構築

1) Chef Workstation 操作用ユーザーの作成

Chef Workstation で操作を行うための一般ユーザーを作成し、パスワード設定と、SSH ログインのための公開鍵を登録します。以下の例では「hoge」という一般ユーザーを作成しています。

# useradd hoge
# passwd hoge (念のためパスワードを設定)
# mkdir /home/hoge/.ssh
# cp /root/.ssh/authorized_keys /home/hoge/.ssh/
# chown -R hoge:hoge /home/hoge/.ssh

2) Rubyコンパイル用パッケージ導入

次にRuby をコンパイルするために必要なパッケージをインストールします。また、git コマンドもインストールします。

# yum install gcc make openssl-devel readline-devel libxslt-devel git

3) Chef Workstation 環境の前提ソフトウェア導入

先ほど作成したユーザーでSSHログインし直します。suコマンドでユーザーを切り替える場合は「su -」で環境変数なども切り替えます。CentOS6 のOS 標準のRuby は1.8.7 ですが、 このあと使うknife-cloudstack-fog ではRuby 1.9.3 を利用する必要があります。そのため、Chef Workstation ユーザー専用のRuby 環境を、RVM を用いて構築します。
下記コマンドを実行すると、RVMのインストール、およびRuby 1.9.3-p194 がソースコードからコンパイルされ、インストールされます。

$ curl -L https://get.rvm.io | bash -s stable --ruby

※ruby 1.9.3 のコンパイルが行われるため、完了まで3分程度かかります。

インストール後、.bash_profile にrvm 用設定が追記されたことを確認します。

$ cat ~/.bash_profile
(以下の行があることを確認)
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"

確認後、.bash_profile をロードします。その後Ruby 1.9.3 が利用されていることを確認します。

$ source ~/.bash_profile
$ rvm list
rvm rubies
=* ruby-1.9.3-p194 [ x86_64 ]

$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]

4) knife-cloudstack-fogのインストールと初期設定

ruby-gem でknife-cloudstack-fog をインストールします。ただし、公開されているknife-cloudstack-fog では、SSH 鍵認証に関連した機能の不足があるため、機能を追加したバージョンをインストールします。

(knife-cloudstack-fog のソース入手とgem ファイルのビルド)
$ cd ~
$ wget https://github.com/anikundesu/knife-cloudstack-fog/zipball/master -O knife-cloudstack-fog.zip
$ unzip -q knife-cloudstack-fog.zip
$ cd anikundesu-knife-cloudstack-fog-(コミット番号)/
$ gem build knife-cloudstack-fog.gemspec
(gem でChef と knife-cloudstack-fog のインストール)
$ gem install chef --no-ri --no-rdoc
$ gem install fog --no-ri --no-rdoc
$ gem install --local knife-cloudstack-fog-0.2.16.gem

次に、knifeコマンドを実行するために、ホームディレクトリの下に、chef-repo ディレクトリを作成します。 さらにknife コマンド実行に必要なファイル群を展開します。 その後、knife 設定ファイルを置くchef-repo/.chef ディレクトリを作成します。

$ cd ~
$ git clone git://github.com/opscode/chef-repo.git
$ mkdir -p ~/chef-repo/.chef

そして、Chef Serverとの連携設定ののため、root ユーザーにてChef Server でDefault で作成されているvalidation ユーザー、およびwebuiユーザーの秘密鍵をコピーします。

$ su -
(以下、root での作業)

# cp /etc/chef/validation.pem /etc/chef/webui.pem /home/hoge/chef-repo/.chef/
(validation.pem とwebui.pem をコピー)

# chown -R hoge:hoge /home/hoge/chef-repo/.chef
# exit
$

その後、knife configure -iコマンドでChef Server、Workstationの初期設定を行います。

$ knife configure -i
WARNING: No knife configuration file found
Where should I put the config file? [/home/hoge/.chef/knife.rb] /home/hoge/chef-repo/.chef/knife.rb
Please enter the chef server URL: [http://i-???-?????-VM.cs???cloud.internal:4000] (デフォルトのままEnterキー)
Please enter a clientname for the new client: [hoge](chef server で作るユーザー名)
Please enter the existing admin clientname: [chef-webui] (デフォルトのままEnterキー)
Please enter the location of the existing admin client's private key: [/etc/chef/webui.pem] /home/hoge/chef-repo/.chef/webui.pem
Please enter the validation clientname: [chef-validator] (デフォルトのままEnterキー)
Please enter the location of the validation key: [/etc/chef/validation.pem] /home/hoge/chef-repo/.chef/validation.pem
Please enter the path to a chef repository (or leave blank): /home/hoge/chef-repo
Creating initial API user…
Created client[hoge]
Configuration file written to /home/hoge/chef-repo/.chef/knife.rb

さらに、knife-cloudstack-fog で利用するためのCloudStack API 情報、API エンドポイントURL 情報を、~/chef-repo/.chef/knife.rb に追記します。

$ vi ~/chef-repo/.chef/knife.rb
(以下の行を追加)
knife[:cloudstack_access_key_id] = "API キー"
knife[:cloudstack_secret_access_key] = "秘密鍵"
knife[:cloudstack_api_endpoint] = "https://api.noahcloud.jp/portal/client/api"

 

API キーおよび秘密鍵は、セルフクラウドのポータルにログイン後、右上の「マイプロファイル」をクリックすると表示されます。なお、最新のAPIエンドポイントの情報は、ポータル上のヘルプ(FAQ)をご覧ください。

APIキー表示画面

ここまで設定を完了したら以下のコマンドを実行し、knife-cloudstack-fog が正常に動作していることを確認します。

$ cd ~/chef-repo
$ knife cloudstack zone listID Name Network Type Security Groups?
 1 jp-east-t1v Advanced No

 

これで、Chef Workstationの構築が完了しました。


 

knife-cloudstack-fogによるChef Nodeの構築

ここからはknife-cloudstack-fogを使って仮想マシンの新規作成からChef Nodeとして構築するまでをほとんど自動化するための手順を解説いたします。

1) SSH キーペアの準備

knife-cloudstack-fog にて新規作成するVM にSSH ログインするためのキーペアを準備します。
(1)~(3)のいずれかの方法で、キーペアを用意します。

(1) 仮想マシン作成時に作成したSSH 鍵を利用する場合

ローカルに保存した秘密鍵を、仮想マシンへSCP ファイル転送やテキストコピーで作成します。

(2) CloudStack にて生成させる場合

$ knife cloudstack keypair create -k (Key の名前) -o (生成する秘密鍵ファイル名)
$ mv (秘密鍵) ~/chef-repo/.chef/
$ chmod 400 ~/chef-repo/.chef/(秘密鍵)

 

(3)ローカルで生成したSSH キーを登録する場合

$ ssh-keygen -b 2048
(パスフレーズは無しで作成すること)

$ knife cloudstack keypair create -k (Key の名前) -p "(公開鍵を1 行で) "

2) キーペアが登録されていることを確認

以下のコマンドで、keypairがCloudStack に登録されていることを確認します。

$ knife cloudstack keypair listName Fingerprint Private Key
(Key の名前) 37:7f:d8:8d:ee:13:06:42:12:48:47:ff:eb:e0:05:15

3) CentOS6用のbootstrap スクリプトの作成

仮想マシン作成後、Chef Nodeとして動作するための一連の設定を行うスクリプト(bootstrap)を準備します。拡張後のknife-cloudstack-fog の中に、CentOS 6 用のbootstrapスクリプトがあるので所定の場所にコピーします。

$ cd ~/chef-repo/.chef
$ mkdir bootstrap
$ cd bootstrap
$ cp ~/anikundesu-knife-cloudstack-fog-fbdcfea/erb/centos6.erb ./

4) Cookbook の入手とChef Server へのアップロード

下記サイトにChef のコミュニティにより作成されたCookbook のリストがあるので、好きなものを選んで導入することができます。

http://community.opscode.com/cookbooks

Cookbook のアップロードをするために、~/chef-repoディレクトリで以下を実行します。

$ knife cookbook site install (cookbook 名)
$ knife cookbook upload (cookbook 名)

 

ここでは、例としてgetting-started、apache2 という2 つのcookbook をアップロードします。

$ cd ~/chef-repo
$ git init
$ knife cookbook site install getting-started
$ knife cookbook site install apache2
$ knife cookbook upload -a
(site install にてローカルにダウンロードしたcookbook すべてをアップロード )

アップロード後、Chef Server のWeb UI の「Cookbooks」タブに、upload したcookbook が表示されることを確認します。

Cookbook List

5) Chef Node(仮想マシン)の作成

knife-cloudstack-fog はknife コマンドに”cloudstack”から始まるサブコマンドを渡すことで実行できます。
利用可能なサブコマンド一覧、 および各コマンドに渡す引数は以下のように調べることができます。

$ knife cloudstack
knife cloudstack
FATAL: Cannot find sub command for: 'cloudstack'
Available cloudstack subcommands: (for details, knife SUB-COMMAND --help)
** CLOUDSTACK COMMANDS **
knife cloudstack template list (options)
knife cloudstack volume list (options)
knife cloudstack securitygroup list (options)
knife cloudstack server list (options)
knife cloudstack keypair list (options)
knife cloudstack keypair create (options)
knife cloudstack server delete INSTANCE_ID [INSTANCE_ID] (options)
knife cloudstack server stop INSTANCE_ID [INSTANCE_ID] (options)
knife cloudstack server create (options)
knife cloudstack zone list (options)
knife cloudstack diskofferings list (options)
knife cloudstack networks list (options)
knife cloudstack serviceoffering list (options)

各サブコマンドのオプションの確認もできます。以下の例はknife cloudstack server createサブコマンドの場合です。

$ knife cloudstack server create --help
knife cloudstack server create (options)
--server-url URL Chef Server URL
--key KEY API Client Key
~略~

CloudStackで仮想マシンを作成するためには、ゾーンID、テンプレートIDおよびサービスオファリングIDを知る必要があります。そのために以下のコマンドを実行します。

$ knife cloudstack zone list
(ゾーン一覧)

$ knife cloudstack template list
(テンプレート一覧)

$ knife cloudstack serviceoffering list
(サービスオファリング一覧)

 

仮想マシンを作成する際には、以下のような引数を渡すことで、VM 作成と、Chef Server 管理下への追加、およびCookbook に含まれるRecipe を実行してくれます。

$ knife cloudstack server create \
-s (service offering ID) -t (template ID) -z (zone ID) -d (bootstrap script) \
-i (SSH Private key of keypair) -k (CloudStack keypair name) \
-N (displayname on Chef Server/CloudStack UI) \
-r '[RECIPE1]', '[RECIPE2]',・・・

以下は、セルフクラウド上でCentOS 6.1 64bit(テンプレートID:1021)、Service Offering としてS2(1CPU, 2GBメモリ, サービスオファリングID:30)を指定しています。さらに仮想マシン作成後、getting-started とapache2 のRecipe を実行します。

$ cd ~/chef-repo
$ knife cloudstack server create -s 30 -t 1021 -z 1 -d centos6 \
-i ~/chef-repo/.chef/srv2clt.pem -k srv2clt -N ChefNode1 \
-r 'recipe[getting-started]','recipe[apache2]'

注意:-iオプションで指定する秘密鍵ファイルは、CloudStackに登録した公開鍵に対応する秘密鍵です。bootstrapスクリプトが実行されない原因のほとんどが、この引数の設定ミスです。

上記コマンドを実行すると仮想マシン作成が実行されます。仮想マシンがSSHに応答する状態になると、続いてbootstrapスクリプトが実行されます。スクリプト実行ログもすべて表示させるため、非常に多くの行が出力されます。
仮想マシン作成が完了したら、SSH で作成したNodeにログインします。 そしてRoot のホームディレクトリにchef-getting-started.txt があることを確認し、内容も確認します。

[Workstation]$ ssh -i ~/chef-repo/.chef/(秘密鍵) root@(作成した仮想マシンのIP)
[Chef Node]# ls ~/
chef-getting-started.txt

[Chef Node]# cat chef-getting-started.txt

 

Chef Server のWeb UI の「Nodes」タブに、作成した仮想マシン(Node)が表示されることを確認します。

Node List

ここまででChef環境の構築は完了しました。この先、Chefを使ったインフラ管理は専らCookbookを設計・開発することになります。
次回は、Cookbookカスタマイズの基礎の基礎について、及び補足事項を解説します。

<連載記事>

Copyright © IDC Frontier Inc.