捕获shell输出时,Chef编译错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了捕获shell输出时,Chef编译错误相关的知识,希望对你有一定的参考价值。

我有一个看起来像这样的厨师食谱:

package 'build-essential' do
  action :install
end

cmd = Mixlib::ShellOut.new("gcc -dumpversion")
cmd.run_command
gcc_version = cmd.stdout.strip()

如果我在安装了gcc的系统上执行配方,配方运行正常,没有错误。但是,如果我在没有安装gcc的系统上运行配方,我会收到错误'没有这样的文件或目录 - gcc'。

当我试图找到问题的解决方案时,我开始了解厨师两阶段的事情。我期待软件包安装满足gcc要求。如何告诉厨师以后满足此要求并且不会在编译时抛出错误?

我尝试了以下内容,但该属性未更新。

Chef::Resource::RubyBlock.send(:include, Chef::Mixin::ShellOut)
ruby_block "gcc_version" do
  block do
    s = shell_out("gcc -dumpversion")
    node.default['gcc_version'] = s.stdout.strip()
  end
end

echo "echo #{node[:gcc_version]}" do
  command "echo #{node[:gcc_version]}"
end

任何帮助表示赞赏。谢谢。

答案

好吧,这里有一些问题。首先,忘记Chef::Resource::whatever.send(:include技巧。从不这样做,从不这样做。在这种情况下,无论如何,ShellOut mixin已经在所有地方都可用。

接下来,更重要的是,你仍然有一个两通混淆问题。有关详细信息,请参阅https://coderanger.net/two-pass/,但基本上是echo资源中的字符串(我假设最初说execute并且你搞砸了应对?)在编译时进行插值。你还没有说你要做什么,但你可能需要使用lazy{}辅助方法。

最后,不要将内容存储在这样的节点属性中,它非常脆弱且难以使用。

以上是关于捕获shell输出时,Chef编译错误的主要内容,如果未能解决你的问题,请参考以下文章

如何捕获Chef异常

协程 shell_exec 如何捕获标准错误流

从源代码编译 MongooseIM 时 rebar_core 中未捕获的错误

从 VBA 中的 shell 命令捕获输出值?

如何在 Shell 脚本中建立远程连接时捕获错误

Powershell:捕获组合输出,仅错误输出,将组合输出发送到控制台