2

我正在尝试为supervisord创建一个服务提供者。我既不是 Ruby 程序员,也不是我以前创建过其中的一个,而且文档要么很糟糕,要么很难找到,要么与我正在尝试创建的那种 Provider 无关。

此提供程序的来源在这里:

/lib/puppet/provider/service/supervisor/supervisor.rb

当我运行 puppet 代理时,我在 logstash 服务上收到此错误,我将其命名为“supervisor”作为提供者:

err: /Service[logstash]/ensure: change from false to running failed: No command service defined for provider 

那么,我做错了什么?此外,如果您在该提供商中发现任何其他时髦的东西,请告诉我!

此外,如果您知道任何文档/博客文章/任何实际描述界面以及如何正确创建其中之一的内容,请分享。我根本找不到任何与创建提供者相关的东西,更不用说服务提供者了。

4

1 回答 1

3

问题是对 的引用command(:service),例如

def startcmd
  [command(:service), "start", @resource[:name]]
end

这会在提供程序中查找名为“服务”的预定义命令,因此会出现错误。你有两个定义的命令:

commands :supervisord => "/usr/bin/supervisord",
         :supervisorctl => "/usr/bin/supervisorctl"

因此,您在 restartcmd、startcmd 和 stopcmd 中的引用应该更改为command(:supervisorctl)- 假设这是让您启动/停止的命令。

顶部的commands行将导致 Puppet 仅在主机上都可用时才使用提供程序。然后command(:name)调用将获取它们的完整路径,并且您将返回完整的命令和参数,以便base服务提供者在启动/停止/重新启动服务时运行。

文档没有详细介绍commands您在这里遇到的帮助方法。我建议阅读自定义类型提供程序页面,以及 Richard Crowley 的Extending Puppet slides。两位 Puppet Labs 员工还将在 2012 年底出版一本书:Puppet Types 和 Providers

您还遇到的是您的提供者正在扩展base服务提供者 - 这是正确的做法,但它希望衍生品以特定方式工作(例如 *cmd 方法)。新的类型和提供者可以更简单。

于 2012-12-13T08:34:40.253 回答