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

时间:2014-10-08 12:23:42

标签: ruby vagrant chef

所以我正在创建一个带有vagrant的虚拟机并使用chef-client配置它。在某个步骤中,它应该查看目录并从.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 VM上运行它并没有问题,但是当在Vagrant生成的VM上使用chef-client配置时,这个配方似乎只是被跳过了。没有错误消息,没有警告,没有日志 - 没有。所有这些都是/ opt / app / conf中未触及的模板。我甚至看不到"配置应用..."流浪汉输出中的字符串。

我无法使用厨师独奏配置,因为相同的配方用于在我们的云服务器上生成QA环境和开发人员的本地环境,我希望所有这些都由我们的厨师服务器配置。

我有什么方法可以修复它,或者至少某种日志功能不是厨师的调试级日志记录?

Vagrant和VBox在Windows7机器上,我使用的是chef / centos6.5盒子。

2 个答案:

答案 0 :(得分:0)

我认为您受到编译/收敛问题的影响。见http://docs.getchef.com/essentials_nodes_chef_run.html

但也许你在你的竞选名单中没有食谱。

如果它的第一个案例是解释:

您的Dir.Glob()在编译时完成,此时创建模板的remote_directory(或其他)未运行且dir为空。

简单的解决方案:两次主厨,第二次会找到文件并为每个创建template资源。

另一个选择是将代码封装在ruby_block中,这样您的代码将在收敛时进行评估并且应该可以正常工作。

答案 1 :(得分:0)

Tensibai在问题上发现了 - 将配方放在ruby_block中解决了这个问题。

以下是我编辑食谱的方法:

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位懒惰的开发人员和测试人员非常高兴。