11

我正在寻找关于厨师的重启机制如何在幕后工作的解释。我在网上找不到任何文档,而且我在试图追踪代码时遇到了困难(触发器是令人毛骨悚然的远距离动作)。

让我们具体看一下nginx,并假设我们使用的是厨师服务器而不是chef-solo(我不知道这是否会有所不同)。

我在食谱中有这个(例如):

template '/etc/nginx/nginx.conf' do
  source 'nginx.cfg.erb'
  owner "root"
  group "root"
  mode 00755
  notifies :reload, "service[nginx]", :delayed
end

notifies :reload位意味着它会触发重新加载,并且:delayed意味着它将在chef-client运行结束时发生。这在幕后是如何运作的?我在跟踪执行线程时遇到了麻烦。

必须在某个地方chef-client运行service nginx reload或沿着这些路线运行。这是在哪里以及如何定义的?

4

2 回答 2

18

notifies发送另一个 Chef 资源做某事的通知。

在您的示例中,它告诉service[nginx]资源:reload. service[nginx]是一个service资源,其namenginx.

为此,service[nginx]必须run_list在某个时候在您的节点中声明。否则,Chef 会抛出错误。通常,这要么由用户在配方中手动完成,要么通过依赖项(例如,theapplicationnginxcookbooks)来完成。

Chef 运行命令的确切方式reload取决于service[nginx]资源的声明方式,但它通常取决于底层操作系统(这是使用此类工具的优点之一——它从您那里抽象出许多较低级别的细节并允许您跨多个平台使用相同的代码)。

在文档的语法部分中,service您会发现:

  • service 告诉 chef-client 在 chef-client 运行期间使用以下提供程序之一:Chef::Provider::Service::Init, Chef::Provider::Service::Init::Debian, Chef::Provider::Service::Upstart, Chef::Provider::Service::Init::Freebsd, Chef::Provider::Service::Init::Gentoo, Chef::Provider::Service::Init::Redhat, Chef::Provider::Service::Solaris, Chef::Provider::Service::Windows, 或Chef::Provider::Service::Macosx. chef-client 将根据 Ohai 收集的数据在运行开始时检测平台。平台确定后,主厨-客户将确定正确的提供者
于 2013-08-20T12:12:40.103 回答
2

厨师 doco中描述了该功能。

如果配置文件的内容发生变化,这将触发 nginx 服务的重新加载。“延迟”设置意味着重新加载操作发生在主厨运行结束时。这个想法是厨师运行可能会更改多个配置文件,并且您希望最后一次重新加载而不是每个更改的文件(这是“立即”选项)。

于 2013-08-19T22:25:59.817 回答