捕获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编译错误的主要内容,如果未能解决你的问题,请参考以下文章