Chef infra 使用chef执行软件包安装或升级的正确方法

Chef infra 使用chef执行软件包安装或升级的正确方法,chef-infra,Chef Infra,以下厨师配方代码旨在安装或升级名为某物的给定软件包。本配方的目的是: 执行软件包/服务的初始安装 只要不需要升级包,就保持服务运行 如果RPM的新版本可用,请升级服务。在这种情况下,请在升级后重新启动服务 不知何故,安装似乎运行良好,但在升级的情况下,chef客户端会报告与缺少init.d脚本有关的以下错误,因此软件包似乎未安装且未正确重新安装: ERROR: service[something] (something::something-deploy line 36) had an e

以下厨师配方代码旨在安装或升级名为某物的给定软件包。本配方的目的是:

  • 执行软件包/服务的初始安装
  • 只要不需要升级包,就保持服务运行
  • 如果RPM的新版本可用,请升级服务。在这种情况下,请在升级后重新启动服务
不知何故,安装似乎运行良好,但在升级的情况下,chef客户端会报告与缺少init.d脚本有关的以下错误,因此软件包似乎未安装且未正确重新安装:

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

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

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

解决办法是

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

升级期间服务名称没有更改吗?(例如tomcat到tomcat7)?这可以解释为什么找不到init.d脚本。RPM名称已更改,但服务本身未更改。。。我将命名格式从something-1.0-230.rpm更改为something-2017.05.09.231-231.rpm,其中230和231是构建编号。我不确定这是否会导致服务名称发生更改。我猜不出您的rpm是做什么的,请检查文件系统以确保有什么和没有什么。但是如果chef找不到init.d脚本,这意味着某个地方确实删除了它,而这不是chef,或者是yum(由包资源使用)或者rpm内部代码在设置它时出现问题。用伪造的食谱,我说不出来,那只是猜测