IDCF テックブログ

IDCF テックブログ

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

【Chef 11版】Chef Server環境セットアップ手順の紹介

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

昨年、Chef 10を使ったクラウド管理環境のセットアップ手順について記事を書きました。
その後今年2月にChef 11がリリースされました。Chef 11ではこれまでとコードベースが異なり、コードはErlangで書かれていたり、データベースがMongoDBからPostgreSQLに変わっていたりします。
しかし、利用する立場からすると以前のバージョンで動いたCookbookはほとんどそのまま動きます。最近、Chef11の導入検証などを(業務で必要に迫られて)行いましたので、Chef11を使い始めるための手順について解説いたします。

昨年の記事はこちら
IDCFクラウドでChefを使い始めるまで―第1回 Chef Server導入編
IDCFクラウドでChefを使い始めるまで―第2回 Chef Workstation・Node構築編
IDCFクラウドでChefを使い始めるまで―第3回 Cookbook検証編

1. Chefの基本的な用語の解説

以前の記事でも解説しましたが、Chefには以下の3つの役割があります。

  1. Chef Server:Clientの管理を行う
  2. Chef Node:Chefによって構築、管理される対象
  3. Chef Workstation:構築、管理する方法をコーティングしたCookbookの作成、更新を行う端末

これらの関係は以下の図のようになります。 Chefの3つの役割相関図
                    図1. Chefの3つの役割相関図

次に、ChefではClientの構築手順をRubyで記述します。この構築手順書をCookbookと呼びます。Cookbookは以下のような要素から構成されています。(以下のリストがすべてではありません。)

  1. Recipe:Nodeを構築するためのセットアップ手順書で、Rubyで記述する。
  2. Attribute:Recipeで利用する変数をまとめて記述したもの。
  3. File:Recipeで作成するファイル。設定ファイルやパッケージファイルがある。
  4. Library:Recipeから呼び出すスクリプト。必要に応じて作成する。
  5. Template:Fileと似ているが、Attributeなどに応じて内容を編集する前提の設定ファイルのテンプレート。erb形式で記述。
  6. Package:アプリケーションのパッケージ。
  7. Provider:パッケージの扱い方などOS依存な部分の抽象化を行う。
  8. Metadata:Cookbookの名称、含まれるRecipeの情報、Cookbook同士の依存関係などを記述したRubyまたはJSONファイル

言葉の定義を並べただけは互いの関係性が分からないので、関係を図示すると以下のようになります。 Cookbookの構成要素の関係図
                   2. Cookbookの構成要素の関係図

Chefでは、このCookbook、特にRecipeとAttributeを記述することでChef NodeへのPackage導入、設定ファイル編集などを行います。
それでは、Chef 11環境の構築手順について解説いたします。

2. Chef Serverの導入

Chef 11になって一番変化が大きかったのがChef Serverです。しかし、インストールに関して言えば、以前よりはるかに簡単になりました。これは、Opscode社が各種OS向けにセットアップスクリプトを用意しており、それを実行するだけでほとんどの作業が完了するようになったためです。
以下、Chef Documentサイトの解説に従ってChef Serverを構築します。

1) Chef Server用環境の構築

今回は以下の環境にChef Serverを導入します。

  • OSはCentOS 6.4 64bit版
  • ホスト名はDNSで解決できるFQDNと一致
  • インターネットに直接(proxy無しで)繋がる

2項目目のChef Serverのホスト名についてですが、FQDNと一致し、更にChef Node(になる予定のホスト)から名前解決できる必要があります。ホスト名がFQDNと違う場合は/etc/sysconfig/networkの更新と、"# hostname (FQDN)"コマンドで設定を変更をしてください。もしDNSで名前解決ができない環境でしたら、/etc/hostsにChef Serverの名前とIPを記載して名前解決できるようにしてください。

2) Chef Serverパッケージのインストール

Opscode社のインストーラー配布サイト( http://www.opscode.com/chef/install/ )の「Chef Server」タブからChef ServerのインストールパッケージのダウンロードURLを取得します。CentOSの場合はOSとして「Enterprise Linux」を選択します。画面左のOSバージョンと画面中央のChef Serverバージョンの指定をするとChef ServerのRPMパッケージへのリンクが表示されます。このリンクからファイルを取得し、Chef Serverに保存します。

次に、Chef ServerのrootユーザーでRPMパッケージのインストールを実行します。以下は2013年7月1日時点での最新版である11.0.8のrpmインストールをする場合のコマンドです。

 [Server]# rpm -ivh chef-server-11.0.8-1.el6.x86_64.rpm
 警告: chef-server-11.0.8-1.el6.x86_64.rpm: ヘッダ V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
 準備中...                ########################################### [100%]
    1:chef-server            ########################################### [100%]
 Thank you for installing Chef Server!

 The next step in the install process is to run:

 sudo chef-server-ctl reconfigure

次に、RPMインストール時に表示されている通り、以下のコマンドを実行します。

 [Server]# chef-server-ctl reconfigure
    (以下、Chef Serverセットアップが自動的に実行される)

3) Chef Serverの初期設定

セットアップコマンドの実行が完了するとサービス起動まで行われているので、Chef ServerのWeb UIにログインします。

ログインURLはChef 10とは違い、デフォルトでHTTPS(443番ポート)になっています。従来は4040番だったのですが、公式ドキュメントにはポート番号変更の件は書かれていませんでした。そのため私はここでしばらくハマってしまいました。 Chef ServerのWeb UIログイン画面
                  図3. Chef ServerのWeb UIログイン画面

Web UIにアクセスするとログイン画面が表示されますので、画面に書かれているデフォルトのユーザー、パスワードでログインします。するとパスワード変更を求められるので好きなパスワードに変更します。

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

3. Chef Workstationの導入

次に、Cookbookを作成したりChef Nodeを管理するための端末であるWorkstationをセットアップします。以下ではこちらのドキュメントを参考にしています。
WorkstationはChef ServerとHTTPSで通信できること、インターネットに直接接続できることを前提とします。

1) Chef Clientインストール

まず、以後のステップで必要となるgitパッケージをインストールします。これはWorkstationのroot権限で行います。

 [Workstation]# yum install git

次に、以下のコマンドを実行してChef Clientパッケージをインストールします。(Workstationも、Chef Serverと通信するためにClientパッケージが必要です。)

 [Workstation]# curl -L http://www.opscode.com/chef/install.sh | sudo bash
   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                  Dload  Upload   Total   Spent    Left  Speed
 100  6515  100  6515    0     0  12828      0 --:--:-- --:--:-- --:--:-- 19505
 Downloading Chef  for el...
 Installing Chef
 警告: /tmp/tmp.fXLlJAUP/chef-.x86_64.rpm: ヘッダ V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
 準備中...                ########################################### [100%]
    1:chef                   ########################################### [100%]
 Thank you for installing Chef!

インストールが出来たかどうかを、chef-clientコマンドで確認します。

 [Workstation]# chef-client -v
 Chef: 11.4.4

2) Cookbook開発環境の構築

次に、WorkstationでCookbook開発などに利用するユーザー(一般ユーザー)のホームディレクトリ以下に.chefディレクトリを作成します。ここにChef Serverとの通信の認証に必要な秘密鍵をChef Serverからコピーして保存します。秘密鍵はChef Serverの/etc/chef-serverディレクトリにあるadmin.pemとchef-validator.pemの二つです。

 [Workstation]$ mkdir ~/.chef
 [Workstation]$ cd ~/.chef
 (admin.pemとchef-validator.pemをコピー)

Cookbook開発に必要なディレクトリ、ファイルを一気に作成するため、以下のコマンドを実行します。

 [Workstation]$ cd
 [Workstation]$ git clone git://github.com/opscode/chef-repo.git

上記コマンドを実行したディレクトリ以下にchef-repoディレクトリが作成されますので、chef-repoディレクトリに移動します。移動後、以下のコマンドを実行してWorkstationの初期設定を行います。ウィザードのように設定項目を聞かれますので、適切に回答して行きます。以下では、ユーザー名が"user"である場合の回答を記載します。

 [Workstation]$ knife configure --initial
 WARNING: No knife configuration file found
 Where should I put the config file? [/home/user/.chef/knife.rb]
 Please enter the chef server URL: [http://(自ホストのFQDN):4000] https://(Chef ServerのFQDN)
 Please enter a name for the new user: [root] user
 Please enter the existing admin name: [admin] 
 Please enter the location of the existing admin's private key: [/etc/chef/admin.pem] /home/user/.chef/admin.pem
 Please enter the validation clientname: [chef-validator]
 Please enter the location of the validation key: [/etc/chef/validation.pem] /home/user/.chef/chef-validator.pem
 Please enter the path to a chef repository (or leave blank): /home/user/chef-repo
 Creating initial API user...
 Please enter a password for the new user:任意のパスワードを入力
 Created user[user]
 Configuration file written to /home/user/.chef/knife.rb

このコマンドで~/.chef/knife.rbファイルと、~/.chef/(ユーザー名).pemが作成された事を確認します。 最後にChef Serverと正常にやり取りできる事を以下のコマンドで確認します。

 [Workstation]$ knife client list
 chef-validator
 chef-webui
 [Workstation]$ knife user list
 admin
 user

これ以降、admin.pemは不要となるため、安全のために削除しておきます。

 [Workstation]$ rm ~/.chef/admin.pem

以上でWorkstationのセットアップが完了しました。

4. Chef管理対象となるClientの作成

ここでは、Chef Nodeとなる対象ホストはすでに存在していて、Chef Serverとの通信ができる事、WorkstationからrootユーザーとしてSSHで接続できる状態になっているとします。

1) テスト用CookbookのChef Serverへのアップロード

Chef Nodeに適用するCookbookとして、chef-client、実際のRecipeとしてchef-client::delete_validationを利用します。このRecipeは、Chef NodeがServerとの初回の接続の際にだけ利用される秘密鍵(chef-validation.pem)を、clientから削除するためのものです。

この作業は必須ではないですが、セキュリティ上、chef-validation.pemが漏洩するリスクを減らす事ができるため、Opscode社のトレーナーから以前伺ったTipsです。ぜひ、すべてのNodeで実行するようにした方が良いと思います。

具体的には以下のknifeコマンドでCookbookをダウンロードします。

 [Workstation]$ cd ~/chef-repo
 [Workstation]$ knife cookbook site install chef-client

 (必要なCookbookがダウンロードされる。)

もし必要であれば編集およびgit commitした後、以下のコマンドでChef Serverにアップロードします。

 [Workstation]$ knife cookbook upload -a
 Uploading chef-client  [3.0.4]
 Uploading cron         [1.2.4]
 Uploaded all cookbooks.

次に、Chef Node作成のために必要となる、Chef Clientアプリケーションのインストール用スクリプト(bootstrap用スクリプト)のテンプレートを作成します。Chefで標準で付属するテンプレートはUbuntu 10.04用とCentOS5用テンプレートのみです。そこで、CentOS 6用(Chef 11版)のテンプレートを私のGithubアカウントで公開しています。こちらのリンクにあるcentos6.erbの内容を、Workstationの~/.chef/bootstrap/centos6.erbとして保存します。

 [Workstation]$ cd ~/.chef
 [Workstation]$ cd mkdir bootstrap
 [Workstation]$ vi bootstrap/centos6.erb
 (先のリンク先の内容をコピー)

2) Chef Nodeの構築(bootstrap)

以下のコマンドでChef Nodeを構築します。

 [Workstation]$ knife bootstrap (NodeのFQDN) -x root -d centos6 -r 'recipe[chef-client::delete_validation]'

これを実行すると、WorkstationからNodeにSSH接続し、Chef Clientのインストールおよび初期設定、Chef Server管理対象への追加が行われ、最後にchef-client::delete_validationレシピが実行されます。以上でNode構築が完了です。事前準備さえしてあれば2台目のNodeからはknife bootstrapコマンドを実行するだけでOKです。

5. Chef11導入のまとめ

利用者視点でみると、Chef 11とChef 10までとで異なるのは、UbuntuやDebian以外のLinuxディストリビューションでもChef Server・Client共にインストールが簡単になったことと、Chef Serverのデフォルト待ち受けポート番号の変更程度です。Chefに興味があるけどまだ試していない方は、ぜひお試しください。従来より非常に簡単にセットアップできるようになっています。

Copyright © IDC Frontier Inc.