我们遇到Mapr客户端安装的情况。我们希望能够复制位于/opt/mapr/hive/hive-x.y/conf/dir下的自定义hive-site.xml文件。问题是,在完全安装了一组软件包(包括配置单元)之后,我们才能知道配置单元版本号。因此,如下代码失败:
package 'mapr-client'
...
...
dir_hive = Dir["/opt/mapr/hive/hive-*"]
template "#{dir_hive[0]}/conf/hive-site.xml" do
source "devg_hive-site.xml.erb"
mode 0644
end
似乎在编译时评估模板名称,此时软件包安装未完成,因此名称将评估为/conf/hive-site.xml
而不是/opt/mapr/hive/hive-1.2/conf/site.xml
。
如果我们等待所有软件包完全安装并通过单独的调用或手动运行以下代码:
dir_hive = Dir["/opt/mapr/hive/hive-*"]
template "#{dir_hive[0]}/conf/hive-site.xml" do
source "devg_hive-site.xml.erb"
mode 0644
end
我们成功复制了配置文件;但是,如果它是您安装并尝试配置的过程的一部分,则它不起作用。以下是我们尝试过的其他一些事情:
if !Dir.glob('/opt/mapr/hive/hive-*/conf/hive-site.xml').empty?
并睡眠5秒钟。失败。上述其他几个变种也没有成功;在所有这些情况下,似乎"#{dir_hive[0]}/conf/hive-site.xml"
在编译时被评估,因此产生了错误的文件路径。
使用通配符捕获已安装文件路径的最佳方法是什么,然后使用该路径进行某些操作(例如将配置文件替换为自定义文件)。
或者,在执行某些操作后,我们是否可以延迟计算表达式以生成变量名称,并且延迟计算的变量名称取决于操作后出现的文件名?
感谢您的时间并感谢任何指示!
答案 0 :(得分:1)
它非常“臭”,它可能会让你在升级时受到伤害。因为较新的版本会有更高的数字。因此,您可以尝试使用last
代替first
。
template "hive-site.xml" do
path lazy { "#{Dir['/opt/mapr/hive/hive-*'].last}/conf/hive-site.xml" }
source "devg_hive-site.xml.erb"
end
我不确定这在您的代码中有多常见,但您可以考虑将从包(元数据或列表文件)中提取路径的资源/代码。
EDIT。我有第二个想法。包可能会记录在node["packages"]
中,版本可以映射到您的路径,您可以使用它并删除Dir
(您仍然需要延迟阻止),您可能需要运行ohai插件来刷新软件包安装后node["packages"]
(我认为你可以使用通知)。
看起来可能类似于:
ohai "reload packages" do
plugin "packages"
action :nothing
end
package "mapr-client" do
notifies :reload, "ohai[reload packages]", :immediately
end
template "hive-site.xml" do
path lazy { "/opr/mapr/hive/hive-#{node["packages"]["mapr-client"]["version"]}/conf/hive-site.xml" }
source "devg_hive-site.xml.erb"
end
不幸的是版本可能不会映射到目录结构。这个包很糟糕; - )
答案 1 :(得分:0)
ohai "reload packages" do
plugin "packages"
action :nothing
end
package "mapr-hive" do
notifies :reload, "ohai[reload packages]", :immediately
end
template "hive-site.xml" do
path lazy { "/opr/mapr/hive/hive-#{node["packages"]["mapr-hive"]["version"]}/conf/hive-site.xml" }
source "devg_hive-site.xml.erb"
end
但是版本提供 1.2.201611292220-1 ,但我们只需要1.2
以及代码正在做什么
ohai "reload packages" do
plugin "packages"
action :nothing
end
package "mapr-hive" do
notifies :reload, "ohai[reload packages]", :immediately
end