Chef - 在运行时从git repo读取文件并在配方中使用解析值

时间:2014-10-24 08:28:10

标签: ruby chef

我想从checkout git存储库读取一个文件来解析一个配置文件并使用这些数据执行一些资源命令。

git "/var/repository" do
    action :sync
end

config = JSON.parse(File.read("/var/repository/config.json" ))
config.each do |job, flags|
    #do some resources stuff here
end

这不起作用,因为文件在编译时不存在:

  

=============================================== =================================    / var / chef / cache / cookbooks /中的配方编译错误    ================================================== ==============================

     

变量Errno :: ENOENT

     
     

没有这样的文件或目录 - /var/repository/config.json

我试图在ruby_block中加载文件并在那里执行Chef资源操作,但这没有用。将解析后的配置设置为变量并在ruby_block之外使用它也不起作用。

ruby_block "load config" do
    block do
        config = JSON.parse(File.read("/var/repository/config.json"))
        #node["config"] = config doesn't work - node["config"] will not be set

        config.each do |job, flags|
            #do some stuff - will not work because Chef context is missing
        end
    end
end

知道如何在运行时读取文件并在配方中使用解析后的值吗?

1 个答案:

答案 0 :(得分:0)

您可能还会发现在此类情况下使用lazy evaluation会很有帮助。

  

在某些情况下,在chef-client的执行阶段运行之前,无法知道属性的值。在这种情况下,使用属性值的延迟评估可能会有所帮助。可以改为为其分配代码块,而不是为属性分配值。