3

データベース構成ファイルを作成するだけのシェフのレシピを書いていますが、属性にアクセスするだけで困惑しています。私はいくつかの PHP アプリケーションを各インスタンスにデプロイしており、OpsWorks は全員に同じレシピを使用しているため、属性ファイルにはいくつかの異なる設定があります。

属性/データベース設定.rb

# API
default[:api][:path]      = 'app/config/database.php';
default[:api][:host]      = 'test';
default[:api][:database]  = 'test';
default[:api][:username]  = 'test';
default[:api][:password]  = 'test';

レシピ/データベース設定.rb

Chef::Log.info("Database settings!");

node[:deploy].each do |application, deploy|

    if node.has_key?(application)
        Chef::Log.info("Application: #{application}");

        path = node["api"]["path"]; # ERROR HAPPENING HERE
        Chef::Log.info("Path: #{path}");

        template path do
            source "database.erb"
            mode 0440
            variables({
               :host     => node["api"]["host"],
               :database => node["api"]["database"],
               :username => node["api"]["username"],
               :password => node["api"]["password"]
            })
        end

    end

end

私が得ているエラーはですno implicit conversion of String into Integer。考えられるあらゆる方法で設定を作成してアクセスしようとしました...

node[:api][:path] # no implicit conversion of Symbol into Integer
node['api']['path'] # no implicit conversion of String into Integer
node[:api].path # undefined method `path' for #<Chef::Node::ImmutableArray:0x007fa4a71086e8>
node[application][:path] # no implicit conversion of Symbol into Integer

ここで私が間違っていることは明らかですが、考えられることはすべて試しましたが、これを機能させる方法が見つからないようです?! 理想的には、可能な場合は変数を使用したいのですが"api"、if/else を使用しても 3 つのアプリではそれほどひどいことにはなりません...

4

3 に答える 3

3

わかりましたので、問題は実際には構成に間違ってアクセスしていたということではなく、さまざまな属性ファイルがすべて単一の構成にマージされていたため、これに気づきませんでした。私はこれらの設定ファイルを持っていました...

attributes/database_settings.rb

default[:api][:path] = 'app/config/database.php';
default[:api][:username] = 'example';

属性/書き込み可能なディレクトリ.rb

default[:api] = ['public/uploads', 'storage/cache'];

アクセスしようとしたdefault[:api][:path]とき、データベース設定の属性を上書きしているように見えたときに、実際にはディレクトリの配列にアクセスしていました。これらをdefault[:directories][:api]and default[:database][:api][:path]etc に移動すると、これが修正されました。

于 2014-04-22T15:03:48.593 に答える