フォアマン - マッチはすでに取られています

フォアマン - マッチはすでに取られています

フォアマン バージョン 1.6.3

ホストの 1 つを編集してホストグループを変更しようとすると、次のエラーが発生します。

ActiveRecord::RecordInvalid
Validation failed: Match has already been taken
app/models/concerns/host_common.rb:48:in `block in lookup_values_attributes='
app/models/concerns/host_common.rb:41:in `each_value'
app/models/concerns/host_common.rb:41:in `lookup_values_attributes='
app/controllers/hosts_controller.rb:113:in `block in update'
app/models/taxonomy.rb:52:in `block in no_taxonomy_scope'
app/models/taxonomy.rb:59:in `block (2 levels) in as_taxonomy'
app/models/concerns/foreman/thread_session.rb:148:in `as_location'
app/models/taxonomy.rb:58:in `block in as_taxonomy'
app/models/concerns/foreman/thread_session.rb:113:in `as_org'
app/models/taxonomy.rb:57:in `as_taxonomy'
app/models/taxonomy.rb:51:in `no_taxonomy_scope'
app/controllers/hosts_controller.rb:105:in `update'
app/models/concerns/foreman/thread_session.rb:33:in `clear_thread'
lib/middleware/catch_json_parse_errors.rb:9:in `call' 

制作ログ:

Started PUT "/hosts/puppet-app01" for 10.10.10.24 at 2015-03-05 11:51:32 +0100
Processing by HostsController#update as */*
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"/IYvSEW5JWu2dasdadL1Z/6fpjeMLojOFc0I+BIfY=", "host"=>{"name"=>"puppet-app01", "hostgroup_id"=>"", "environment_id"=>"7", "puppet_ca_proxy_id"=>"1", "puppet_proxy_id"=>"2", "config_group_ids"=>[""], "puppetclass_ids"=>["", "339", "293", "348", "349"], "managed"=>"f", "progress_report_id"=>"[FILTERED]", "lookup_values_attributes"=>"[FILTERED]", "is_owned_by"=>"5-Users", "enabled"=>"1", "comment"=>"", "overwrite"=>"false"}, "id"=>"puppet-app01"}
Operation FAILED: Validation failed: Match has already been taken
  Rendered common/500.html.erb (3.7ms)
Completed 500 Internal Server Error in 25ms (Views: 4.3ms | ActiveRecord: 3.5ms)

このホスト上のパラメータを編集しようとするたびに、同じエラーが発生します。クラスを割り当てて、このホストから削除した後に、このエラーが発生し始めました。

これは私の実稼働環境であり、できるだけ早く修正する必要があります。

何か案は?

答え1

今では、私の質問がまったく馬鹿げたことではなく、jmp242 のコメントが単なる馬鹿げた回避策の提案に過ぎなかったと確信しています。気を悪くしないでください! :P とにかく、それは私の責任でしたが、Foreman Web インターフェイスの奇妙な動作が原因でした。

2 つのホストのクラスで 3 つのパラメータに 2 つのマッチャーを設定していました。最初のパラメータを両方のホストに設定し、次に 2 番目と 3 番目を設定しました。変更を送信する前にすべてが正常かどうかを確認するために最初のパラメータに戻ったところ、両方のホストではなく 1 つのホストにのみ設定されていることがわかりました。それで、何をしたのでしょうか? もう一度設定しました :)

それは「私の」ミスでした! デバッグ モードで、不良ホストと正常ホストの 2 つのホストで同じリクエストを比較して、このケースをデバッグしていました。不良ホストでは「検証」トランザクションが開始され、ロールバックされていることがわかりました。実行された各選択クエリを手動で実行したところ、このクエリでは 0 行ではなく 1 行が返されていることが分かりました。

SELECT 1 AS one FROM "lookup_values" WHERE ("lookup_values"."match" = 'fqdn=puppet-app01' AND "lookup_values"."id" != 39 AND "lookup_values"."lookup_key_id" = 1153) LIMIT 1;

何が何であるかを確認したところ、クラス パラメータに競合があることがわかりました。とにかく、Puppet クラス - MyClass - Smart Class パラメータ - MyParam に移動すると、1 つのマッチャーが表示されます。次に、別のパラメータをクリックして最初のパラメータに戻ると、両方が表示されます :) 奇妙ですよね!? :)

関連情報