我创建了一个 chef 配方,其中提到了特定 rpm 的安装。此 rpm 有一个版本号,需要从属性文件(本身是动态创建的)动态加载。然后需要将此 chef 配方加载到 chef 服务器中。
remote_file "Core_feature.rpm" do
path "#{src_loc}core_feature_v91-2.noarch.rpm"
这里v91-2
是需要通过从属性文件中读取来动态输入到配方中的值。
这可以实现吗?如果可以,我该如何实现它?(对 ruby 一无所知)!
答案1
编辑:由于投票反对而完全重写,但没有更多信息,我不确定我到底在纠正什么,所以这里是可以复制和粘贴的有效代码。
假设属性文件的内容放在 /tmp/versions.properties 中,如下所示:
apache=2.4.7-1ubuntu4.8
php=5.4.3
sendmail=1.2.3
厨师烹饪书
# Copy a file with versions
cookbook_file '/tmp/versions.properties' do
source 'versions.properties'
mode '0644'
end
# Setvar
node.default['version'] = ""
# Block where we set the command
ruby_block "set_app_id" do
block do
node.set['version'] = "apt-get install apache2=`grep -o 'apache=.*' /tmp/versions.properties | cut -f2- -d'='`"
end
action :create
end
# Do a lazy install
execute "install lazy based" do
command lazy {node[:version]}
end
作为附加选项,如果你严格在 *nix 上工作,则以下操作无需懒惰:
# Execute straight up
execute "install lazy based" do
command "apt-get install apache2=`grep -o 'apache=.*' /tmp/versions.properties | cut -f2- -d'='`"
end
我仍然使用了前两篇文章中引用的链接的原始前提:
假设属性文件在服务器上(?),您可以使用惰性求值,如[本文中][1] 所述
编辑:检查一下这个[也看看][2]
[1]: https://stackoverflow.com/questions/26238056/setting-chef-variable-via-a-ruby-block-not-being-executed。 [2]: https://stackoverflow.com/questions/20620724/how-to-lazily-evaluate-an-arbitrary-variable-with-chef