Chef不爽的地方

  1. 对于chef-solo来说,cookbook的依赖关系是噩梦,因为没有chef-server,所有需要的cookbook都需要手动下载下来,尤其麻烦的还是间接的关联的依赖。另外,还有不同版本的cookbook怎么放置的问题。
  2. metadata.rb无法指定特定OS上是不是需要这个依赖,比如,windows平台不需要用到python cookbook,但是ubuntu需要。因为无法指定依赖和操作系统的关联,所以,在chef-solo上,python cookbook也是必须的,python又依赖于build-essensial。。。我的解决方案是把depends改成recommends
  3. 碰到莫名其妙的问题的时候,可以检查下cookbook的dependency,另外你的recipe有没有使用了无效的resource。或者语法有错,括号写了一半。
  4. bash和batch不同,在windows平台上,最好都用batch。(不过要注意,调用其他脚本的时候要用call)
batch "Install Slave" do
  cwd buildbot_repo_dir
  environment "VS90COMNTOOLS" => "#{ENV['VS100COMNTOOLS']}"
  code <<-EOH
    call #{virtual_env_dir}/Scripts/activate.bat
    #{virtual_env_dir}/Scripts/pip.exe install -e slave
  EOH
  notifies :run, "batch[Create Slave]", :immediately
end
  1. 下面这段代码,报了一个错误:“,原因是什么?
cookbook_file "#{deploy_dir}/chef_batch_launcher.exe"

原因是,cookbook里面没有chef_batch_launcher.exe!NND,花了几个小时来调试这个问题!
1. template, cookbook_file, remote_file这些resource里面有个cookbook属性,可以很方便的话,引用其他cookbook的文件资源,比如:
cookbook_file “#{deploy_dir}/chef_batch_launcher.exe” do
cookbook “another_cookbook”
end

https://tickets.opscode.com/browse/CHEF-7
1. 写definition要注意,假如引用到了本cookbook的静态资源(文件,erb等)的话,一定要显式的指定这个resource所引用的文件是来自本cookbook的,比如:
cookbook: buildbot_slave

define :buildbot_slave_windows do
  template "#{build_slave_root_info_dir}/host" do
    source 'host.erb'
    cookbook 'buildbot_slave'
    variables :node => node
  end

  cookbook_file "#{deploy_dir}/chef_batch_launcher.exe" do
    cookbook 'buildbot_slave'
  end
end 
  1. 一定要加括号,header不加括号就报错:
http_request 'Creating Message Queue' do
    action :get
    url "http://localhost:15672/api/queues"
    message ''
    headers({"Authorization" => "Basic #{Base64.encode64("guest:guest")}", "Content-Type" => "application/json"})
end

你可能感兴趣的:(Chef)