工頭 - 比賽已經開始

工頭 - 比賽已經開始

工頭版本 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 Web 介面的奇怪行為引起的。

我在 2 個主機的類別中的 3 個參數上設定了 2 個匹配器。我為兩個主機設定了第一個,然後是第二個和第三個。當我回到第一個參數只是為了在提交更改之前查看一切是否正常時,我發現它只為一個主機設置,而不是為兩個主機設置。那麼,我做了什麼?我又設定了一次:)

那是「我的」錯誤!我透過在偵錯模式下比較兩台主機(壞主機和好主機)上的相同請求來調試這種情況。我發現,在壞的情況下,「驗證」事務開始並正在回滾。我手動執行每個執行的選擇查詢,發現這個查詢返回 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 類別 - MyClass - 智慧類別參數 - MyParam 時,我看到一個匹配器!然後我單擊另一個參數並返回到第一個參數 - 我看到兩個參數:)很奇怪,不是嗎! :)

相關內容