Chef 11 で Chef Server WebUI を使えるようにしてみる(chef11アレコレ)

by RobethK



昨日の「Chef 11 での client/server/knife のセットアップ手順(+α)」のエントリの続きです。


Chef ServerとClientは基本的にRESTなHTTP APIを介してやりとりを行うのですが、ChefにはServer APIをGUI(ブラウザ)で操作できるchef-server-webuiが標準でついています。

↑の昨日のエントリでセットアップした状態だと、僕の環境(CentOS 6系)だと使えなかったので、使える状態までに設定したメモを残しておきます。
(ちなみに、私は普段ほとんどWebUIを使っていません...)

前提

  • Chef Server 11系のバージョン
  • 昨日のエントリの通り、Chef Serverはインストール&動作確認済
  • 使ったChef Serverの環境はCentOS 6ç³»
  • サーバはインターナルな内部ネットワークに設置
  • 内部DNSもないので、内部ネットワークでは自前で名前解決が必要

chef-server-webuiへのアクセス

まずは、ブラウザからWebUIにアクセスしてみます。
↑の通りの前提で内部DNSがない環境なので、Chef ServerへのアクセスはIPアドレスを直で指定します。


すると以下のログイン画面が表示されるかと思います。


次に、adminユーザ&デフォルトパスワードでログインします。
初期パスワードは↑の画面右部に記載されている他、"/etc/chef-server/chef-server-running.json"の"web_ui_admin_default_password"にも記載されています。

ログインできない・・・!

・・・すると、"We're sorry, but something went wrong."の表示と、500(Internal Server Error)が返され、ログインできません。


ということでログを見てみましょう。
WebUIアプリのログなので、"/var/log/chef-server/chef-server-webui/current"を確認してもよいのですが、Chef 11からは、"chef-server-ctl tail"というChef Serverを司る各種バックエンドのミドルウェアのログを俯瞰してモニタリングできるコマンドが存在します!


というわけで、

# chef-server-ctl tail

と実行し、もう1度ブラウザからログインしてみます。

==> /var/log/chef-server/chef-server-webui/current <==
2013-05-27_05:59:01.21153 Started POST "/users/login_exec" for 127.0.0.1 at 2013-05-27 14:59:01 +0900
2013-05-27_05:59:01.21511 Processing by UsersController#login_exec as HTML
2013-05-27_05:59:01.21531   Parameters: {"utf8"=>"&#10003;", "authenticity_token"=>"8wnCRT7r5abkQKHnzaD4FrTCd9fbysEqLi+H7Ye3kJ0=", "name"=>"admin", "commit"=>"login", "password"=>"[FILTERED]"}
2013-05-27_05:59:01.21638 [2013-05-27T14:59:01+09:00] WARN: Failed to read the private key /etc/chef-server/chef-webui.pem: #<Errno::EACCES: Permission denied - /etc/chef-server/chef-webui.pem>
2013-05-27_05:59:01.22081 Chef::Exceptions::PrivateKeyMissing: I cannot read /etc/chef-server/chef-webui.pem, which you told me to use to sign requests!
2013-05-27_05:59:01.22085 {:request_params=>
2013-05-27_05:59:01.22086   {"utf8"=>"&#10003;",
2013-05-27_05:59:01.22087    "authenticity_token"=>"8wnCRT7r5abkQKHnzaD4FrTCd9fbysEqLi+H7Ye3kJ0=",
2013-05-27_05:59:01.22087    "name"=>"admin",
2013-05-27_05:59:01.22088    "commit"=>"login",
2013-05-27_05:59:01.22088    "password"=>"p@ssw0rd1",
2013-05-27_05:59:01.22089    "action"=>"login_exec",
2013-05-27_05:59:01.22089    "controller"=>"users"}}
2013-05-27_05:59:01.22090
2013-05-27_05:59:01.22090 /opt/chef-server/embedded/service/gem/ruby/1.9.1/gems/chef-11.4.0/lib/chef/rest.rb:430:in `rescue in load_signing_key'
2013-05-27_05:59:01.22091 /opt/chef-server/embedded/service/gem/ruby/1.9.1/gems/chef-11.4.0/lib/chef/rest.rb:420:in `load_signing_key'
2013-05-27_05:59:01.22091 /opt/chef-server/embedded/service/gem/ruby/1.9.1/gems/chef-11.4.0/lib/chef/rest.rb:66:in `initialize'

ログにはこのような感じに。どうやら「Permission denied - /etc/chef-server/chef-webui.pem」こういうことらしい。

# ll /etc/chef-server/chef-webui.pem
-rw-r----- 1 root chef_server 1679 May 27 13:55 /etc/chef-server/chef-webui.pem

該当ファイルのownerとpermissionの確認。

# id chef_server
uid=498(chef_server) gid=100(users) groups=20278(chef_server),100(users)

で、chef-server-webuiの実行ユーザの確認。
きちんとOSでのグループには所属しているようですが、プライマリグループが"users"になっていて、chef-server-webuiを稼動しているunicornプロセスではプライマリグループしかセットされていないんじゃないかなぁと予想。(これは推測です)

ということで、Unicornプロセスに正しいグループを設定しようとしたのですが、ちょっとUnicorn力が低すぎて泣きそうになったので、いったん"/etc/chef-server/chef-webui.pem"のownerを"chef_server"に変更して、パーミッションを440にする作戦を決行することにする。(エヘヘ)

chef-server自体のCookbookを変更する

はっきり言うと、"/etc/chef-server/chef-webui.pem"については、Chef ServerのCookbookでは"recipes/bootstrap.rb"で管理されていますが、ここは最初に1度流れると、基本的には処理されない感じになっています。(ver. 11.0.8)

なので、ファイルのオーナとパーミッションの変更なので、chownとかchmodのコマンドを使えばよいのですが、せっかくなので勉強がてら、Cookbookをきちんと変更して、あるべき姿を記載してみます。


というわけで、まずは"/etc/chef-server/chef-webui.pem"の状態を記載している"/opt/chef-server/embedded/cookbooks/chef-server/recipes/bootstrap.rb"を以下のように書き換えます。

# diff -u /opt/chef-server/embedded/cookbooks/chef-server/recipes/bootstrap.rb{.bak,}
--- /opt/chef-server/embedded/cookbooks/chef-server/recipes/bootstrap.rb.bak    2013-05-27 16:06:08.869973685 +0900
+++ /opt/chef-server/embedded/cookbooks/chef-server/recipes/bootstrap.rb        2013-05-27 19:05:38.461985677 +0900
@@ -39,10 +39,10 @@
 # servers need access to this key.
 chef_user = node['chef_server']['user']['username']
 file "/etc/chef-server/chef-webui.pem" do
-  owner "root"
+  owner chef_user
   group chef_user
-  mode "0640"
-  not_if { File.exists?(bootstrap_status_file) }
+  mode "0440"
+  #not_if { File.exists?(bootstrap_status_file) }
 end

 file bootstrap_status_file do

ownerはattributeで設定されている"chef_user"に。modeでパーミッションを変更。not_ifでbootstrap_status_fileが存在したら実行されないようになっているので、ここをコメントアウトします。


次に、"/opt/chef-server/embedded/cookbooks/chef-server/recipes/default.rb"を以下のように変更します。

# diff -u /opt/chef-server/embedded/cookbooks/chef-server/recipes/default.rb{.bak,}
--- /opt/chef-server/embedded/cookbooks/chef-server/recipes/default.rb.bak      2013-05-27 16:05:33.397223454 +0900
+++ /opt/chef-server/embedded/cookbooks/chef-server/recipes/default.rb  2013-05-27 16:07:03.317974407 +0900
@@ -36,9 +36,9 @@
   node.consume_attributes(ChefServer.generate_config(node['fqdn']))
 end

-if File.exists?("/var/opt/chef-server/bootstrapped")
-       node.set['chef_server']['bootstrap']['enable'] = false
-end
+#if File.exists?("/var/opt/chef-server/bootstrapped")
+#      node.set['chef_server']['bootstrap']['enable'] = false
+#end

 # Create the Chef User
 include_recipe "chef-server::users"

ここでは、"/var/opt/chef-server/bootstrapped"が存在すればbootstrapが流れないようにセットされている部分があるので、ここをコメントアウトします。
ちなみに、recipes/bootstrap.rbの中身を見てもらえればわかりますが、↑をコメントアウトしても、bootstrap.rbで定義されている各リソースでも上記同様のファイルチェックをやっていますので、おそらく影響はないです。(目に見えるデメリットは、余計なチェック処理が走るくらい。)

# chef-server-ctl reconfigure

ここまで変更したら、上記コマンドを実行し、↑の変更を適用します。

# ll /etc/chef-server/chef-webui.pem
-r--r----- 1 chef_server chef_server 1679 May 27 13:55 /etc/chef-server/chef-webui.pem

無事、変更されましたね。

さー、もう1回ログインしてみる・・・駄菓子菓子

ここまでで、もう1度ブラウザでログインしてみるが、まだログインできず。
ということで、さっきと同様に"chef-server-ctl tail"でログの確認をしてみます。

==> /var/log/chef-server/chef-server-webui/current <==
2013-05-27_07:36:17.89711 Started POST "/users/login_exec" for 127.0.0.1 at 2013-05-27 16:36:17 +0900
2013-05-27_07:36:18.04026 Processing by UsersController#login_exec as HTML
2013-05-27_07:36:18.04051   Parameters: {"utf8"=>"&#10003;", "authenticity_token"=>"8wnCRT7r5abkQKHnzaD4FrTCd9fbysEqLi+H7Ye3kJ0=", "name"=>"admin", "commit"=>"login", "password"=>"[FILTERED]"}

==> /var/log/chef-server/erchef/current <==
2013-05-27_07:36:18.42529
2013-05-27_07:36:18.42532 =ERROR REPORT==== 27-May-2013::16:36:18 ===
2013-05-27_07:36:18.42532 {no_such_key,[70,97,105,108,101,100,32,102,105,110,100,105,110,103,32,107,101,
2013-05-27_07:36:18.42533               121,32,"default"],
2013-05-27_07:36:18.42533              []}
2013-05-27_07:36:18.43753
2013-05-27_07:36:18.43756 =ERROR REPORT==== 27-May-2013::16:36:18 ===
2013-05-27_07:36:18.43756 webmachine error: path="/users/admin"
2013-05-27_07:36:18.43757 {throw,{no_such_key,default},
2013-05-27_07:36:18.43757        [{chef_wm_base,select_user_or_webui_key,2,
2013-05-27_07:36:18.43758                       [{file,"src/chef_wm_base.erl"},{line,602}]},
2013-05-27_07:36:18.43758         {chef_wm_base,verify_request_signature,2,
2013-05-27_07:36:18.43758                       [{file,"src/chef_wm_base.erl"},{line,257}]},
2013-05-27_07:36:18.43759         {chef_wm_base,is_authorized,2,
2013-05-27_07:36:18.43759                       [{file,"src/chef_wm_base.erl"},{line,171}]},
2013-05-27_07:36:18.43760         {webmachine_resource,resource_call,3,
2013-05-27_07:36:18.43760                              [{file,"src/webmachine_resource.erl"},
2013-05-27_07:36:18.43760                               {line,166}]},
2013-05-27_07:36:18.43761         {webmachine_resource,do,3,
2013-05-27_07:36:18.43761                              [{file,"src/webmachine_resource.erl"},
2013-05-27_07:36:18.43761                               {line,125}]},
2013-05-27_07:36:18.43762         {webmachine_decision_core,resource_call,1,
2013-05-27_07:36:18.43762                                   [{file,"src/webmachine_decision_core.erl"},
2013-05-27_07:36:18.43764                                    {line,48}]},
2013-05-27_07:36:18.43764         {webmachine_decision_core,decision,1,
2013-05-27_07:36:18.43765                                   [{file,"src/webmachine_decision_core.erl"},
2013-05-27_07:36:18.43766                                    {line,186}]},
2013-05-27_07:36:18.43766         {webmachine_decision_core,handle_request,2,
2013-05-27_07:36:18.43766                                   [{file,"src/webmachine_decision_core.erl"},
2013-05-27_07:36:18.43767                                    {line,33}]}]}

==> /var/log/chef-server/chef-server-webui/current <==
2013-05-27_07:36:18.47964 [2013-05-27T16:36:18+09:00] ERROR: Server returned error for http://127.0.0.1:8000/users/admin, retrying 1/5 in 4s

==> /var/log/chef-server/erchef/erchef.log.1 <==
2013-05-27T07:36:18Z [email protected] ERR req_id=35Tn7CQcrbTSklWgbQYqZw==; status=500; method=GET; path=/users/admin; user=chef-webui; msg=[]; req_time=271; rdbms_time=194; rdbms_count=1

==> /var/log/chef-server/erchef/current <==
2013-05-27_07:36:22.49102
2013-05-27_07:36:22.49107 =ERROR REPORT==== 27-May-2013::16:36:22 ===
2013-05-27_07:36:22.49108 {no_such_key,[70,97,105,108,101,100,32,102,105,110,100,105,110,103,32,107,101,
2013-05-27_07:36:22.49109               121,32,"default"],
2013-05-27_07:36:22.49109              []}

ふーむ、さっぱりわからんw
ということで、Chef Serverまわりがほとんど初期設定のままだったので、以下の気になっていた点を変更することである程度綺麗に動きました。

Chef Serverに対する設定の変更定義

ちなみに、Chef ServerのCookbookに対してAttributeの変更定義をする場合は、"/opt/chef-server/embedded/cookbooks/chef-server/attributes/default.rb"ではなく、"/etc/chef-server/chef-server.rb"となります。


というわけで、"/etc/chef-server/chef-server.rb"を作成し、以下を挿入してください。
以下のサンプルで"172.xxx.xxx.xxx"は、Chef ServerのIPアドレスを指します。(今回の前提でIPアドレスでのアクセスとしているため。このあたりは環境に応じて修正してください。)

bookshelf['vip'] = "172.xxx.xxx.xxx"
bookshelf['url'] = "https://172.xxx.xxx.xxx"


これはおまけですが、ついでに、フロントのnginxでHTTPにアクセスがきた場合に、HTTPSにリダイレクトされるように以下の設定も入れておきます。

lb['api_fqdn'] = "172.xxx.xxx.xxx"
lb['web_ui_fqdn'] = "172.xxx.xxx.xxx"

nginx['server_name'] = "172.xxx.xxx.xxx"
nginx['url'] = "https://172.xxx.xxx.xxx"


修正が終われば、例によって以下コマンドを実行して、↑の設定を適用します。

# chef-server-ctl reconfigure

Chef Serverバックエンドのミドルウェア再起動

はい。設定が反映されれば、各種ミドルウェアを再起動します。
ちなみに、各種ミドルウェアの現状のステータスを確認する場合は、以下の"chef-server-ctl status"コマンドです。

# chef-server-ctl status
run: bookshelf: (pid 11447) 49s; run: log: (pid 23125) 12976s
run: chef-expander: (pid 11470) 48s; run: log: (pid 23019) 12982s
run: chef-server-webui: (pid 11474) 48s; run: log: (pid 9753) 11145s
run: chef-solr: (pid 11509) 46s; run: log: (pid 22933) 12988s
run: erchef: (pid 12222) 6s; run: log: (pid 23230) 12970s
run: nginx: (pid 12255) 5s; run: log: (pid 9933) 11129s
run: postgresql: (pid 11535) 45s; run: log: (pid 22844) 12994s
run: rabbitmq: (pid 11563) 45s; run: log: (pid 22511) 13010s


閑話休題。
Chef Serverバックエンドの各ミドルウェアを以下コマンド"chef-server-ctl restart"で再起動します。

# chef-server-ctl restart
ok: run: bookshelf: (pid 12308) 1s
ok: run: chef-expander: (pid 12331) 1s
ok: run: chef-server-webui: (pid 12335) 0s
ok: run: chef-solr: (pid 12358) 1s
ok: run: erchef: (pid 12373) 0s
ok: run: nginx: (pid 12401) 1s
ok: run: postgresql: (pid 12421) 0s
ok: run: rabbitmq: (pid 12430) 1s

はい。再起動できました。
これで気を取り直して、ブラウザからChef Server WebUIにアクセスし、ログインしてみてください。問題なくログインできるはずです。

最後に

こんな感じで、実際にログを見ながら、Cookbookのrecipeに手を入れてみたり、attributeを定義してパラメータを変更してみました。
実際にやってみて、erchefはちょっとログがわかりづらかったり、躓いたらRecipeを読んだり(こうやって手が入れられるところが良いところですが)など、少し敷居が高く感じるかもしれませんが、今回の環境が少し特殊だったのかもしれないので、次はAmazon EC2とかUbuntuでも動かしてみようかなと思っています。
それでは! =͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́


入門Chef Solo - Infrastructure as Code

入門Chef Solo - Infrastructure as Code

Instant Chef Starter

Instant Chef Starter