元RX-7乗りの適当な日々 このページをアンテナに追加 RSSフィード Twitter

RX-7(FD3S)WRX STI関連のキーワードで検索されて来られた方へ。
右サイドのカテゴリ『』をクリックすると関連する項目だけが表示されます。
日々の写真は『Flickr』で公開しています。

2013/05/27

by RobethK

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


昨日の「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アドレスを直で指定します。


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

f:id:rx7:20130528011107p:image:w480


次に、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 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

Instant Chef Starter

Instant Chef Starter

2013/05/26

by dløuie

Chef 11 での client/server/knife のセットアップ手順(+α)


遅れながら、Chefの新しい11系のバージョンを触ってみました。

つまづいた途中経過を含めて、セットアップのログや動きで気付いた事を簡単に残しておきます。

尚、今回使ってみた実行環境は、CentOSの6系です(Linux)。


結論から申し上げますと、Chefの新しいバージョンは、サーバのセットアップが物凄く楽でした。

旧来のバージョンでもUbuntuはそこそこ楽でしたが、CentOSの面倒くささと言ったら、んもう。


インストールパッケージの入手先

最近は、下記のChef本家となるOpscodeのサイトから、client/serverともインストーラ(各OSでのパッケージ)をダウンロードできるようになっています。



Clientのインストール

上記サイトからパッケージをダウンロードしてインストールしてもよいのですが、Linuxであれば

curl -L https://www.opscode.com/chef/install.sh | bash

このようなワンライナーを実行するだけで、最新版のChef(client)がインストールされます。

もし、インストールするChefのバージョンを指定する場合は、上記サイトから該当するバージョンを選択して、パッケージをダウンロードしてインストールする感じです。


# curl -L https://www.opscode.com/chef/install.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  6510  100  6510    0     0   8945      0 --:--:-- --:--:-- --:--:-- 39695
Downloading Chef  for el...
Installing Chef
warning: /tmp/tmp.7Qob70VM/chef-.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
Preparing...                ########################################### [100%]
   1:chef                   ########################################### [100%]
Thank you for installing Chef!

この通り、あっさりインストールされました。


# chef-client -v
Chef: 11.4.4

現時点での最新版が動いております。


# ll /opt/chef/bin/
total 36
-rwxr-xr-x 1 root root 466 May  1 09:37 chef-apply
-rwxr-xr-x 1 root root 467 May  1 09:37 chef-client
-rwxr-xr-x 1 root root 466 May  1 09:37 chef-shell
-rwxr-xr-x 1 root root 465 May  1 09:37 chef-solo
-rwxr-xr-x 1 root root 468 May  1 09:37 erubis
-rwxr-xr-x 1 root root 461 May  1 09:37 knife
-rwxr-xr-x 1 root root 460 May  1 09:37 ohai
-rwxr-xr-x 1 root root 487 May  1 09:37 restclient
-rwxr-xr-x 1 root root 460 May  1 09:37 shef

このあたりが実行可能となります。


Serverのインストール

上記のOpscodeのサイトから"Chef Server"タブを選択し、OSの種類やバージョン、アーキテクチャ、そしてChef Serverのバージョンを順に選択していくと、パッケージバイナリのダウンロードリンクが表示されます。

それをコピーして、下記のような感じでインストールしてみましょう。(面倒くさいので以降rootで作業しておりますw)


# rpm -Uvh https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chef-server-11.0.8-1.el6.x86_64.rpm
Retrieving https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chef-server-11.0.8-1.el6.x86_64.rpm
warning: /var/tmp/rpm-tmp.eWnS91: Header V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
Preparing...                ########################################### [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

この通りインストールされました。ちなみに、このバージョン11.0.8のRHEL(CentOS)向けのrpmパッケージは170MBほどありましたので、ダウンロードに時間がかかると思うので、気長にお待ちくださいませ。


次のステップは "sudo chef-server-ctl reconfigure" の実行と書いてあるので、やってみましょう。


# chef-server-ctl reconfigure
Starting Chef Client, version 11.4.0
Compiling Cookbooks...
Recipe: chef-server::default
  * directory[/etc/chef-server] action create
    - create new directory /etc/chef-server
    - change mode from '' to '0775'
    - change owner from '' to 'root'
    - change group from '' to 'root'

[2013-05-24T16:03:33+09:00] WARN: Cloning resource attributes for directory[/var/opt/chef-server/chef-server-webui/etc] from prior resource (CHEF-3694)
[2013-05-24T16:03:33+09:00] WARN: Previous directory[/var/opt/chef-server/chef-server-webui/etc]: /opt/chef-server/embedded/cookbooks/chef-server/recipes/chef-server-webui.rb:31:in `block in from_file'
[2013-05-24T16:03:33+09:00] WARN: Current  directory[/var/opt/chef-server/chef-server-webui/etc]: /opt/chef-server/embedded/cookbooks/chef-server/definitions/unicorn_config.rb:21:in `block in from_file'
Generating RSA private key, 2048 bit long modulus
..............................................................+++


・・・・・省略・・・・・


[2013-05-24T16:22:28+09:00] FATAL: Stacktrace dumped to /opt/chef-server/embedded/cookbooks/cache/chef-stacktrace.out
[2013-05-24T16:22:28+09:00] FATAL: Mixlib::ShellOut::ShellCommandFailed: execute[verify-system-status] (chef-server::bootstrap line 24) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '22'
---- Begin output of curl -sf http://127.0.0.1:8000/_status ----
STDOUT:
STDERR:
---- End output of curl -sf http://127.0.0.1:8000/_status ----
Ran curl -sf http://127.0.0.1:8000/_status returned 22

あら。途中でエラーが出てこけてしまいました。


# curl -sf http://127.0.0.1:8000/_status
# echo $?
22

確かにexit codeは"22"が返っていますね。"0"じゃないといけないとのこと。

終了コード22って何じゃらほい。


# curl --fail http://127.0.0.1:8000/_status
curl: (22) The requested URL returned error: 500

ほう、500が返ってます。

CURLE_HTTP_RETURNED_ERROR (22)

This is returned if CURLOPT_FAILONERROR is set TRUE and the HTTP server returns an error code that is >= 400.

とのこと。


# curl http://127.0.0.1:8000/_status
{"status":"fail","upstreams":{"chef_solr":"fail","chef_sql":"pong"}}

普通に叩いてみると、ステータスがレスポンスとして返ってきて、"chef_solr"がfailってなっていますね。

というわけで、ログを見てみましょう。


# tail -n 1 /var/log/chef-server/chef-solr/current

2013-05-24_07:22:56.89065 Error: Exception thrown by the agent : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: chef-test01: chef-test01: Name or service not known

どうも、chef-solrで自分のホスト名の名前解決が出来ていないらしいです。というわけで、


127.0.0.1   chef-test01 localhost localhost.localdomain localhost4 localhost4.localdomain4

"/etc/hosts"に自分のhostname(今回の例だと、↑の"chef-test01")を追加。


# curl http://127.0.0.1:8000/_status
{"status":"pong","upstreams":{"chef_solr":"pong","chef_sql":"pong"}}

その後、もう一度cURLで叩いてみると、OKになりました。

ということで、気を取り直して、もう1度"chef-server-ctl reconfigure"を実行します。


# chef-server-ctl reconfigure

・・・・・省略・・・・・

Chef Client finished, 154 resources updated
chef-server Reconfigured!

今度は成功しました。

実行すると、何となくわかると思うのですが、Chef Serverのセットアップ自体は、バックグラウンドでChefのエンジンそのもので実行されています。

chef-server自体のCookbookについては、以下に展開されています。

  • /opt/chef-server/embedded/cookbooks/chef-server/

ここのrecipesの中身を見れば、インストール時に何をやっているかは把握できますし、chef-server自体の設定パラメータを変更したい場合は、以下パスのattributeで定義されているパラメータを変えてやればいいわけです。(実際に修正するのは以下パスのファイルではないですが。これはまた別のエントリで。)

  • /opt/chef-server/embedded/cookbooks/chef-server/attributes/default.rb

chef-server自体もcookbookで管理・状態定義されていて、ユーザからもそれが見える点は美しいですね。


次に、サーバが正しく動いているかのテストスイートを流します。

# chef-server-ctl test
Configuring logging...
Creating platform...
Starting Pedant Run: 2013-05-24 07:33:32 UTC
setting up rspec config for #<Pedant::OpenSourcePlatform:0x000000028d5958>
Configuring RSpec for Open-Source Tests
 _______  _______  _______  _______  _______  ______   _______
|       ||       ||       ||       ||       ||      | |       |
|   _   ||    _  ||  _____||       ||   _   ||  _    ||    ___|
|  | |  ||   |_| || |_____ |       ||  | |  || | |   ||   |___
|  |_|  ||    ___||_____  ||      _||  |_|  || |_|   ||    ___|
|       ||   |     _____| ||     |_ |       ||       ||   |___
|_______||___|    |_______||_______||_______||______| |_______|

     _______  _______  ______   _______  __    _  _______
    |       ||       ||      | |   _   ||  |  | ||       |
    |    _  ||    ___||  _    ||  |_|  ||   |_| ||_     _|
    |   |_| ||   |___ | | |   ||       ||       |  |   |
    |    ___||    ___|| |_|   ||       ||  _    |  |   |
    |   |    |   |___ |       ||   _   || | |   |  |   |
    |___|    |_______||______| |__| |__||_|  |__|  |___|

                    "Accuracy Over Tact"

                  === Testing Environment ===
                 Config File: /var/opt/chef-server/chef-pedant/etc/pedant_config.rb
       HTTP Traffic Log File: /var/log/chef-server/chef-pedant/http-traffic.log

Running tests from the following directories:
/opt/chef-server/embedded/service/chef-pedant/spec/api
Ruby?  Erlang? true
Run options:
  include {:focus=>true, :smoke=>true}
  exclude {:platform=>:multitenant, :cleanup=>true}
Creating client pedant_admin_client...


・・・・・省略・・・・・


Finished in 50.21 seconds
70 examples, 0 failures

問題なく、全てパスしました。OKそうです。


chef-clientの実行

今回は、Serverと同じマシンでClientを実行してみます。

まずは、10系のときと同じように、"/etc/chef/client.rb"に以下のような感じで、サーバのURLを設定します。HTTPではなくHTTPSを指定します。

(厳密には、HTTPでもいいのですが、おそらく多くのインターナルな環境ではnginxの設定を変更しないとHTTPではうまく動かないので、この話はまた別の機会に書きます。)


# cat /etc/chef/client.rb
chef_server_url "https://127.0.0.1"

次に、これも10系同様ですが、chef-validatorの秘密鍵を、"/etc/chef/validation.pem"として配置します。

cp /etc/chef-server/chef-validator.pem /etc/chef/validation.pem

これで設定は終わりです。chef-clientを実行してみましょう。


# chef-client
Starting Chef Client, version 11.4.4
Creating a new client identity for chef-test01 using the validator key.
resolving cookbooks for run list: []
Synchronizing Cookbooks:
Compiling Cookbooks...
[2013-05-24T17:35:28+09:00] WARN: Node chef-test01 has an empty run list.
Converging 0 resources
Chef Client finished, 0 resources updated

無事、サーバと通信できました。


knifeの実行

まずは、adminユーザ用の鍵(admin.pem)を、"/etc/chef"へコピーします。

# cp /etc/chef-server/admin.pem /etc/chef

次に、knifeの設定コマンドを実行します。

(今回は、rootユーザで実行していますが、適切なユーザで実行してください。)


# knife configure -i
WARNING: No knife configuration file found
Where should I put the config file? [/root/.chef/knife.rb]
Please enter the chef server URL: [http://chef-test01:4000] https://127.0.0.1
Please enter a name for the new user: [nami] knife
Please enter the existing admin name: [admin]
Please enter the location of the existing admin's private key: [/etc/chef/admin.pem]
Please enter the validation clientname: [chef-validator]
Please enter the location of the validation key: [/etc/chef/validation.pem]
Please enter the path to a chef repository (or leave blank):
Creating initial API user...
Please enter a password for the new user:
Created user[knife]
Configuration file written to /root/.chef/knife.rb

基本的にデフォルトのままでいいですが、chef server URLのところだけ、環境に合わせて設定してください。

(前述の通りですが、忘れずにHTTPSで設定してと...)


# knife client list
chef-test01
chef-validator
chef-webui

この通り、問題なくChef Serverと通信できました。


最後に

と、こんな感じで、以前のバージョンでのCentOSでのセットアップと比べて、随分簡単になっていると思います。

Chef serverが1つのパッケージ内に、フルセットでおさまっていることと、実際のセットアップ処理が、ChefのCookbookという単位で管理されていて、処理内容(Recipe)や設定パラメータ(Attribute)が見える状態になっている(簡単に変更できる)ことが素晴らしいですね。


次は、Chef Serverの中身とか設定について、気付いた事を書いていこうかなと思っております。

それでは! =͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́


追記

続きを書きました。


入門Chef Solo - Infrastructure as Code

入門Chef Solo - Infrastructure as Code

2013/05/17

複数のChef-serverで同一のvalidation.pemを利用させたいとき


運用設計・ルール的な是非は一旦おいておいて、複数のChef Servervalidation.pem(chef-validatorの鍵)を共通化させたいときに、どうやったかというメモ。ちなみに、バージョン10系での話です。

イメージは、既に1台のChef-serverを運用していて、もう1台新しいChef-serverを足したいんだけど、nodeとなるサーバの運用フローを変えたくないので(面倒くさいので)、validation.pemは共通で使いたいなー、というケース。(これはユースケースによってメリット・デメリットがあります)


僕が探した感じ、APIではその口が用意されていなかった(というか、あるように見えてeditしてみたけど反映されなかった)ので、結論からいうとバックエンドのCouchDBにアクセスして書き換えた感じです。

説明はここまででいいような気もしますが、一応自分のために手順を残しておきます。(鍵は適当に書き換えております)


1. (既存)共通化したいchef-validatorの公開鍵を持っているChef-serverにて

まず、共通化したい(validation.pemが発行されている)chef-validatorの公開鍵があるchef-server(既存のサーバとかで、共有させたい鍵を持っている方)に対して、APIを介して、公開鍵を取得します。

from$ knife client show chef-validator
_rev:        1-05b1c3dd8fab1851bab19e3659544e82
admin:       false
chef_type:   client
json_class:  Chef::ApiClient
name:        chef-validator
public_key:  -----BEGIN PUBLIC KEY-----
             MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsNT0grepATYCo6xUDQJ4
             gBv3CmNKiFGNV0hoVRZD53XxE9UpECIsmVxDO/3og967qiEKeAXJryF4C1CmwD/l
             VKW9f/dBPA0XCujS3naX/9cKFU8qDz/W8vJwXZw89EAQJWXsFaHSClCF4eHBR490
             5FU2wBNgTmR4vEStnWA7FhujAysY2J7xASM2EbXfCjRk2IVICLsr2YzfHiW+GcfE
             EzonCuds+pUSArk3w2aOjESFYbatqkqjQfu/P48f+Dw1mOzTtArOepu126eS5GaC
             ua4UfOS2+0waa/drxdueJSX7Y6h/xZHnkQfOmmUUZCZAPDvCR/izBe/w/bLqMe2/
             KQIDAQAB
             -----END PUBLIC KEY-----

↑は、とりあえずお手軽に、knifeコマンドでリクエストしてみました。"public_key"ってのがそうですね。

knifeコマンド使える状態にセットアップしてないよー、って場合は、後述するような手順でにCouchDBに直接アクセスしてもよいです。


※もしくは、CouchDBにビルトインしているFuton(Web管理ユーティリティ)から確認する方法もあります。後述するパラメータの書き換えも、以下のWeb管理ユーティリティから出来ます。


2. (新規)↑で取得した公開鍵を設定したいChef-serverにて

次に、↑で取得したchef-validatorの公開鍵を設定するChef-server(新しいサーバとかで、鍵を共有させたい方)に対して、以下のオペレーションを行います。


to$ knife client show chef-validator
_rev:        10-9210a57a5358211c2d3962b64283729f
admin:       false
chef_type:   client
json_class:  Chef::ApiClient
name:        chef-validator
public_key:  -----BEGIN PUBLIC KEY-----
             MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCeJcVPnQbdRJFxjhtDJ
             XglQRL/3f/B7FSIWuSE7nMdo5dvx3UDhPlLuM6wPIndxGL+cMKwmdFNJLVc72k1o
             HPUzM8OdsshIETzCpJAs81I4VcNLI5iq3rt7i/EZkOKehC+T5yzgZGVy55/dcR9L
             ogtGK68lKFe9yNnHZEPlUilTMsHo6Xf72Vz8tHwwW+9T6qcaTYR3buVuYsFvW1K5
             xUUx2nwlAbrdM/GkBM//XZFIKpm292sI7+iwzz82C7KctfZLck4OrErMA4HQQ/wY
             rzxm6VO32lsjx2vE/uhNMWGBCged45inVds9WbXbG8sbL9thkss7+MzNJ/7PDPNb
             LQIDAQAB
             -----END PUBLIC KEY-----

まずは確認の意味で、このサーバで今設定されているchef-validatorの共通鍵を確認します。


to$ curl -X GET "http://127.0.0.1:5984/chef/_design/clients/_view/all_id" | grep chef-validator
{"id":"99483c11-599d-4b2c-bacb-73132e571673","key":"chef-validator","value":"chef-validator"},

次に、Chef-server上で、上記な感じでcurlコマンドでCouchDBにアクセスし、chef-validatorというClientの情報が入っている、ドキュメントIDを探します。

↑のサンプルでは、chef-validatorのclient情報が格納されているドキュメントIDは"99483c11-599d-4b2c-bacb-73132e571673"となります。


to$ curl -X GET http://127.0.0.1:5984/chef/99483c11-599d-4b2c-bacb-73132e571673 > client.txt

次に、↑のような感じで、さっき取得したドキュメントIDを使って、CouchDBにGETすることで、chef-validatorのclient情報を取得し、テキストファイル(client.txt)に落とします。

client.txtにはJSONフォーマットでデータが書かれているので、vim等で開いて、"public_key"の部分のValueを1.で取得したものに書き換えます。


to$ curl -X PUT -d @client.txt -H "Content-type: application/json" http://127.0.0.1:5984/chef/99483c11-599d-4b2c-bacb-73132e571673

書き換えが済んだらファイルを保存して、上記のコマンドでCouchDBにPUTして保存します。

ここまででオペレーションは完了です。


to$ knife client show chef-validator
_rev:        11-749ca30c2615a1a148c8ad9977050200
admin:       false
chef_type:   client
json_class:  Chef::ApiClient
name:        chef-validator
public_key:  -----BEGIN PUBLIC KEY-----
             MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsNT0grepATYCo6xUDQJ4
             gBv3CmNKiFGNV0hoVRZD53XxE9UpECIsmVxDO/3og967qiEKeAXJryF4C1CmwD/l
             VKW9f/dBPA0XCujS3naX/9cKFU8qDz/W8vJwXZw89EAQJWXsFaHSClCF4eHBR490
             5FU2wBNgTmR4vEStnWA7FhujAysY2J7xASM2EbXfCjRk2IVICLsr2YzfHiW+GcfE
             EzonCuds+pUSArk3w2aOjESFYbatqkqjQfu/P48f+Dw1mOzTtArOepu126eS5GaC
             ua4UfOS2+0waa/drxdueJSX7Y6h/xZHnkQfOmmUUZCZAPDvCR/izBe/w/bLqMe2/
             KQIDAQAB
             -----END PUBLIC KEY-----

knifeコマンドとかで確認すると、既存のchef-serverのchef-validatorの公開鍵の内容と同一のものになっていることが確認できるはずです。

一応、ここまでで、共有したい既存のvalidation.pemを使って動作確認してみましたが、問題なく動きいております。今のところ。

バージョン11系のChefでは、違うやり方があるかもしれませんが、もっとエレガントなやり方とかあれば教えてください!

それでは! =͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́


入門Chef Solo - Infrastructure as Code

入門Chef Solo - Infrastructure as Code

2013/05/07

「MySQL Casual Talks Vol.4」のエア参加レポート


少し前ですが4/17に、例によってガチュアルっぽいカジュアルトークが繰り広げられてると予想される「MySQL Casual Talks」の第4回目が開催されました。


駄菓子菓子!


忘れてた・・・(´・ω・`) ショボーン


過去3回とも参加しブログを書いていることもあって、ふとこんなtweetをしたのですが、、、


@氏に捕捉されてしまったため、贈り物のためにも頑張ってブログに起こしはじめております。


尚、過去3回分のまとめについては、以下をご覧ください。


と、ここまでは4/18あたりで書いていたのですが、、、なかなか登壇者の皆様の資料が揃わずアレやコレやしているうちに・・・

pingが来ていたので、ようやく(2週間たって)筆を動かし始めております。すいませんすいませんm(_"_)m


それでですね、僕は全く参加していないので、完全に「エアレポート」というか、レポートにもならないので、例によって当日の資料のまとめをさせていただきたく思います。(〃'∇'〃)ゝエヘヘ

※ 以下、敬称略、でございます。何か過不足があればご指摘くださいませ。


MySQL Casual Fukuoka の報告+α (@)

※資料が見当たらず・・・

代わりといっては何ですが、今回のMySQL Casualのイベントは、事前登録不要とした当日先着順受付方式にされていて、それに関する考察が、@氏のブログエントリに書かれているので、ご覧ください。

僕も、"「当日本当に行ける/行きたい人」が参加できる枠組みに変えたほうがいいよね"には +1 です。


SQLドリルの話(仮) (@)



SQLのSはStartのS 春からはじめようおじさんのSQL2週間体験日記 (@)



MySQL5.6 プロダクション投入 (@)


Index Shotgun (@)


MySQL-5.6で始める全文検索 〜InnoDB FTS編〜 (@)



mysqlenv 作った(仮) 〜第一部 ファントムブラッド〜 (@)


O/R Mapperの話 (@)


SQLがむずかしくて生きるのがつらい (@)


マスタn対スレーブ1レプリケーションの作り方 〜あれから〜 (@)



オラクルさん枠 (MySQLの中の人)

※資料が見当たらず・・・


参考リンク


エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド

エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド

SQLアンチパターン

SQLアンチパターン

2013/05/06

Software Design 2013年5月号

Software Design 2013/05号に寄稿しました


Software Design 2013年5月号の「IT業界ビギナーのためのお勧め書籍55冊+α」という特集内に寄稿させていただきました。

新卒のインフラエンジニア向けにオススメの書籍を紹介、といったリクエストだったので、Webサービスやシステムプラットフォームといったインフラ系のエンジニアを志す方向けに書いてみましたが、やっぱり僕は+αの1冊にも書きましたが、社会人になりたての方には「ナニワ金融道」をオススメしたい。

エンジニア道も大事で、こっちが雑誌の本筋なのですが、世の中の様々なお金云々のトラブルを回避するためにも、基礎的なお金まわりの法律やストーリーの知識は持っていても損はないと思います。コミックなのですごく読みやすく、反面教師の事例集として読んでいただきたいですw

(※もちろん、本筋で紹介した2冊もオススメなので、コチラも是非!)

Software Design 2013年5月号


ナニワ金融道(1) (講談社漫画文庫)

ナニワ金融道(1) (講談社漫画文庫)

2013/05/03

日経コンピュータ 2013年4月18日号

日経コンピュータの取材を受けました


ちょっと前の話なのですが、2013/04/18号の日経コンピュータの「さあ、運用を変えよう」の特集に関して、取材を受けました。

今やってる取り組みに基づいた話をしたのですが、やるからには、と「希望的観測」を伝えたところ、完全にそうなる「予定」という事実になってしまったので、頑張りますw

尚、完全に余談ですが、今回の取材は中田さん(@)に来ていただいて、久しぶりにお会いしてお話したのですが、流石というかこちらが教えていただくことも多く、最新動向について非常に勉強になりました。ありがとうございました。


日経コンピュータ 2013/04/18


参考リンク


オススメ (一部は、最近読んでいる本とも言う)
Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus) クラウド Amazon EC2/S3のすべて~実践者から学ぶ設計/構築/運用ノウハウ~ [Web開発者のための]大規模サービス技術入門 ―データ構造、メモリ、OS、DB、サーバ/インフラ (WEB+DB PRESS plusシリーズ) エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド [24時間365日] サーバ/インフラを支える技術 ~スケーラビリティ、ハイパフォーマンス、省力運用 Linux-DB システム構築/運用入門 (DB Magazine SELECTION) キャパシティプランニング ― リソースを最大限に活かすサイト分析・予測・配置 スケーラブルWebサイト 実践ハイパフォーマンスMySQL 第3版 ウェブオペレーション ―サイト運用管理の実践テクニック (THEORY/IN/PRACTICE) SQLアンチパターン インターネットのカタチ―もろさが織り成す粘り強い世界― ハイパフォーマンス ブラウザネットワーキング ―ネットワークアプリケーションのためのパフォーマンス最適化 Linuxの教科書―ホントに読んでほしいroot入門講座 (IDGムックシリーズ)