かげログ.

なにかんがえてるの @umireon

Firefox/Chromeは同一URLに対して同時に1つしかリクエストを発行しない

やりたかったこと

  1. HTTPで複数のデバイスを同期したい
  2. 同期操作が行われるまでレスポンスを返さないハンドラで実現
  3. Firefoxで同期してるかチェック

発生した問題

1つめのリクエストが完了してから2つめのリクエストが送出され,レスポンス受信が同期しない

原因

Firefoxが同一URLに対して同時に1つまでしかリクエストを発行しない. Chromeも同一の挙動を示す.なぜかSafariは普通に複数同時に発行する.

対策

こういう変なAPIを実装するときは,横着せずちゃんとクライアント作る.

今日考えたこと 1/3

Serverspec with test-kitchen

本節では,Serverspecによるインフラテスティングを,test-kitchenに適用する方法について説明する.より具体的には,test verifyコマンドの実行により,Serverspecで記載されたテストにしたがい,サンドボックス環境の検証が行われることを目標とする.test-kitchenでは,例えばdefaultレシピに対するserverspecによるテストコードは,test/integration/default/serverspec以下に格納することとなっている.まず,serverspec全体に対する設定を記述する,spec_helper.rbを同ディレクトリに作成する.次に,spec_helper.rbの内容を示す.

require 'serverspec'
set :backend, :exec

また,テスト本体は,同ディレクトリの*_spec.rbに書くことになっている.ここでは例として,chef-clientが起動しているかを確かめる,chef-client_spec.rbを作成する.次に,chef-client_spec.rbの内容を示す.

require 'spec_helper'
describe service('chef-client') do
  it { should be_running }
end

以上のファイルを作成し,cookbookのルートでkitchen verifyコマンドを発行することによって,テストを実行することができる.次に,test-kitchenによるインフラテストの成功例を示す.

$ kitchen verify
-----> Starting Kitchen (v1.2.1)
-----> Verifying <default-ubuntu-1404>...
       Removing /tmp/busser/suites/serverspec
Uploading /tmp/busser/suites/serverspec/chef-clinet_spec.rb (mode=0644)
Uploading /tmp/busser/suites/serverspec/spec_helper.rb (mode=0644)
-----> Running serverspec test suite
/opt/chef/embedded/bin/ruby -I/tmp/busser/suites/serverspec -I/tmp/busser/gems/gems/rspec-support-3.1.2/lib:/tmp/busser/gems/gems/rspec-core-3.1.7/lib /opt/chef/embedded/bin/rspec --pattern /tmp/busser/suites/serverspec/\*\*/\*_spec.rb --color --format documentation --default-path /tmp/busser/suites/serverspec

Service "chef-client"
  should be running

Finished in 0.16682 seconds (files took 0.36192 seconds to load)
1 example, 0 failures
       Finished verifying <default-ubuntu-1404> (0m3.31s).
-----> Verifying <default-centos-66>...
       Removing /tmp/busser/suites/serverspec
       Uploading /tmp/busser/suites/serverspec/chef-clinet_spec.rb (mode=0644)
       Uploading /tmp/busser/suites/serverspec/spec_helper.rb (mode=0644)
-----> Running serverspec test suite
       /opt/chef/embedded/bin/ruby -I/tmp/busser/suites/serverspec -I/tmp/busser/gems/gems/rspec-support-3.1.2/lib:/tmp/busser/gems/gems/rspec-core-3.1.7/lib /opt/chef/embedded/bin/rspec --pattern /tmp/busser/suites/serverspec/\*\*/\*_spec.rb --color --format documentation --default-path /tmp/busser/suites/serverspec

       Service "chef-client"
         should be running

       Finished in 0.15175 seconds (files took 0.37437 seconds to load)
       1 example, 0 failures
       Finished verifying <default-centos-66> (0m3.77s).
-----> Kitchen is finished. (0m8.07s)

easy-rsa 3 で使い捨てキーを生成する

easy-rsaを使用すると,簡単にSSL自己証明書を作成することができる.次に,wwwに対する証明書を生成するために必要なコマンドを示す.

$ git https://github.com/OpenVPN/easy-rsa.git
$ cd easy-rsa/easyrsa3
$ ./easyrsa init-pki
$ ./easyrsa build-ca nopass
$ ./easyrsa build-server-full www nopass

以上のコマンドにより,easy-rsa/easyrsa3/pki以下に公開鍵認証基盤が作成され,各種キーが格納される.CA証明書はeasy-rsa/easyrsa3/pki/ca.crt,wwwのサーバ証明書easy-rsa/easyrsa3/pki/issued/www.crt,wwwの秘密鍵easy-rsa/easyrsa3/pki/private/www.keyに格納される.

今日考えたこと 1/2

berkshelf-api-server cookbook #172

Cookbook metadata should not depend on the berkshelf gem by umireon · Pull Request #172 · berkshelf/berkshelf-api · GitHub berkshelf-api-server#172が解決した.rbenv下のrubyにchef関連のgemを入れていたのが原因だった.chef execを使用するか,gemを削除するかで解決した.

今日考えたこと 1/1

berkshelf-api-server cookbook

test-kitchenで試そうとしたところ,バグでchef-clientごと落ちた.原因を特定してPull Requestを提出した.

Cookbook metadata should not depend on the berkshelf gem by umireon · Pull Request #172 · berkshelf/berkshelf-api · GitHub

今日考えたこと 12/31

Apache2 with Chef

Opscode Cookbookのhttpdは,ApacheのVirtual Hostを扱うことができない.Virtual Hostを扱いたい場合は,apache2を使えばよい.

Ubuntu on Fedora in LXC

FedoraSelinuxがLXC内のUbuntuに干渉している.

$ sudo apt-get install libidn11
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  libidn11
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
3 個のパッケージが完全にインストールまたは削除されていません。
93.0 kB 中 0 B のアーカイブを取得する必要があります。
この操作後に追加で 376 kB のディスク容量が消費されます。
dpkg: error processing archive /var/cache/apt/archives/libidn11_1.28-1ubuntu2_amd64.deb (--unpack):
 セキュリティラベルのハンドルを得られません: No such file or directory
処理中にエラーが発生しました:
 /var/cache/apt/archives/libidn11_1.28-1ubuntu2_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

UbuntuはAppArmorを使っているので,Selinuxのポリシーを持たない.selinux-policy-defaultをインストールすることで抑制できる.knife bootstrapの実行結果を次に示す.

$ knife bootstrap www.umireon.info --sudo -x umireon
Connecting to www.umireon.info
www.umireon.info knife sudo password:
Enter your password:
www.umireon.info
www.umireon.info Installing Chef Client...
www.umireon.info bash: /dev/fd/63: No such file or directory
www.umireon.info --2014-12-31 07:25:54--  https://www.opscode.com/chef/install.sh
www.umireon.info Resolving www.opscode.com (www.opscode.com)... Starting first Chef Client run...
www.umireon.info bash: line 136: chef-client: command not found

bashのプロセス置換機能が機能していない.次のコマンドで,/def/fdを修正する.

ln -s /proc/self/fd /dev/fd

Reverse Proxy For Jenkins

Jenkinsの前段にApache2.4のリバースプロキシを配置することを考える.JenkinsはHTTPで待ち受け,ApacheSSLで待ち受ける構成にする.このとき,次のような設定を行うと,Jenkinsは,リバースプロキシに対して警告を出さなくなる.

ProxyPass /jenkins http://jenkins.umireon.info:8080/jenkins nocanon
ProxyPassReverse /jenkins http://jenkins.umireon.info:8080/jenkins
AllowEncodedSlashes NoDecode

RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"
ProxyPreserveHost On

<Location /jenkins>
    Require all granted
</Location>

今日考えたこと 12/30

Chef Validator Key

Chef Serverに新しいクライアントを登録する際には,Client Key (USER.pem)とValidation Key (ORGANIZATION-validator.pem)が必要である.Validation Keyは,新規クライアントの登録のみに使用できる秘密鍵である[1].Chef Serverにクライアントを登録すると,同クライアント専用の秘密鍵 (Client Key) が与えられるので,Validation Keyも不要となる.登録後にValidatior Keyがクライアントに残っていると,クライアントにアクセス可能なユーザが,任意のホストをChef Serverに登録することができてしまう[2].したがって,Validation Keyは,初回の収束実行時に削除することが推奨される.Validation Keyは,recipe[chef-client::delete_validation]の実行によって削除することができる.

Berkshelf Upload

Berkshelfからcookbookのアップロードをするために,knifeの設定を行う.knifeの設定は,knife configureコマンドの質問に答えることで行うことができる.次に,knife configureの実行例を示す.

$ knife configure
WARNING: No knife configuration file found
Where should I put the config file? [/Users/USER/.chef/knife.rb]
Please enter the chef server URL: [https://localhost:443] https://chef-0.example.org/organizations/ORGANIZATION
Please enter an existing username or clientname for the API: [USER]
Please enter the validation clientname: [chef-validator] ORGANIZATION-validator
Please enter the location of the validation key: [/etc/chef-server/chef-validator.pem] /Users/USER/.chef/ORGANIZATION-validator.pem
Please enter the path to a chef repository (or leave blank):
*****

You must place your client key in:
  /Users/USER/.chef/USER.pem
Before running commands with Knife!

*****

You must place your validation key in:
  /Users/umireon/.chef/ORGANIZATION-validator.pem
Before generating instance data with Knife!

*****
Configuration file written to /Users/USER/.chef/knife.rb

実行結果で指示されているとおり,Client KeyとValidation Keyを/Users/USER/.chefに配置することが必要である.Validation Keyは,次に示す箇所から取得することが可能である.

f:id:umireon:20141230151110p:plain

また,Client Keyは,次に示す箇所から取得することが可能である.

f:id:umireon:20141230151108p:plain

knifeの設定を完了したら,次のようなコマンドでChef Serverにクックブックをアップロードすることができる.

$ berks install
$ berks upload

Chef Serverには,デフォルトで自己証明書が設定される.証明書を正当なものに設定していない場合は,次のようなエラーが得られる.

$ berks upload
E, [2014-12-30T15:53:28.305228 #44034] ERROR -- : Ridley::Errors::ClientError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
...
There was an error connecting to the Chef Server

この場合,berkshelfのSSL検証を無効化することによって,エラーを回避することができる.SSL検証を無効化するためには,~/.berkshelf/config.jsonに次のような設定を行えばよい[3].

{
    "ssl": {
        "verify": false
    }
}

Chef Server Organizationの削除

Chef ServerのOrganizationは,chef-server-ctl org-remove ORGANIZATIONで削除することができる.

参考

  1. https://docs.chef.io/chef_private_keys.html
  2. http://stackoverflow.com/questions/19462252/chef-chef-validator-pem-security
  3. http://berkshelf.com