ちょっと話題の記事

Amazon Linuxで簡易Chef Server(chef-zero)を動かしてみた

2013.05.22

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

ども、大瀧です。最近かげきしょうじょ!にハマってます。マンガ好きの方にオススメです。
さて、大和さんのシリーズ「Chefを始める」でChef Client & Serverの構築が解説されていますが、Chef ServerのセットアップとChef ClientのValidationって結構面倒だと思いませんか?
簡単にセットアップ&Clientから接続できる開発環境向けのChef Server、chef-zeroなるものがあると聞き、例によってAmazon Linuxにインストールしてみました。

準備するもの

Amazon Linux 1つ。t1.microでOKです。

1. Rubygemsと依存パッケージをインストール

chef-zeroは、RubyGemsで提供されています。今回は深い意味はないですが、Ruby 1.9とそのRubygemsを準備しておきます。

[ec2]$ sudo yum install ruby19 rubygems19
[ec2]$ sudo ln -sf /usr/bin/ruby1.9 /usr/bin/ruby
[ec2]$ sudo ln -sf /usr/bin/gem1.9 /usr/bin/gem
[ec2]$ gem list

*** LOCAL GEMS ***


[ec2]$

また、chef-zeroが依存するGemにはRuby拡張をビルドするものがあるため、Development Toolsパッケージグループとruby19-develパッケージ、openssl-develパッケージもインストールしておきます。

[ec2]$ sudo yum groupinstall "Development Tools"
[ec2]$ sudo yum install ruby19-devel openssl-devel

2. chef-zeroのインストール

chef-zeroのインストールはgem installで一発です。依存するjson gemも一緒に入れましょう。

[ec2]$ sudo gem install chef-zero json --no-ri --no-rdoc
Building native extensions.  This could take a while...
Fetching: mixlib-log-1.6.0.gem (100%)
Fetching: hashie-2.0.5.gem (100%)
Fetching: moneta-0.6.0.gem (100%)
Fetching: chef-zero-1.0.1.gem (100%)
Fetching: json-1.8.0.gem (100%)
Successfully installed puma-2.0.1
Successfully installed mixlib-log-1.6.0
Successfully installed hashie-2.0.5
Successfully installed moneta-0.6.0
Successfully installed chef-zero-1.0.1
Successfully installed json-1.8.0
5 gems installed
[ec2]$

3. chef-zeroの実行

で、いきなり実行できます。デフォルトではフォアグラウンドで実行するため、&をつけてバックグラウンドで起動するのがオススメです。Amazon Linuxは一定時間端末を放っておくと、自動的にSSHコネクションが切断されるためです。とりあえず必要そうなオプションを以下に示します(-hオプションでも確認できます)。

オプション名 機能 デフォルト値
-H X.X.X.X Listenするインターフェース 127.0.0.1
-p XXXX Listenするポート番号 8889

ポート番号を1023番より小さい番号にするためには、rootの権限が必要です。その場合は、sudoコマンドで実行しましょう。

[ec2]$ chef-zero -H 0.0.0.0 &
[2] 27218
>> Starting Chef Zero (v1.0.1)...
>> Puma (v2.0.1) is listening at http://0.0.0.0:8889
>> Press CTRL+C to stop

[5/23 追記(@sawanobolyさんご指摘ありがとうございました)]
実行例ではインターフェース0.0.0.0を指定しているため、任意のホストから接続できる状態です。後述の通り、chef-zeroではClient認証を行わないので0.0.0.0にする場合は、iptablesやEC2のセキュリティグループなど、OSもしくはAWSレベルでアクセス制限を設定しましょう。

以下にセキュリティグループの設定例を示します。1つ目のエントリーはChef Client用にVPCサブネットのネットワーク、2つ目のエントリーはChef Workstationとなる手元のMBAが接続するネットワークのグローバルIPアドレスにしました。

chef-zero_sg

4. 接続確認

適当なChef Workstationからchef-zeroを実行するEC2に接続してみます。chef-zeroはClient認証を行わない(どんなキーでもAcceptする)ので、適当なClientキーでOKです。Workstationのセットアップ方法は、大和さんのエントリーを参照してください。~/.chef/knife.rbファイル内のchef_server_urlエントリーが、httpsではなくhttpになること、ポート番号をchef-zero実行時の-pオプションに合わせることに注意してください。

[work]$ cat ~/.chef/knife.rb
log_level                :info
log_location             STDOUT
node_name                'otaki'
client_key               '/Users/otakiryuta/.chef/otaki.pem'
validation_client_name   'chef-validator'
validation_key           '/Users/otakiryuta/.chef/chef-validator.pem'
chef_server_url          'http://ec2-XX-XX-XX-XX.ap-northeast-1.compute.amazonaws.com:8889/'
syntax_check_cache_path  '/Users/otakiryuta/.chef/syntax_check_cache'
[work]$

試しに、ユーザー一覧を参照してみます。

[work]$ knife user list
admin

ちゃんと出ました!

まとめ

Chef soloに比べると敷居が高いChef Serverですが、Cookbook開発や動作確認であればchef-zeroで十分代用できるんじゃないかと思います。皆さんのChef力向上にお役立てください!

参考ページ