前回に引き続き Chef に関するエントリです。このエントリではChef Serverのインストールと初期設定、更にNodeの接続までを書いていこうと思います。自分のメモ書きを整理して書き出しているので、何かおかしな箇所があったら是非指摘してください!
さて、作業を進めていく上で複数のマシンが出てくるので、便宜上、下図のようなネットワーク構成にしようと思います。192.168.50.100はグローバルIPだと思ってください。また、Chef Server, 各Nodeは全てUbuntu 11.10 Serverと仮定します(Debian squeezeでも大丈夫)。
Chef Server はパッケージシステムからインストールするのが無難
前回の「Chefの仕組み」でも書いたように、自力で Chef Server をセットアップするのは骨が折れます。サーバの構築を自動化したいのに肝心のChefで手間取るなど本末転倒ですね。なるべくならディストリビューション付属のパッケージシステムで導入したいところです。
有り難いことに開発元の Opscode が、Debina/Ubuntu用のAPT Repositoryを提供して下さっていますので迷わず利用しましょう。…CentOSは…美味しいんでしょうか…
作業手順は下記の通り。まずChef ServerにSSHでログインし、KeyとRepositoryを登録して apt-get で chef-server をインストールします。
# Ubuntu
chefserver:$ echo "deb http://apt.opscode.com/ `lsb_release -cs`-0.10 main" | sudo tee /etc/apt/sources.list.d/opscode.list
# Debian
chefserver:$ echo "deb http://apt.opscode.com/ squeeze-0.10 main" | sudo tee /etc/apt/sources.list.d/opscode.list
chefserver:$ sudo apt-get update
chefserver:$ sudo apt-get install opscode-keyring
chefserver:$ sudo apt-get update
chefserver:$ sudo apt-get install chef-server
インストールの途中で3回質問が出ますので入力が必要になります。
これはChef Server内にインストールされるChef ClientからみたChef Server APIのURIを入力します。同一サーバなのでここでは http://localhost:4000
と入力してください。
AMQP Server(RabbitMQ)のパスワードを入力します。任意の文字列を入力してください。ここで入力したパスワードは /etc/chef/solr.rb 内に記述されます。
WebUIの初期ユーザー(admin)のパスワードを設定します。任意の文字列を入力してください。
インストールが無事終わるとChef Serverが自動的に立ち上がります。結構な量のパッケージが入りますので多少時間がかかると思います。
管理用Clientを登録する
Chef Serverのインストールが終わったら管理用Clientを登録します。ここで登録するClientはChef Server内でのみ使用します。
まずホームディレクトリに.chefディレクトリを作成し、鍵二種類を/etc/chefからコピーしてきます。
chefserver:$ mkdir -p ~/.chef
chefserver:$ sudo cp /etc/chef/validation.pem /etc/chef/webui.pem ~/.chef
chefserver:$ sudo chown -R $USER:$USER ~/.chef
そのあとにknifeコマンドで初期設定を行います。
chefserver:$ knife configure -i
WARNING: No knife configuration file found
Where should I put the config file? [~/.chef/knife.rb] [ENTER]
Please enter the chef server URL: [http://chefserver:4000] http://localhost:4000
Please enter a clientname for the new client: [username] master
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/username/.chef/webui.pem
Please enter the validation clientname: [chef-validator] [ENTER]
Please enter the location of the validation key: [/etc/chef/validation.pem] /home/username/.chef/validation.pem
Please enter the path to a chef repository (or leave blank): [ENTER]
Creating initial API user...
Created client[master]
Configuration file written to /home/username/.chef/knife.rb
これでmasterという管理用Clientが登録されました。試しに下記コマンドを叩いてみましょう。
chefserver:$ knife client list
次のように返ってくれば成功です。
chefserver:$ knife client list
chef
chef-validator
chef-webui
master
Clientの詳細をみることも出来ます。
chefserver:$ knife client show master
_rev: 1-2901b7c2eb6d33b01f8f12951933b709
admin: true
chef_type: client
json_class: Chef::ApiClient
name: master
public_key: -----BEGIN RSA PUBLIC KEY-----
snip
-----END RSA PUBLIC KEY-----
ローカル環境用に管理用Clientを作成する
今後、Chefの操作はほぼKnifeコマンドで行う事になるのですが、毎回サーバにログインして作業するのは微妙です。Cookbookなどは別の環境で作成してGitなどのSCMで管理したいですよね。
ですので別の環境からでもアクセス出来る管理用Clientを作成したいと思います。
下記コマンドを実行しましょう。これはakatsukaという管理用Clientを作成するコマンドになります。Client名は適宜置き換えて下さい。
chefserver:$ knife client create akatsuka -n -a -f /tmp/akatsuka.pem
Created client[akatsuka]
ちゃんと作成出来ているか確認します。
chefserver:$ knife client list
akatsuka
chef
chef-validator
chef-webui
master
あとは上記コマンドで生成された/tmp/akatsuka.pemと~/.chef/validation.pemの二つの鍵をSCPなどでローカル環境にコピーしてください。
ローカル環境の準備
ローカル環境側はknifeコマンドを使うだけですので、RubyとRubygemsが入っていればgem installだけで済みます(Rubyのインストールは割愛します)。
workstation:$ gem install chef
インストールが終わったら先ほどSCPで持ってきた akatsuka.pem と validation.pem を ~/.chef にコピーして、下記コマンドを実行します。
workstation: $ knife configure
WARNING: No knife configuration file found
Where should I put the config file? [~/.chef/knife.rb] [ENTER]
Please enter the chef server URL: [http://workstation:4000] http://192.168.50.100:4000
Please enter an existing username or clientname for the API: [username] akatsuka
Please enter the validation clientname: [chef-validator] [ENTER]
Please enter the location of the validation key: [/etc/chef/validation.pem] /Users/username/.chef/validation.pem
Please enter the path to a chef repository (or leave blank): [ENTER]
*****
You must place your client key in:
/Users/username/.chef/akatsuka.pem
Before running commands with Knife!
*****
You must place your validation key in:
/Users/username/.chef/validation.pem
Before generating instance data with Knife!
*****
Configuration file written to /Users/username/.chef/knife.rb
ローカル環境からでも接続出来るか確認してみましょう。
workstation:$ knife client list
akatsuka
chef
chef-validator
chef-webui
master
Chef Server APIをHTTPSにしてセキュアにする
Chef Server APIのプロトコルは普通のHTTPなので、フロントエンドに nginx を置いてHTTPSに対応させます。
chefserver:$ sudo apt-get install nginx
OpenSSLを使って鍵を生成します。
chefserver:$ cd /etc/nginx
chefserver:$ sudo mkdir ssl
chefserver:$ sudo openssl req -new -key ssl/server.key -out ssl/server.csr
chefserver:$ sudo openssl x509 -in ssl/server.csr -out ssl/server.crt -req -signkey ssl/server.key -days 365
chefserver:$ sudo chmod 400 ssl/server.*
nginxのデフォルトファイルを削除します。
sudo rm -rf /etc/nginx/sites-enabled/default
/etc/nginx/conf.d/proxy.confを作成します。
# /etc/nginx/conf.d/proxy.conf
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
/etc/nginx/sites-available/sslを作成します。
# /etc/nginx/sites-available/ssl
server {
listen 443;
server_name localhost;
ssl on;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:4000/;
}
}
上で作ったファイルのシンボリックリンクを/etc/nginx/sites-enabled内に作成します。
chefserver:$ sudo ln -s /etc/nginx/sites-available/ssl /etc/nginx/sites-enabled/ssl
nginxを起動させます。
chefserver:$ sudo /etc/init.d/nginx start
これでChef ServerはHTTPS対応になりました。ローカル環境のほうもHTTPSで繋がるように変更しておきましょう。~/.chef/knife.rbを開いてchef_server_urlの値を修正します。
-chef_server_url 'http://192.168.50.100:4000'
+chef_server_url 'https://192.168.50.100'
まとめ
うーん・・・。書いていて思ったのはやはり手間ですね!もう少し何とかならないものか・・・。あと完全にWebUIをスルーしておりますが、今後もスルーする方向で行こうと思っています。理由は、WebUIだけだと出来ない事がある、何故かOpenIDを使ってログイン出来てしまう(致命的なような…)、そもそも使い勝手的にどうなんだ、といったところです。あと設定ファイルもローカルに残らないのでそれもマイナスですね。
さて、次はいよいよNodeを登録して実際にレシピを書いていこうと思います。年内に書ければいいなぁ