Chef infra 如果要安装的软件包不存在,如何告诉Chef采取措施';不存在?

Chef infra 如果要安装的软件包不存在,如何告诉Chef采取措施';不存在?,chef-infra,apt,chef-recipe,Chef Infra,Apt,Chef Recipe,我试图让厨师执行以下操作: 检查所需的debian(可以是任何软件包)是否可用 如果是,请安装软件包 如果不是,则使用源代码构建包 我知道你可以做到: remote\u file“某个远程文件”执行 ... 如果“apt缓存搜索'mypackage'”则不可用 结束 然而,我试着: ruby_block“正在尝试安装#{node[:bact][:application_name]}”do 布洛克道 cmd=Chef::ShellOut.new(“apt get install-y--for

我试图让厨师执行以下操作:

  • 检查所需的debian(可以是任何软件包)是否可用
  • 如果是,请安装软件包
  • 如果不是,则使用源代码构建包
我知道你可以做到:

remote\u file“某个远程文件”执行
...
如果“apt缓存搜索'mypackage'”则不可用
结束
然而,我试着:

ruby_block“正在尝试安装#{node[:bact][:application_name]}”do
布洛克道
cmd=Chef::ShellOut.new(“apt get install-y--force yes{node[:bact][:application_name]}”)
exec_result=cmd.run_命令
如果exec_result.exitstatus!=0
厨师长:Log.info‘去喝点咖啡,这可能需要一段时间……”
资源(“执行[install-#{node[:bact][:application_name]}-通过pip]”)
结束
结束
行动:创建
结束
有没有更简单、更不丑的方法

基本上,我理想的做法是:

开始
包“某个包名”可以吗
操作:安装
完成
救援厨师长:例外
#在这里做点什么
结束

您可以使用安装Debian软件包。然后,只有在此时未安装Debian软件包的情况下,才能安装pip软件包。这可能看起来像这样:

包节点[:bact][:应用程序名称]do
忽略错误为真
结束
#可从opscode python cookbook获得的资源
python\u pip节点[:bact][:application\u name]do
#仅当未安装debian软件包时才安装pip软件包
如果“dpkg查询-W'#{node[:bact][:application_name]}”,则为not_
结束

并且您不能准确地使用
rescue
块中的
pip
资源(来自Pyton cookbook)。因为异常是在转换期间引发的,而转换不在您定义资源的范围内。因此,您可以捕获示例代码中的异常!这真是太棒了。我将您原来的
ignore\u error
更改为
ignore\u failure
。非常感谢。