Service 使用chef停止不存在的服务时没有错误

Service 使用chef停止不存在的服务时没有错误,service,chef-infra,recipe,Service,Chef Infra,Recipe,我是厨师长的新手,正在尝试理解为什么这段代码不返回任何错误,而如果我对“开始”执行相同的操作,我将得到一个错误,因为这样的服务不存在 service 'non-existing-service' do action :stop end # chef-apply test.rb Recipe: (chef-apply cookbook)::(chef-apply recipe) * service[non-existing-service] action stop (up to da

我是厨师长的新手,正在尝试理解为什么这段代码不返回任何错误,而如果我对“开始”执行相同的操作,我将得到一个错误,因为这样的服务不存在

service 'non-existing-service' do
    action :stop
end

# chef-apply test.rb
Recipe: (chef-apply cookbook)::(chef-apply recipe)
  * service[non-existing-service] action stop (up to date)

不知道在哪个平台上运行如果在Windows上运行,它至少应该记录日志
Chef::Log.debug“#{@new_resource}不存在-无事可做”
假设您已将调试设置为日志级别

你可能会说这是错误的行为,但如果服务不存在,它肯定不会运行

源代码

如果您获得的是
init.d
提供程序的一个变体,则默认情况下,它们通过将流程表变灰来获取服务的当前状态。因为Chef在调用提供者的stop方法之前在内部进行自己的幂等性检查,所以它会发现表中没有这样的过程,并假设它已经停止了。

什么操作系统和/或服务提供者?我已经在rhel6上用initd测试了它,在rhel7上用systemd测试了它。我认为这是预期的行为,至少在我看来。当你创建一个厨师食谱时,你实际上不是在陈述你想要做什么,而是在系统应该处于什么状态。停止的服务不做任何事情,所以它就像不存在的服务一样。我认为这是因为它正在寻找进程,而不是服务本身。但是,在服务名称发生变化的版本发行版上运行时,如何验证配方是否正确。我认为,使用systemd,当您尝试获取未知单元的状态时,您应该从systemctl获得一个错误。使用initd提供程序,您可以设置
supports status:true
,使其使用
/etc/init.d/name status
来获取状态,而不是pgrep,这将使其出错。我在rhel6和rhel7中尝试了这一方法,但结果相同。(无错误)您使用的是“仅操作停止”还是“[”停止“,”禁用“]”?您是对的,我只在调试模式下看到此错误,但在默认模式下显示此信息没有意义?我同意这一点。我认为厨师信息日志中的登录非常少。