使用厨师执行包安装或升级的正确方法

时间:2017-05-09 09:24:52

标签: chef

以下主厨食谱代码旨在安装或升级名为某事的给定包。这个食谱的目标是:

  • 执行包/服务的初始安装
  • 在不需要升级软件包时保持服务正常运行
  • 如果新版本的RPM可用,则升级服务,在这种情况下,升级后重新启动服务

以某种方式安装似乎运行良好,但是如果升级主厨客户端报告与缺少init.d脚本相关的以下错误,那么看起来包得到了unistalled没有正确重新安装:

ERROR: service[something] (something::something-deploy line 36) 
had an error: Chef::Exceptions::Service: service[something]: 
unable to locate the init.d script!

感兴趣的食谱代码:

package 'something' do
  action :upgrade
  notifies :restart, "service[something]", :delayed
end

service 'something' do
  action :enable
end

1 个答案:

答案 0 :(得分:0)

该问题与用于生成RPM的.spec文件有关。在这样的文件中,宏%preun(这是一个卸载前部分)在包的安装升级上执行,因此它正在删除linux服务/ etc /init.d/something文件也在升级时

为防止出现上述情况,rpm实用程序有一个参数可用于限制%preun %postun 部分的范围,其中 $ 1 == 0 表示该场景为un unistall, $ 1 == 1 表示升级。

解决方案是

%preun
if [ $1 == 0 ]; then 
  #cleanup
fi