Chef infra chef-从ruby_块调用提供者

Chef infra chef-从ruby_块调用提供者,chef-infra,Chef Infra,我知道chef中编译时和运行时行为之间的区别,但仍然无法解决一般问题。 以下是我想做的: 使用git提供程序克隆某些内容(在运行时提供运行) 浏览克隆目录中的一些文件并生成一些json文件(编译时) 对于文件夹中的每个json文件:(编译时) 使用json文件中的参数运行提供者x(运行时) 理想情况下,为了解决这个问题,如果我能让它100%运行时代码就更好了。 我可以将编译时代码放在一个ruby_块中,使其在运行时运行 但是我不能从ruby块中调用任何提供者 我如何处理这个问题 更新:

我知道chef中编译时和运行时行为之间的区别,但仍然无法解决一般问题。 以下是我想做的:

  • 使用git提供程序克隆某些内容(在运行时提供运行)
  • 浏览克隆目录中的一些文件并生成一些json文件(编译时)
  • 对于文件夹中的每个json文件:(编译时)
    • 使用json文件中的参数运行提供者x(运行时)
理想情况下,为了解决这个问题,如果我能让它100%运行时代码就更好了。 我可以将编译时代码放在一个ruby_块中,使其在运行时运行 但是我不能从ruby块中调用任何提供者

我如何处理这个问题


更新:

我尝试了一个简单的代码来证明Tensibai的建议是有效的:

我的食谱:

batch 'git_emulation' do
  code "echo hi>C:\\temp\\x.txt"
  action :nothing
end.run_action(:run)

::Dir["C:/temp/*"].each do |path|
  app_go "test" do
    path path
    action :test
  end
end
我的应用程序提供商:

action :test do
  Chef::Log.info("path = #{@new_resource.path}")
end
这张照片

path=C:\temp\x.txt

这意味着批处理提供程序在编译时运行。 但是,在使用git时,我得到一个错误:

STDERR:'git'未被识别为内部或外部命令

因为“include_recipe”不是在运行时运行的。
有什么想法吗?

我相信如果你有一个和两个一个接一个的,它应该按照特定的顺序运行;但是环路呢?正如我所说的,我需要遍历这些文件并致电提供商。在库表单中重写此提供程序可能会解决问题,但这意味着我必须做大量额外的工作并修改内置的食谱。我不确定是否理解您正在做的事情。首先,将git clone资源设置为
action:nothing
,然后用
end关闭它。运行\u action(:sync)
,以便git克隆在编译时发生。另一个选择是这样做,这是非常有趣的。厨师长文档在使用通知时仅使用action=nothing。为什么在你的代码里有这个?还有,循环是在编译时运行还是在运行时运行?@Tensibai我不知道你是否读过下面的帖子。我无法在运行时包含git cookbook。如果你能对此发表评论,我将不胜感激。