Chef infra 厨师长-主管服务与已有服务冲突';d程序(在这种情况下是nginx)?

Chef infra 厨师长-主管服务与已有服务冲突';d程序(在这种情况下是nginx)?,chef-infra,Chef Infra,我正在使用操作码的食谱:application_python、nginx和supervisor 堆栈:ubuntu 14.04、django、nginx、gunicorn、postgresql application_python希望使用gunicorn和supervisor作为服务控制器来启动django应用程序,这似乎是推荐的 也许很天真,我想为什么不在主管的领导下管理一切 所以我最终得到了这样的结果: 安装nginx(尝试了这两种方法,问题相同) 在进一步的处理中 通过主管启动nginx

我正在使用操作码的食谱:application_python、nginx和supervisor

堆栈:ubuntu 14.04、django、nginx、gunicorn、postgresql

application_python希望使用gunicorn和supervisor作为服务控制器来启动django应用程序,这似乎是推荐的

也许很天真,我想为什么不在主管的领导下管理一切

所以我最终得到了这样的结果:

安装nginx(尝试了这两种方法,问题相同)

在进一步的处理中

通过主管启动nginx

supervisor_service "nginx" do
  command "nginx"
  process_name "nginx"
  #using :restart instead didn't help
  action [:enable, :start]
end
问题-我的主管nginx似乎无法熬夜。通过supervisorctl查看:

supervisor> status
bemyerp                          RUNNING   pid 14724, uptime 0:00:56
nginx                            STARTING  
supervisor> status
bemyerp                          RUNNING   pid 14724, uptime 0:01:10
nginx                            STARTING  
和日志:

/var/log/supervisor/nginx-stderr--supervisor-Lyi21Z.log

nginx: [emerg] bind() to 0.0.0.0:8000 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:8000 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:8000 failed (98: Address already in use)
事实上,已经有了一个在Ubuntu服务上启动并运行的nginx:

root@vagrant:~# service --status-all
 [ + ]  apparmor
....
 [ + ]  nginx
 [ ? ]  ondemand
 [ + ]  postgresql
....
 [ + ]  supervisor
....
我查到了

我在我的厨师执行日志中也看到了这一点,就在我点击supervisor_service nginx的地方

WARN: Cloning resource attributes for service[nginx] from prior resource (CHEF-3694)
WARN: Previous service[nginx]: /var/chef/cache/cookbooks/nginx/recipes/default.rb:24:in `from_file'
WARN: Current  service[nginx]: /var/chef/cache/cookbooks/basedjango/recipes/default.rb:153:in `from_file'
通过3694上的快速谷歌,我无法判断是它导致了这个问题,还是只是一条人们不愿看到的闲聊警告信息

我在nginx cookbook中找不到不启动服务的off-switch属性,上面的代码也没有任何条件

postgresql也有相同的安装启动行为

问题:我是否遗漏了一些明显的东西

supervisor服务如何处理打包了自己内置服务启动的已安装程序?主管服务资源是否有处理这些问题的方法

nginx和postgres等程序如何与管理员希望使用特定服务管理器的配置集成

在这些情况下,我是否应该跳过使用supervisor,而只使用它来管理未启动的程序?这不是一个很大的破坏者,但在我看到的任何地方都没有提到

我认为在“主管服务nginx”步骤之前明确关闭服务可能会奏效,但事实并非如此

service "nginx" do
  action [:stop, :disable]
end
最后,但并非最不重要的是,版本信息:

root@vagrant:~# chef-client -v
Chef: 11.14.6

application_python (3.0.0)
nginx (2.7.4)
supervisor (0.4.12)

正如您所发现的,问题在于所有其他烹饪书都将依赖于普通的
服务
资源。当您使用
service
时,它将默认使用Chef为您的平台设置的服务(或者在v12运行时确定它应该是什么)

服务
资源 解决这个问题的一种方法是为主管创建一个完整的
服务
提供者。主管cookbooks light weight已经做了一些工作,因此扩展到完整、重型的官方服务提供商应该不会太难。然后呼叫
服务
可以转到主管

第一个问题是让您的服务支持
主管
。默认情况下,系统上安装的软件包将附带sysvinit、upstart或systemd配置,但很少(如果有)附带supervisor配置。这需要来自某个地方

下一个问题是您需要Chef来检测supervisor是否应该是默认的提供者,或者是您希望在supervisor下提供的服务的默认提供者。这是一个通用的解决方案,但在从Jira到Github的过程中,似乎没有完成任何工作,甚至没有完成任何工作

可能的解决办法 我能想到的解决这两个问题的方法是为你真正想要使用的任何一本烹饪书创建一个。在该手册中,您可以像使用
nginx

supervisor_service "nginx" do
  command       "nginx"
  process_name  "nginx"
  action        :enable
end
然后让
服务
资源使用supervisor提供者

Chef::Platform.set :platform => :linux, :resource => :service, :provider => Chef::Provider::Service::Supervisor
除此之外,所有其他配置都会传递给原始的底层食谱

尽管很少有人会对
服务
造成麻烦,但底层的烹饪书中仍然可以包含重置该提供者的逻辑。另外,我不确定
Chef::Platform.set
的作用范围。除了ymmv,我猜整个过程都是这样


基本上,对于支持标准服务管理器的服务,请使用标准服务管理器。生活会更轻松

是的,我想标准服务可以。为什么要把事情复杂化?但我感到惊讶的是,例如,在主管食谱中没有提到这一点。厨师似乎很有权势,但我发现自己经常在黑暗中跌跌撞撞。没错,主管应该是提到这一点的地方。也许为自述文件创建一个git请求?虽然我说使用默认的服务管理器会更容易,但即使尝试上面的方法,也会教你很多关于Chef如何工作的知识。在我创建和调试了一些完整的烹饪书(包括图书馆和重量级的提供者/资源)并对其内部进行了一些修改(修补了windows服务提供者)之后,Chef才真正开始对我有意义。虽然它是一个很好的简单的DSL在上面,有很多复杂的下面实现这一点。
supervisor_service "nginx" do
  command       "nginx"
  process_name  "nginx"
  action        :enable
end
Chef::Platform.set :platform => :linux, :resource => :service, :provider => Chef::Provider::Service::Supervisor