昨日の「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"=>"✓", "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"=>"✓", 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"=>"✓", "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 erchef@127.0.0.1 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](https://images-fe.ssl-images-amazon.com/images/I/31u6VLGX2kL._SL160_.jpg)
入門Chef Solo - Infrastructure as Code
- 作者: 伊藤直也
- 出版社/メーカー: 伊藤直也
- 発売日: 2013/03/11
- メディア: Kindle版
- 購入: 16人 クリック: 1,027回
- この商品を含むブログ (19件) を見る
![Instant Chef Starter Instant Chef Starter](https://images-fe.ssl-images-amazon.com/images/I/51R6RaNgtRL._SL160_.jpg)
- 作者: John Ewart
- 出版社/メーカー: Packt Publishing
- 発売日: 2013/02/22
- メディア: ペーパーバック
- この商品を含むブログを見る