我有一个看起来像这样的厨师食谱:
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
感谢您的帮助。谢谢。
答案 0 :(得分:0)
好的,这里有几个问题。首先,请忘记该Chef::Resource::whatever.send(:include
技巧。永远不要做,从不做。在这种情况下,无论如何所有地方都可以使用ShellOut mixin。
接下来,更重要的是,您仍然遇到两遍困惑的问题。有关详细信息,请参见https://coderanger.net/two-pass/,但基本上,该echo
资源中的字符串(我假设最初是说execute
的,您搞砸了吗?)是在编译时插入的。您尚未说出要做什么,但您可能需要使用lazy{}
帮助方法。
最后,不要像这样将它们存储在节点属性中,它非常脆弱且难以使用。