Puppet,使用 beaker-rspec 在 control-repo 中測試角色
我想用 rspec-puppet 和 beaker-rspec 測試我的控制儲存庫(其中包含配置文件和角色)。我仍然在使用燒杯-rspec 時遇到一些問題:
- 我想單獨測試配置文件,例如
profile::postgresql
查看是否已安裝數據庫。- 然後我還想單獨測試我的角色,例如
role::fileserver
或role::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 測試以確保不同的配置文件沒有依賴問題或衝突。