我继承了一些shell脚本,这些脚本有助于使用Chef和knife设置我们的应用程序环境。太好了。
但我真正想做的是拥有Ruby脚本的强大功能和灵活性来做同样的事情。
如果我退出到knife
,我将丢失命令的实时输出。
我似乎应该能够从Ruby中调用knife的所有功能,包括"chef"gem,也许还有我使用的"cloudstack fog"插件。
但我还没有找到任何例子或API文档。试图挖掘厨师宝石的来源是一种挫败感。
难道我不应该从Ruby脚本中执行相当于knife cloudstack server create -E ...
等的操作吗?
您可以使用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}"}系统(命令)
[1]http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-system