Прораб - Матч уже взят

Прораб - Матч уже взят

Мастер Версия 1.6.3

Когда я пытаюсь изменить один из своих хостов (изменить группу хостов), я получаю следующую ошибку:

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' 

производство.log:

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.

Я устанавливал 2 сопоставления на 3 параметра в классе для 2 хостов. Я установил первый для обоих хостов, затем второй и третий. Когда я вернулся к первому параметру, чтобы просто проверить, все ли в порядке, прежде чем отправлять изменения, я обнаружил, что он установлен только для одного хоста, а не для обоих. Так что я сделал? Я установил его еще раз :)

Это была «моя» ошибка! Я отлаживал этот случай, сравнивая в режиме отладки один и тот же запрос на двух хостах, плохом и хорошем. Я обнаружил, что на плохом начинается транзакция «проверки» и откатывается. Я вручную запускаю каждый выполненный запрос select и обнаруживаю, что этот возвращает мне 1 строку вместо 0:

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 classes - MyClass - Smart Class Parameters - MyParam, я вижу одного сопоставителя! Затем я нажимаю на другой параметр и возвращаюсь к первому - я вижу оба :) Странно, не правда ли!? :)

Связанный контент