所以我正在创建一个带有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盒子。
答案 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位懒惰的开发人员和测试人员非常高兴。