厨师不会开始我的init.d服务

时间:2016-09-06 04:51:07

标签: mongodb centos chef chef-recipe cookbook

我通过此mongo doc创建服务。

我的配方中有这个通过模板安装服务:

service 'disable-transparent-hugepages' do
  supports :restart => true, :start => true, :stop => true, :reload => true
  action :nothing
end

template 'disable-transparent-hugepages' do
  path '/etc/init.d/disable-transparent-hugepages'
  source 'disable-transparent-hugepages.erb'
  owner 'root'
  group 'root'
  mode '0755'
  notifies :enable, 'service[disable-transparent-hugepages]'
  notifies :start, 'service[disable-transparent-hugepages]'
end

当我多次运行配方时,它会将init.d脚本拉到正确的位置,但如果我检查它的状态,我会看到: enter image description here

在我确认安装后,我在配方中添加了一行,就像正常启动服务一样:

service 'disable-transparent-hugepages' do
  action :start
end

但它还没有开始。

如果我手动启动它,我可以看到它正常工作: enter image description here

为什么没有厨师开始服务?

编辑:好的,所以我发现this SO question说我的问题可能是我需要init.d脚本(在mongo doc的链接中找到)需要以非0返回代码退出。我不确定如何在检查状态时让脚本返回非零代码。

1 个答案:

答案 0 :(得分:2)

这与脚本支持命令的假设有关。

引用关于supports service resource关于supports财产的主厨文档(强调最后一行是我的):

  

status Ruby类型:哈希

     

控制chef-client尝试方式的属性列表   管理服务:: restart,:reload,:status。对于:重启,   init脚本或其他服务提供者可以使用restart命令;如果   :未指定restart,chef-client尝试停止然后   开始服务。用于:重新加载,init脚本或其他服务   provider可以使用reload命令。对于:status,init脚本或   其他服务提供商可以使用status命令来确定是否   服务正在运行;如果:未指定status,则为chef-client   尝试将service_name与进程表匹配为   正则表达式,除非将模式指定为参数   属性。默认值:{:restart => false,:reload =>假,   :status =>对于所有平台都是假的(除了Red Hat平台   系列,默认为{:restart => false,:reload =>假,   :status =>是的。

true0时,提供程序会尝试调用它,如果它返回start该服务应该正在运行。

根据您提供的链接,脚本仅支持service 'disable-transparent-hugepages' do supports :restart => false, :start => true, :stop => false, :reload => false, :status => false action :start end ,因此在使用参数状态调用时返回0。

解决此问题的一种方法是使用更精确的服务定义,如下所示:

status)
if [ -d /sys/kernel/mm/transparent_hugepage ]; then
  thp_path=/sys/kernel/mm/transparent_hugepage
elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then
  thp_path=/sys/kernel/mm/redhat_transparent_hugepage
else
  return 0
fi

re='^(0|no)$'
return [[ $(cat ${thp_path}/khugepaged/defrag) =~ $re ]]
;;

另一种方法是修复init脚本以实现status命令,如果文件具有正确的内容则返回0,否则返回1。

我认为(未经测试),这条线路上的某些东西可以作为状态:

{{1}}

我的意见:

由于它不是一个真正的服务,我会直接管理这些文件,而不是使用伪服务。