私はあなたの集合的な知恵を求めに来ました。
私の目標、概要: さまざまなクライアントのコンピューターをより適切に管理するために、Puppet のDashboardを拡張しようとしています。これは Rails 2 アプリケーションであり、私が書いている Rails 3 アプリケーションで拡張しようとしています。ダッシュボードが私のニーズに完全ではないいくつかの問題がありますが、解決策は簡単です。この質問への答えが残りを理解するのに役立つと思うので、1 つに焦点を当てます。私はメンテナーではなく、将来混乱させたくないので、ダッシュボードのコードをまったく変更しないソリューションを検討してきました。
どうすればこれが一番うまくいくのか、いろいろ考えました。データベースに直接プラグインすることを考えましたが、少しグーグルした後、足が冷えました。2 番目のデータベース接続を設定することはそれほど難しくないようです。私が気に入らないのは、実行中に別のアプリケーションのデータベースを変更することです。迷信に基づいた完全に合理的な選択肢を見逃している場合は、何か言ってください。
他にもいくつかのアイデアがありましたが、最終的に着手し、わずかに成功したのは、REST を介して Dashboard のデータベースにアクセスすることでした。組み込まれているのに、なぜ使わないのですか?いくつかのテーブルは操作できましたが、必要なテーブルは操作できませんでした。したがって、この状況で注意すべき 3 つの表があります。
- ノード (基本的にはコンピューター)
- node_groups (コンピューターを配置できるグループ)
- node_group_memberships (1 と 2 を関連付ける結合テーブル)
両方のノードと node_groups を追加および削除できますが、2 つの間の接続も作成できるようにしたいと考えています。新しいユーザーを作成するために、次のような ActiveResource モデルをセットアップしました。
class PuppetNode < ActiveResource::Base
self.site = "http://127.0.0.1:4000/"
self.element_name = "node"
attr_accessor :grouped
end
その後、新しいノードを作成したり、コンソールを介してノード テーブルから情報を取得したりできます。次のようになります。
PuppetNode.create(:column_name => "and so on")
同じことが node_groups にも当てはまり、node_group_memberships をウィッグアウトしない Rails 3 モデルを作成することもできますが、そのテーブルには何も作成できません。Rails 2 の node_group_membership コントローラー (Puppet Labs の優秀な人による) を見ると、create メソッドがあることがわかります。
class NodeGroupMembershipsController < InheritedResources::Base
respond_to :json
before_filter :raise_if_enable_read_only_mode, :only => [:new, :edit, :create, :update, :destroy]
before_filter :standardize_post_data, :only => [:create]
def create
create! do |success, failure|
success.json { render :text => @node_group_membership.to_json, :content_type => 'application/json', :status => 201 }
failure.json { render :text => {}.to_json, :content_type => 'application/json', :status => 422 }
end
end
# we want: {node_group_membership => {node_id => <id>, node_group_id => <id>}
# allow and convert: {node_name => <name>, group_name => <name>}
def standardize_post_data
unless params[:node_group_membership]
params[:node_group_membership] = {}
node = Node.find_by_name(params[:node_name])
group = NodeGroup.find_by_name(params[:group_name])
params[:node_group_membership][:node_id] = (node && node.id)
params[:node_group_membership][:node_group_id] = (group && group.id)
end
end
end
しかし、何らかの理由で、このようなものとの関連付けを作成しようとするたびに窒息します
irb(main):005:0> PuppetNodeGroupMembership.create(:node_id => 20, :node_group_id => 5)
=> #<PuppetNodeGroupMembership:0x007fb3150af878 @attributes={"node_id"=>20, "node_group_id"=>5}, @prefix_options={}, @persisted=false, @remote_errors=#<ActiveResource::ResourceInvalid: Failed. Response code = 422. Response message = .>, @validation_context=nil, @errors=#<ActiveResource::Errors:0x007fb3150af4e0 @base=#<PuppetNodeGroupMembership:0x007fb3150af878 ...>, @messages={}>>
どんなアドバイスでも大歓迎です.私はすでにそれを理解しようとして8時間の惨めな時間を費やしています. ありがとう!