Firefox/Chromeは同一URLに対して同時に1つしかリクエストを発行しない
#golang net/http Handler実行中に更なるリクエストが同じHandlerを起動することはできない?
— Kaito Udagawa (@umireon) 2016, 1月 7
— Kaito Udagawa (@umireon) 2016, 1月 7
@umireon 同一URLに対するリクエストは同時に1つしか発行しないようだ.極めて合理的で,GETリクエストで同期をとるなどといったばかげたAPIを作成するのでなければ問題にはならなそうだ.(ひっかかった)
— Kaito Udagawa (@umireon) 2016, 1月 7
やりたかったこと
発生した問題
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を提出した.
今日考えたこと 12/31
Apache2 with Chef
Opscode Cookbookのhttpdは,ApacheのVirtual Hostを扱うことができない.Virtual Hostを扱いたい場合は,apache2を使えばよい.
Ubuntu on Fedora in LXC
FedoraのSelinuxが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で待ち受け,ApacheはSSLで待ち受ける構成にする.このとき,次のような設定を行うと,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は,次に示す箇所から取得することが可能である.
また,Client Keyは,次に示す箇所から取得することが可能である.
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
で削除することができる.