从Ruby脚本调用knife命令而不会出现问题

时间:2012-07-27 17:11:13

标签: chef

我继承了一些有助于使用Chef和knife设置应用程序环境的shell脚本。那太好了。

但我真正想做的是拥有Ruby脚本的强大功能和灵活性来做同样的事情。

如果我向knife炮轰,我将失去该命令的实时输出。

似乎我应该能够通过包含'chef'宝石以及我使用的'cloudstack-fog'插件来调用Ruby中的所有刀具功能。

但我没有找到任何示例或API文档。试图挖掘厨师的宝石来源是一种令人沮丧的运动。

我不应该从Ruby脚本中执行等效的knife cloudstack server create -E ...等等吗?

1 个答案:

答案 0 :(得分:1)

您可以使用Kernel模块的system方法[1]执行此操作,该方法将在子shell中执行命令并将其输出传递给当前shell。当我希望能够看到编程建立的参数Knife命令(如knife ssh)的实时输出时,我在许多自定义Knife插件中使用它。

这是我构建和执行可能是一个非常复杂的命令的示例:

query   = "chef_environment:#{environment.name}"
options = [ "-x #{::Chef::Config[:node_name]}" ].join(' ')
command = %Q{knife ssh "#{query}" #{options} "#{chef_command}"}
system(command)

[1] http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-system