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