如何将厨师“执行资源”的输出放入变量中

Posted

技术标签:

【中文标题】如何将厨师“执行资源”的输出放入变量中【英文标题】:How can I put the output of a Chef 'execute resource' into a variable 【发布时间】:2013-04-24 23:00:29 【问题描述】:

我想将 shell 命令的输出放入一个变量中,以便以后在 Chef 食谱中使用。

在 bash 中,我可以执行 output=`tail -1 file.txt` 之类的操作,然后可以执行 echo $output

“执行资源”能否执行此操作,以便我稍后在配方中使用结果?

【问题讨论】:

【参考方案1】:

虽然格雷厄姆的解决方案一开始似乎有效,但我发现了 Chef::Mixin:ShellOut

ruby_block "check_curl_command_output" do
    block do
      #tricky way to load this Chef::Mixin::ShellOut utilities
      Chef::Resource::RubyBlock.send(:include, Chef::Mixin::ShellOut)      
      curl_command = 'curl --write-out %http_code --silent --output /dev/null '+node['url']
      curl_command_out = shell_out(curl_command)
      if curl_command_out.stdout == "302"
        ...
      else
        ...
      end
    end
    action :create
end

如果您需要以特定用户身份运行命令(参见http://www.slideshare.net/opscode/chef-conf-windowsdougireton),Chef::Mixin:ShellOut 特别有用:

ruby_block "run_command_as" do
    block do
    Chef::Resource::RubyBlock.send(:include,Chef::Mixin::ShellOut)
    add_group = shell_out("your command",
        
          :user => "my_user",
          :password => "my_password",
          :domain => "mycorp.com"
        
        )
    end
end

【讨论】:

这是一个比公认答案更优雅的问题解决方案,并提供更好的功能。感谢发帖,弗朗索瓦! 有人为这种类型的代码写过chefspec吗? 不再需要手动将 shell_out 帮助程序加载到资源/提供程序中,在这种情况下也不需要使用 ruby​​_block 进行间接寻址。下面的简单单行是一个更好的解决方案。【参考方案2】:

为我工作

passenger_root = shell_out("passenger-config --root").stdout

【讨论】:

require 'chef/mixin/shell_out' 行不再需要。这也应该是公认的答案。不再需要使用 ruby​​_block 或注入 shell_out 方法。 (我刚刚更新了答案以删除要求行)

以上是关于如何将厨师“执行资源”的输出放入变量中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用厨师将 opsworks 变量提取到 .env 文件中?

将命令放入变量中[重复]

如何使用 Ruby 块在厨师食谱中分配变量

将变量从厨师传递到PowerShell

如何在变量中获得蜂巢输出?

如何将 Bash 命令的输出分配给变量? [复制]