Puppet

Puppet,使用 beaker-rspec 在 control-repo 中測試角色

  • February 27, 2022

我想用 rspec-puppet 和 beaker-rspec 測試我的控制儲存庫(其中包含配置文件和角色)。我仍然在使用燒杯-rspec 時遇到一些問題:

  • 我想單獨測試配置文件,例如profile::postgresql查看是否已安裝數據庫。
  • 然後我還想單獨測試我的角色,例如role::fileserverrole::webserver

我已經設置了 beaker-rspec 並且它可以工作,但是它需要相當長的時間,因為它會一個接一個地應用所有配置文件。我在其中看到以下問題:

  • 如果有太多的配置文件被應用到 Vagrant VM,它會被污染(來自另一個執行的剩餘包、文件等,因此測試不再具有代表性)
  • 一些配置文件沒有任何共同點,甚至可能與它們相矛盾(例如 nginx 與 apache;它們永遠不會扮演一個角色,但都在 control-repo 中定義)。

我寧願做的是:

  • beaker-rspec 應該檢查已經定義了哪些角色,然後為每個角色啟動一個**單獨的虛擬機。
  • 這些應該串列或(更好)並行完成。
  • 我怎樣才能減少每次執行的時間,特別是如果有一個相當大的具有多個角色和不同作業系統版本等的 Puppet 設置。也許選擇測試類型(“僅角色測試”或“僅配置文件測試”)。

如果 beaker-rspec 測試新 VM 中的每個配置文件也可以(但我想將測試切換為其他用途)。

我怎樣才能做到這一點?謝謝 :)

這裡有一些不同的回應:

beaker-rspec 應該檢查已經定義了哪些角色,然後為每個角色啟動一個單獨的虛擬機。這些應該串列或(更好)並行完成。

Beaker-rspec 沒有能力為每個測試套件使用全新的 SUT(被測系統)。現在唯一的方法是為每個測試創建一個新的 _spec.rb 文件,然後在新程序中執行每個測試,例如。bundle exec rspec spec/acceptance/profile_test_one.rb && bundle exec rspec spec/acceptance/profile_test_two.rb

對於串列或併行執行,最好在 CI 平台中執行此操作。例如,對於 Travis(或帶有 Matrix 外掛的 Jenkins),您將創建一個測試矩陣,每個配置文件具有不同的測試,因此它們可以並行執行。這需要非常強大的測試機器,特別是如果您使用的是大塊虛擬機。

我怎樣才能減少每次執行的時間,特別是如果有一個相當大的具有多個角色和不同作業系統版本等的 Puppet 設置。也許選擇測試類型(“僅角色測試”或“僅配置文件測試”)。

當你說減少時間時,你指的是哪一部分?Puppet 執行需要多長時間,或者讓機器進入可測試狀態需要多長時間?

使用 Docker 實例可以顯著加快機器配置狀態。

要加快 Puppet 的執行速度,這取決於什麼是慢的。如果是計算,讓 SUT 更大,給它更多的核心或 RAM。對於網路相關問題,您可以使用記憶體。例如在 Mac 上,您可以使用 Squid 記憶體所有需要的 RPM/APT 包

我通常不對角色進行驗收測試。角色基本上只是元配置文件:它們不應該有邏輯並且只是配置文件的集合。

測試角色的唯一好處是在使用多個配置文件時檢測衝突,但是使用 rspec-puppet 而不是驗收測試可以更好地檢測衝突和依賴性檢查。

例如,像這樣的角色:

class role::foo_blog {
 include profile::base
 include profile::nginx
 include profile::php
 include profile::mysql
}

使用驗收測試來測試四個配置文件中的每一個會更容易,並編寫一個 rspec-puppet 測試以確保不同的配置文件沒有依賴問題或衝突。

引用自:https://serverfault.com/questions/807316