我们遇到了 Mapr 客户端安装的情况。我们希望能够复制位于 /opt/mapr/hive/hive-xy/conf/ 目录下的自定义 hive-site.xml 文件。问题是,直到一组软件包(包括 hive)完全安装后,我们才知道 hive 版本号。因此,如下代码失败:
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
我们已经成功复制了配置文件;但是,如果它是您安装并尝试配置的过程的一部分,则它不起作用。以下是我们尝试过的其他一些事情:
- 尝试将代码的配置副本部分移动到单独的配方中并创建了一个运行列表,并希望如果保持执行顺序,一旦包安装完成,配置单元目录将可用,因此我们将拥有正确的文件路径。那没有用。
- 将配置复制代码放在 ruby_block、lazy evluator only_if 下(检查 /opt/mpar/hive 目录)等。没有运气。
- 将源 xml 文件复制到 /tmp/ 目录尝试在 /opt/mapr/hive 目录可用时简单地复制文件,再次使用惰性求值器、ruby_block 等。仍然失败。
- 试图通过 ruby_block 中的循环尝试检查
if !Dir.glob('/opt/mapr/hive/hive-*/conf/hive-site.xml').empty?
并休眠 5 秒。失败。
上面的其他一些变化也没有成功。在所有这些情况下,似乎"#{dir_hive[0]}/conf/hive-site.xml"
都是在编译时评估的,因此产生了错误的文件路径。
使用通配符捕获已安装文件路径的最佳方法是什么,然后将该路径用于某些操作(例如用自定义文件替换配置文件)。
或者,我们是否可以在执行某些操作后延迟评估表达式以产生变量名,并且延迟评估的变量名取决于该操作后出现的文件名?
感谢您的宝贵时间并感谢任何指示!