fbpx

[和訳] プライベートSupermarketサーバを立ててみよう #getchef

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

本稿は Setting Up Your Private Supermarket Server (2015/04/21) の和訳です。

本稿(訳注:原文)は以前の投稿である Getting started with oc-id and Supermarket (2014/08/29) の更新版です。

Chef Server 12は、id.chef.ioで使っているOAuth2サービスである、oc-idを同梱しています。Chef Server 12にアップグレードした後、Chefユーザはファイアウォールの背後で独自のSupermarketサービスを実行できるようになります。

Chef Serverにoc-idを設定する

以降の手順を行うには、Chef ServerにSSH経由でログインし、管理者権限にならなければいけません。

  1. /etc/opscode/chef-server.rb設定ファイルに次を追加します。

    oc_id['applications'] = {
    'supermarket' => {
    'redirect_uri' => 'https://supermarket.mycompany.com/auth/chef_oauth2/callback'
    }
    }
  2. chef-server-ctl reconfigureを実行します。
  3. reconfigureの後、/etc/opscode/oc-id-applications/supermarket.jsonにOAuth2データが書き出されます。

    {
    "name": "supermarket",
    "uid": "0bad0f2eb04e935718e081fb71e3b7bb47dc3681c81acb9968a8e1e32451d08b",
    "secret": "17cf1141cc971a10ce307611beda7f4dc6633bb54f1bc98d9f9ca76b9b127879",
    "redirect_uri": "https://supermarket.mycompany.com/auth/chef_oauth2/callback"
    }

このファイルのuidsecretの値が次の段階で必要になることに注意してください。

chef-server.rb設定ファイルに多数のoc-idアプリケーションを追加すると、アプリケーションごとに1ファイルずつOAuth2データのファイルを作成します。

Test Kitchen内でプライベートSupermarketサーバを実行する

注意: ここではソースからSupermarketをインストールするので、コミュニティのSupermarket Cookbookを使いません。代わりにOmnibusパッケージをインストールします。

「ドキュメントとしてのコード」の精神に則り、テスト用Supermarket Omnibusパッケージのための単純なCookbookとtest-kitchen設定を提供します。これらのパッケージは https://packagecloud.io/chef/stable からダウンロードします。

  1. https://github.com/irvingpop/supermarket-omnibus-cookbookからコピーをダウンロードします。

    git clone https://github.com/irvingpop/supermarket-omnibus-cookbook.git supermarket-omnibus-cookbook
    cd supermarket-omnibus-cookbook
  2. .kitchen.local.ymlファイルを作成し、先の手順で取得したoc-id attributeを設定します。

    ---
    suites:
    - name: default
    run_list:
    - recipe[supermarket-omnibus-cookbook::default]
    attributes:
    supermarket_omnibus:
    chef_server_url: https://chefserver.mycompany.com
    chef_oauth2_url: https://chefserver.mycompany.com
    chef_oauth2_app_id: 0bad0f2eb04e935718e081fb71e3b7bb47dc3681c81acb9968a8e1e32451d08b
    chef_oauth2_secret: 17cf1141cc971a10ce307611beda7f4dc6633bb54f1bc98d9f9ca76b9b127879
    chef_oauth2_verify_ssl: false

    (訳注: 「chef_oauth2_url」を追加してください。参考: "Sign in with your chef account" redirects to https://id.opscode.com/... instead of local Chef Server)
  3. /etc/hosts ファイルにマシン名を自動的に追加するvagrant-hostsupdaterプラグインをインストールします。ホスト名を気にするoauth2にとって重要です。oc-id設定のredirect_uriに設定する値はこの名前を反映しています。

    vagrant plugin install vagrant-hostsupdater
  4. Supermarketインスタンスを起動してテストします。

    kitchen converge default-centos-66 && kitchen verify default-centos-66
  5. Supermarketサーバ https://default-centos-66 にChefユーザとしてログインします。
  6. ログインできたら、次のような画面になります。
    oc-id5-1024x343

最初のCookbookをSupermarketにアップロードする

  1. knife-supermarket Gemをインストールします。ChefDKなら次のようになります。

    chef gem install knife-supermarket
  2. knife.rbファイルに、Supermarketサーバの設定を追加します。

    knife[:supermarket_site] = 'https://default-centos-66'
  3. SSLエラーを解決するため、SupermarketサーバのSSL証明書を取得して検証します。

    knife ssl fetch https://default-centos-66
    knife ssl check https://default-centos-66
  4. CookbookをSupermarketにアップロードします。

    knife supermarket share mycookbook "Other"

本番環境でSupermarketを実行する

Supermarketはまだ初期段階にあるので、Chef社公式サポートやHA、バックアップツールなどを持っていません。それでもChef社の主要な顧客のいくつかは、自己責任において、本番環境でSupermarketを実行しています。

通常、必要なだけ簡単に増やせるような、小さなVMから始めることを推奨しています。別のディスクに置いた/var/opt/supermarketディレクトリや、拡張可能なLVMに置いておきます。

Cookbook Attributeをラップする

SupermarketをデプロイするRecipeに対して、Roleと使うラッパーCookbookの使用を推奨しています。

node['supermarket_omnibus']以下のすべてのキーは/etc/supermarket/supermarket.jsonに出力されます。supermarket Omnibusパッケージで指定されているデフォルト値を上書きするように追加することができます。


default['supermarket_omnibus']['chef_server_url'] = 'https://chefserver.mycompany.com'
default['supermarket_omnibus']['chef_oauth2_app_id'] = '14dfcf186221781cff51eedd5ac1616'
default['supermarket_omnibus']['chef_oauth2_secret'] = 'a49402219627cfa6318d58b13e90aca'
default['supermarket_omnibus']['chef_oauth2_verify_ssl'] = false

システムのスケーリング

Supermarketは、PostgreSQLバックエンドのRuby on Railsアプリで、一般的なRoRスケーリングルールを適用しています。もしSupermarketをスケールアウトやHAモードで動作させたいなら、独自のバックエンドコンポーネントを作って行うことができます。

  • データベース: 別のPostgreSQL 9.3以上のサーバ(またはHAペア)を作ります。pgpsqlpg_trgmのPostgreSQLエクステンションをインストールして読み込まなければならないことに注意してください。
  • Cookbookストレージ: Cookbook tarボールはデフォルトでは/var/opt/supermarket/dataに格納されます。これをAmazon S3 (推奨)かS3互換サービスに変更できます。もし選択肢になくても、例えばNFSのような共有ストレージに対するディレクトリへシンボリックリンクを張ることができますが、競合状態に関する完全なテストを行っていません。
  • (オプション)キャッシングサービス: SupermarketはキャッシングサービスにRedisを使っています。Supermarketアプリサーバごとに1つのRedisインスタンスを安全に実行できますし、Redis 2.8以上のサーバやHAペアで実行することもできます。

トラブルシューティングとFAQ

正しくないリダイレクトURL

oc-idに指定されているリダイレクトURLは、Supermarketサーバのホスト名と一致しなければいけません。また、URIを正しく(/auth/chef_oauth2/callback)取得できなければいけません。もしそうなっていなければ、次のようなエラーメッセージを受け取ります。


The redirect uri included is not valid.

Supermarketサーバがoc-idに到達できず、ログイン中に500エラーを投げる

Supermarketサーバは、OAuth2ネゴシエーションを行っている最中、https経由で指定したchef_server_urlに到達できなければいけません。名前解決やファイアウォールルールによる、もっともよくある問題です。

Supermarketのコードはどこにありますか?

  • Supermarketのrailsアプリケーションはこちらです。

    • すべてのSupermarketの問題はこちらに報告されます。
  • SupermarketをOmnibusパッケージにビルドするためのコードはこちらです。

    • supermarket-ctl reconfigureの実行中に使うCookbookはこちらです。
    • こちらに従って、独自のOmnibusパッケージをビルドできます。

railsアプリケーションのデバグログを有効にするにはどうすればいいですか?

railsのメッセージが記録されないことはSupermarket Omnibusパッケージの既知の問題です。修正するには、現時点では手動操作が必要です。Supermarketサーバの/opt/supermarket/embedded/service/supermarket/config/environments/production.rbファイルの46行目の「config.log_level = :warn」を次のように修正します。


config.logger = Logger.new('/var/log/supermarket/rails/rails.log')
config.logger.level = 'DEBUG'
config.log_level = :debug

そしてsupermarket-ctl restart railsを実行してrailsサービスを再起動します。

プロキシの背後にいるので、packagecloudへの接続が失敗する

心配いりません! .kitchenl.local.ymlファイルに次のように追加します。


provisioner:
name: chef_zero
solo_rb:
http_proxy: http://192.168.1.1
https_proxy: http://192.168.2.2

Chef Omnibus Clientパッケージを毎回ダウンロード・インストールしなければいけないので、Test Kitchenが遅い

高速化のためのヒントです。

  • .kitchenl.local.ymlファイルに次を追加して、test-kitchenにOmnibusインストーラをキャッシュするように伝えます。

    provisioner:
    name: chef_zero
    chef_omnibus_install_options: -d /tmp/vagrant-cache/vagrant_omnibus
  • vagrant-cachierプラグインを使って、packagecloudのようにyum repoをキャッシュします。まずvagrant plugin install vagrant-cachierを実行し、次のように$VAGRANT_HOME/Vagrantfileを作成します。

    Vagrant.configure("2") do |config|
    config.vm.box = 'some-box'
    if Vagrant.has_plugin?("vagrant-cachier")
    config.cache.scope = :box
    config.cache.enable :chef
    config.cache.enable :apt
    config.cache.enable :yum
    config.cache.enable :gem
    end
    end
新規CTA