
포먼 버전 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'
생산.로그:
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개의 매처를 설정하고 있었습니다. 두 호스트 모두에 대해 첫 번째를 설정한 다음 두 번째와 세 번째를 설정했습니다. 변경 사항을 제출하기 전에 모든 것이 괜찮은지 확인하기 위해 첫 번째 매개변수로 돌아갔을 때 두 호스트 모두가 아닌 하나의 호스트에만 설정되어 있다는 것을 알게 되었습니다. 그래서 내가 무슨 짓을 한 거지? 한번 더 설정해봤습니다 :)
그것은 "나의" 실수였습니다! 나는 디버그 모드에서 두 호스트, 즉 나쁜 호스트와 좋은 호스트의 동일한 요청을 비교하여 이 사례를 디버깅하고 있었습니다. 나는 잘못된 "검증" 트랜잭션이 시작되고 롤백되고 있음을 발견했습니다. 실행된 각 선택 쿼리를 수동으로 실행했는데 이 쿼리가 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 - 스마트 클래스 매개변수 - MyParam으로 이동하면 일치자가 하나 표시됩니다! 다른 매개변수를 클릭하고 첫 번째 매개변수로 돌아가면 두 매개변수가 모두 표시됩니다. :) 이상하지 않나요!? :)