Chef - 测试 Cookbook

如果 Cookbook 直接部署并在生产服务器上运行,则很有可能在生产中崩溃。防止这种情况发生的最佳方法是在设置环境中测试 Cookbook。

以下是测试步骤。

步骤 1 − 使用以下命令安装 Cookbook。

vipin@laptop:~/chef-repo $ knife cookbook site install <cookbook name>

步骤 2 − 在工作 Cookbook 上运行 knife cookbook 测试命令。

vipin@laptop:~/chef-repo $ knife cookbook test VTest  
checking ntp 
Running syntax check on ntp 
Validating ruby files 
Validating templates

步骤 3 − 打破 cookbook 中的某些内容并再次测试。

vipin@laptop:~/chef-repo $ subl cookbooks/VTest/recipes/default.rb 
... 
[ node['ntp']['varlibdir'] 
node['ntp']['statsdir'] ].each do |ntpdir| 
   directory ntpdir do 
      owner node['ntp']['var_owner'] 
      group node['ntp']['var_group'] 
      mode 0755 
   end 
end

步骤 4 − 再次运行 knife test 命令。

vipin@laptop:~/chef-repo $ knife cookbook test ntp 
checking ntp 
Running syntax check on ntp 
Validating ruby files 
FATAL: Cookbook file recipes/default.rb has a ruby syntax error: 
FATAL: cookbooks/ntp/recipes/default.rb:25: syntax error, 
unexpected tIDENTIFIER, expecting ']' 
FATAL: node['ntp']['statsdir'] ].each do |ntpdir| 
FATAL: ^ 
FATAL: cookbooks/ntp/recipes/default.rb:25: syntax error, 
unexpected ']', expecting $end 
FATAL: node['ntp']['statsdir'] ].each do |ntpdir| 
FATAL: 

工作方法

Knife cookbook test 对 cookbook 中的所有 Ruby 文件以及所有 ERB 模板执行 Ruby 语法检查。它循环遍历 Ruby 文件并针对每个文件运行 Ruby –c。Ruby –c 检查脚本的语法并退出而不运行它。

在检查完所有 Ruby 文件后,Knife cookbook test 会检查所有 ERB 模板和管道,即由 –x 通过 Ruby –c 创建的冗余版本。

限制

Knife cookbook test 仅对 Ruby 文件和 ERB 模板进行简单的语法检查。我们可以通过使用 ChefSpec 和Test Kitchen(测试厨房)进行全面测试驱动。