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

问题描述 投票:0回答:1

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

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

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

shell compiler-errors output chef lazy-evaluation
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.