Chef - 在不同节点上触发重启服务

时间:2015-12-15 10:00:00

标签: chef chef-recipe

我有一个主节点和客户端节点用于我想用Chef管理的某些应用程序。它们都指向一个包含配置文件的共享文件夹,其中包含有关所有客户端和主服务器的信息。因此,每次安装客户端应用程序(在另一个客户机节点上)时,应重新加载/重新启动主节点上的应用程序 - 并将其主机名添加到该共享文件中。

任何想法如何从客户端节点触发主节点上Master应用程序的重启?

1 个答案:

答案 0 :(得分:2)

停止使用共享文件,这是您体系结构中的SPOF,并且会遇到很多并发问题。

Chef有一个功能,它是search

考虑到这一点,我会在你的my_app食谱中有两个食谱,名为master.rb和client.rb

在client.rb中,除了安装客户端外,还要在节点中添加标签。 (或使用角色来定义哪些是客户等)

tag('my_app_client') if !tagged?('my_app_client')

master = search(:node, 'tag:my_app_master') 
slaves = search(:node, 'tag:my_app_client') 

#Tricky line to add current node to the list of slaves, as in first run it won't have been indexed by chef.
slaves[] << node if !slaves.any? { |n| n['hostname'] == node['hostname'] } 

return is master.empty? # to avoid trying to write a file without master

template '/local/path/to/conffile' do
  source 'config.erb' 
  variables({ 
    :master => master
    :slaves => slaves
  })
end
在master.rb中

,重复搜索和模板:

tag('my_app_master') if !tagged?('my_app_master')

master = search(:node, 'tag:my_app_master') 
slaves = search(:node, 'tag:my_app_client') 

#Tricky line to add current node as the master, as in first run it won't have been indexed by chef.
master = node if !master.any? { |n| n['hostname'] == node['hostname'] } 

template '/local/path/to/conffile' do
  source 'config.erb' 
  variables({ 
    :master => master
    :slaves => slaves
  })
  notify :restart,"service[my_app_service]", :immediately
end

在config.erb文件中,例如:

master_host: <%= @master['hostname'] %>
<%- @slaves.each_with_index do |s,i|
  slave_host<%= i %>: <%= s['hostname'] %>
<%- end %>

要管理一些索引延迟,如果没有仔细规划厨师运行的订单,每个macine上的文件可能会有点不同步。

如果您让厨师定期运行,它会使整个群集在最大运行间隔内收敛两倍。