本文へジャンプします。

ニフティクラウド ユーザーガイド

Automation:アプリへデータを渡す

カスタムJSONを利用してコマンドJSONにデータを含ませるうと、サーバーにデプロイされたアプリケーションに「キー・値」のペアのようなデータを渡すことができます。

レシピからはChefの属性(attributes)を利用してカスタムJSONに指定されたデータにアクセスすることができますが、デプロイされたアプリケーションからはChefの属性にアクセスすることはできません。

そのため、カスタムJSONのデータをアプリへ渡す場合は、カスタムレシピを作成し、カスタムJSONからデータを取り出してアプリケーションが読み込める形式のファイルとして書き出す方法を用います。

今回の例では、データをYAML形式のファイルに書き出していますが、JSONなどほかの形式で書き出すことも可能です。

カスタムJSONをコマンドJSONに追加

「キー・値」のデータをスタック内のサーバーに渡すには、下記のようなカスタムJSONをコマンドJSONに追加します。手順は下記ページをご確認ください。

今回は、「app1、app2」という短縮名を持つ2つのアプリが存在し、それぞれが3つの設定値を持っている場合を例とします。
このJSONに対応するレシピでは、アプリの短縮名を利用して関連するデータを取得します。

{
  "my_app_data": {
    "app1": {
      "key1": "value1",
      "key2": "value2",
      "key3": "value3"
    },
    "app2": {
      "key1": "value1",
      "key2": "value2",
      "key3": "value3"
    }
  }
}

下記のレシピは、コマンドJSONからそれぞれのアプリのデータを取り出し、.ymlファイルとして書き出す方法を示しています。
下記のレシピではカスタムJSONがそれぞれのアプリについてのデータを保持していることを想定します。

コマンドJSONにはdeployというキーが存在し、その値はキーがアプリ短縮名で値がアプリ情報を含むオブジェクトになっています。
アプリ情報にはさまざまな内容が含まれますが、今回の例では、[:deploy][:app_short_name][:deploy_to]でアプリをデプロイするディレクトリを参照しています。

下記のレシピは、deployキー内のそれぞれのアプリについて下記の処理を行います。

  • アプリの[:deploy_to]ディレクトリ配下のshared/configディレクトリに、app_data.ymlという名前のファイルを作成する。
  • アプリのカスタムJSONをYAMLに変換し、YAML形式のテキストをapp_data.ymlに書き出す。
node[:deploy].each do |app, deploy|
  file File.join(deploy[:deploy_to], 'shared', 'config', 'app_data.yml') do
    content YAML.dump(node[:my_app_data][app].to_hash)
  end
end

アプリへデータを渡す手順

スタックにアプリを追加します。手順は下記ページでご確認ください。
アプリの短縮名をメモしておいてください。

コマンドJSONへデータを反映させるため、カスタムJSONにアプリのデータを追加します。手順は下記ページでご確認ください。

Cookbooksを作成し、以前の例に上記の例のようなレシピを追加します。必要に応じて、カスタムJSONに設定した属性名へ変更を行ってください。

  • ※すでに、スタックにカスタムCookbooksが設定されている場合は、「既存のCookbooksにレシピを追加」や、「既存のDeploy用レシピにコードを追加」でも問題ありません。

スタックにcookbookをインストールします。手順は下記ページでご確認ください。

レシピをアプリレイヤーのDeployライフサイクルイベントに割り当てます。
これにより、サーバーが起動される度にこのレシピを実行するようになります。手順は下記ページでご確認ください。

アプリをデプロイし、カスタムJSONに設定したデータをコマンドJSONに反映します。

  • ※データを含むファイルが、アプリのデプロイ前に存在している必要がある場合は、サーバー起動後に1度だけ実行されるSetupライフサイクルイベントにレシピを割り当てください。 ただし、デプロイ用のディレクトリが作成されていない状態なので、レシピの中でデータファイルを作成する前に、明示的にディレクトリを作成しておく必要があります。
    アプリのデータはカスタムJSONを更新することによっていつでも更新することができます。
アプリの/shared/configディレクトリを作成し、そのディレクトリの中にデータを含む例
node[:deploy].each do |app, deploy|

 directory "#{deploy[:deploy_to]}/shared/config" do
      owner "deploy"
      group "www-data"
      mode 0774
      recursive true
      action :create
    end

  file File.join(deploy[:deploy_to], 'shared', 'config', 'app_data.yml') do
    content YAML.dump(node[:my_app_data][app].to_hash)
  end
end
Sinatraのアプリから書きだされたデータファイルを読み込む例
#!/usr/bin/env ruby
# encoding: UTF-8
require 'sinatra'
require 'yaml'

get '/' do
  YAML.load(File.read(File.join('..', '..', 'shared', 'config', 'app_data.yml')))
End

アプリのデータ更新手順

カスタムJSONを編集して必要なデータの更新を行います。

アプリを再デプロイして、スタック内のサーバーでDeployレシピを実行します。
レシピは更新されたコマンドJSONを利用するので、レシピによって作成されるファイルも最新の状態に更新されます。

推奨画面サイズ 1024×768 以上