
Foreman Version 1.6.3
Wenn ich versuche, einen meiner Hosts zu bearbeiten – die Hostgruppe zu ändern – erhalte ich die folgende Fehlermeldung:
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'
Produktionsprotokoll:
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)
Ich erhalte jedes Mal den gleichen Fehler, wenn ich versuche, einen Parameter auf diesem Host zu bearbeiten. Dies trat erstmals auf, nachdem ich eine Klasse zugewiesen und sie von diesem Host entfernt hatte.
Dies ist meine Produktionsumgebung und das Problem muss so schnell wie möglich behoben werden.
Irgendwelche Ideen?
Antwort1
Jetzt bin ich mehr als sicher, dass meine Frage überhaupt nicht dumm war und dass der Kommentar von jmp242 nichts weiter als ein dummer Workaround-Vorschlag war. Nichts für ungut! :P Wie auch immer, es war ABER meine eigene Schuld, verursacht durch ein seltsames Verhalten der Foreman-Weboberfläche.
Ich habe 2 Matcher auf 3 Parameter in einer Klasse für 2 Hosts gesetzt. Den ersten habe ich für beide Hosts gesetzt, dann den zweiten und dritten. Als ich zum ersten Parameter zurückging, um zu sehen, ob alles in Ordnung ist, bevor ich Änderungen absende, stellte ich fest, dass er nur für einen Host gesetzt ist und nicht für beide. Also, was habe ich getan? Ich habe ihn noch einmal gesetzt :)
Das war „mein“ Fehler! Ich habe diesen Fall debuggt, indem ich im Debug-Modus dieselbe Anfrage auf zwei Hosts verglichen habe, dem schlechten und dem guten. Ich habe herausgefunden, dass auf dem schlechten Host die „Validierungs“-Transaktion beginnt und zurückgesetzt wird. Ich habe jede ausgeführte Select-Abfrage manuell ausgeführt und festgestellt, dass diese mir 1 Zeile statt 0 zurückgibt:
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;
Ich habe überprüft, was was ist, und dabei festgestellt, dass es einen Konflikt in den Klassenparametern gab. Wenn ich jedenfalls zu Puppet-Klassen – MyClass – Smart Class-Parameter – MyParam gehe, sehe ich einen Matcher! Dann klicke ich auf einen anderen Parameter und gehe zurück zum ersten – ich sehe beide :) Seltsam, nicht wahr!? :)