如何部署滚动操作系统升级和使用Puppet或MCollective重新启动?

我正在寻找为我的基础架构执行定期滚动升级的最佳方式。

通常情况下,这涉及到每个主机上一次一个这样做:

sudo yum update -y && sudo reboot 

但是,我正在达到这个可扩展性的极限。

我只想在每个angular色中一次重新引导一个节点,这样,我就不会同时closures所有负载均衡器或数据库集群成员。

理想情况下,我想要做一些事情:

 for role in $(< roles_list.txt) ; do mco package update_all_and_reboot \ --batch 1 --batch-sleep 90 \ -C $role -F environment=test done 

但是,这似乎并不存在。 我不确定使用“shell”代理是否是最好的方法?

 mco shell run 'yum update -y && reboot' \ --batch 1 --batch-sleep 90 

不过,我只是在看这个工作的错误工具吗? 有什么更好的办法来pipe理这种types的滚动重启,但我可以以某种方式与我的木偶指派的angular色联系起来,这样我就可以放心,我没有一次性取下任何重要的东西,但我仍然可以做一些并行更新和重新启动?

组态

部署

 cd /usr/share/ruby/vendor_ruby/mcollective/application wget https://raw.githubusercontent.com/arnobroekhof/mcollective-plugin-power/master/application/power.rb 

 cd /usr/libexec/mcollective/mcollective/agent wget https://raw.githubusercontent.com/arnobroekhof/mcollective-plugin-power/master/agent/power.ddl wget https://raw.githubusercontent.com/arnobroekhof/mcollective-plugin-power/master/agent/power.rb 

在两台主机上,即test-server1test-server2

服务

在这两个服务上重新启动mcollective:

 [vagrant@test-server1 ~]# sudo service mcollective restart 

 [vagrant@test-server2 ~]# sudo service mcollective restart 

命令

在mcollective服务器节点上运行以下命令:

主机test-server2正在监听:

 [vagrant@test-server1 ~]$ mco ping test-server2 time=25.32 ms test-server1 time=62.51 ms ---- ping statistics ---- 2 replies max: 62.51 min: 25.32 avg: 43.91 

重新启动test-server2

 [vagrant@test-server1 ~]$ mco power reboot -I test-server2 * [ ============================================================> ] 1 / 1 test-server2 Reboot initiated Finished processing 1 / 1 hosts in 123.94 ms 

test-server2正在重新引导:

 [vagrant@test-server1 ~]$ mco ping test-server1 time=13.87 ms ---- ping statistics ---- 1 replies max: 13.87 min: 13.87 avg: 13.87 

它已经重新启动:

 [vagrant@test-server1 ~]$ mco ping test-server1 time=22.88 ms test-server2 time=54.27 ms ---- ping statistics ---- 2 replies max: 54.27 min: 22.88 avg: 38.57 

请注意,也可以closures主机:

 [vagrant@test-server1 ~]$ mco power shutdown -I test-server2 * [ ============================================================> ] 1 / 1 test-server2 Shutdown initiated Finished processing 1 / 1 hosts in 213.18 ms 

原始代码

/usr/libexec/mcollective/mcollective/agent/power.rb

 module MCollective module Agent class Power<RPC::Agent action "shutdown" do out = "" run("/sbin/shutdown -h now", :stdout => out, :chomp => true ) reply[:output] = "Shutdown initiated" end action "reboot" do out = "" run("/sbin/shutdown -r now", :stdout => out, :chomp => true ) reply[:output] = "Reboot initiated" end end end end # vi:tabstop=2:expandtab:ai:filetype=ruby 

/usr/libexec/mcollective/mcollective/agent/power.ddl

 metadata :name => "power", :description => "An agent that can shutdown or reboot them system", :author => "A.Broekhof", :license => "Apache 2", :version => "2.1", :url => "http://github.com/arnobroekhof/mcollective-plugins/wiki", :timeout => 5 action "reboot", :description => "Reboots the system" do display :always output :output, :description => "Reboot the system", :display_as => "Power" end action "shutdown", :description => "Shutdown the system" do display :always output :output, :description => "Shutdown the system", :display_as => "Power" end 

/usr/share/ruby/vendor_ruby/mcollective/application/power.rb

 class MCollective::Application::Power<MCollective::Application description "Linux Power broker" usage "power [reboot|shutdown]" def post_option_parser(configuration) if ARGV.size == 1 configuration[:command] = ARGV.shift end end def validate_configuration(configuration) raise "Command should be one of reboot or shutdown" unless configuration[:command] =~ /^shutdown|reboot$/ end def main mc = rpcclient("power") mc.discover :verbose => true mc.send(configuration[:command]).each do |node| case configuration[:command] when "reboot" printf("%-40s %s\n", node[:sender], node[:data][:output]) when "shutdown" printf("%-40s %s\n", node[:sender], node[:data][:output]) end end printrpcstats mc.disconnect end end # vi:tabstop=2:expandtab:ai 

修改后的代码

/usr/libexec/mcollective/mcollective/agent/power.ddl

 metadata :name => "power", :description => "An agent that can shutdown or reboot them system", :author => "A.Broekhof", :license => "Apache 2", :version => "2.1", :url => "http://github.com/arnobroekhof/mcollective-plugins/wiki", :timeout => 5 action "update-and-reboot", :description => "Reboots the system" do display :always output :output, :description => "Reboot the system", :display_as => "Power" end 

/usr/libexec/mcollective/mcollective/agent/power.rb

 module MCollective module Agent class Power<RPC::Agent action "update-and-reboot" do out = "" run("yum update -y && /sbin/shutdown -r now", :stdout => out, :chomp => true ) reply[:output] = "Reboot initiated" end end end end # vi:tabstop=2:expandtab:ai:filetype=ruby 

命令

 [vagrant@test-server1 ~]$ mco power update-and-reboot -I test-server2 * [ ============================================================> ] 1 / 1 Finished processing 1 / 1 hosts in 1001.22 ms