chef-infra - 从 Ruby 脚本调用 Knife 命令,无需脱壳

标签 chef-infra

我继承了一些 shell 脚本,这些脚本有助于使用 Chef 和 Knife 设置我们的应用程序环境。那很好。

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

如果我掏出knife我失去了命令的实时输出。

似乎我应该能够通过包含“Chef ”gem 和我使用的“cloudstack-fog”插件来从 Ruby 中调用 Knife 的所有功能。

但我还没有找到任何示例或 API 文档。试图挖掘 Chef gem 的来源是一种挫败感。

难道我不能做相当于 knife cloudstack server create -E ... 的操作吗?等来自Ruby脚本?

最佳答案

您可以使用 Kernel 来做到这一点。模块的system方法 [1],它将在子 shell 中执行您的命令并将其输出通过管道传输到您当前的 shell。当我希望能够查看以编程方式构建的参数 Knife 命令(如 knife ssh)的实时输出时,我会在我的许多自定义 Knife 插件中使用它。 .

这是一个示例,我在其中构造和执行可能是非常复杂的命令:

查询=“Chef 环境:#{环境名称}”
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

关于chef-infra - 从 Ruby 脚本调用 Knife 命令,无需脱壳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11692486/

相关文章:

ruby - 如何编写扩展现有提供程序的 Chef 提供程序?

chef-infra - 组合来自两本 Chef Recipe 的两个模板

chef-infra - 删除名称中包含换行符的客户端

linux - 无法在 Chef 中安装 Recipe

ubuntu - chef 节点未执行 chef-client 命令

ruby - 如何查看上传失败的具体 Recipe ?

ruby - 访问 Chef 库中的节点属性

chef-infra - 强制执行 Chef Recipe 中的执行顺序

chef-infra - 尝试使用 Chef 引导 Windows 服务器时陷入困境

linux - 在 oracle linux (oel) 上安装本地 rpm 包的 Chef 问题