提问者:小点点

使用Dir和File Ruby类在Vagrant VM上使用chef创建多个配置文件


所以我创建了一个带有流浪者的虚拟机,并将其提供给厨师客户端。在某个步骤中,它应该浏览目录并从. erb模板(大约50个)中创建文件。

以下是配方:

puts("Configuring app...")
Dir.glob('/opt/app/conf/**/*.erb').each do |conf_file|
  conf_file_name = File.basename(conf_file, ".erb")
  conf_file_loc = File.dirname(conf_file)
    template "#{conf_file_loc}/#{conf_file_name}" do
      local true
      source "#{conf_file}"
      action :create
  end
end

所以它所做的就是寻找每一个。conf目录及其子目录中的erb文件,剪切。从他们的名字erb和创建一个基于模板的文件。

这段代码可以工作,我在手动创建的VirtualBox虚拟机上运行过,没有问题,但是当在Vagant生成的虚拟机上使用厨师客户端预配时,这个配方似乎被跳过了。没有错误消息,没有警告,没有日志-什么都没有。/opt/app/conf.中所有未触及的模板我甚至看不到“配置应用......”游荡输出中的字符串。

我不能使用厨师个人预配,因为相同的配方用于在我们的云服务器上生成质量保证环境和开发人员的本地环境,我希望所有这些都由我们的厨师服务器预配。

是否有任何方法可以修复它,或者至少有某种不是chef调试级日志的日志功能?

流浪和VBox在Windows7机器上,我使用厨师/centos6.5盒。


共2个答案

匿名用户

我认为您遇到了编译/收敛问题。看见http://docs.getchef.com/essentials_nodes_chef_run.html

但也许你只是没有食谱在你的运行列表中。

如果是第一种情况,请在此说明:

你的目录。Glob()是在编译时完成的,此时创建模板的远程目录(或其他任何目录)尚未运行,目录为空。

简单的解决方案:两次运行chef,第二次将查找文件并为每个文件创建模板资源。

另一种选择是将代码封装在ruby_块中,这样您的代码将在收敛时得到评估,应该可以工作。

匿名用户

Tensibai发现了这个问题——将配方放入ruby_块解决了这个问题。

下面是我如何编辑配方的:

ruby_block "Create configs for #{node['hostname']}" do
  action :create
  block do
    Dir.glob('opt/app/conf/**/*.erb').each do |conf_file|
      conf_file_name = File.basename(conf_file, ".erb")
      conf_file_loc = File.dirname(conf_file)
        t=Chef::Resource::File::Template.new("#{conf_file_loc}/#{conf_file_name}", run_context)
        t.local true
        t.source conf_file
        t.owner 'user'
        t.group 'root'
        t.run_action :create
    end
  end
end

非常感谢你,你刚刚让至少40个懒惰的开发人员和测试人员非常高兴。