Wie kann ich mit Puppet oder MCollective fortlaufende Betriebssystem-Upgrades und Neustarts bereitstellen?


8

Ich suche nach dem besten Weg, um regelmäßig rollierende Upgrades für meine Infrastruktur durchzuführen.

In der Regel wird dies auf jedem Host einzeln ausgeführt:

sudo yum update -y && sudo reboot

Aber ich stoße an die Grenzen einer Skalierbarkeit.

Ich möchte in jeder meiner Rollen jeweils nur einen Knoten neu starten, damit beispielsweise nicht alle meine Load Balancer oder DB-Cluster-Mitglieder gleichzeitig heruntergefahren werden.

Im Idealfall möchte ich etwas tun wie:

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

Aber das scheint nicht ganz zu existieren. Ich bin mir nicht sicher, ob die Verwendung des "Shell" -Agenten auch der beste Ansatz ist.

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

Schaue ich mir nur das falsche Werkzeug für diesen Job an? Gibt es etwas Besseres für die Verwaltung dieser Art von fortlaufenden Neustarts, aber dass ich mich irgendwie mit meinen von Puppet zugewiesenen Rollen verbinden kann, damit ich mich sicher sein kann, dass ich nicht alles Wichtige auf einmal ausschalte, sondern es trotzdem kann Führen Sie einige parallele Updates und Neustarts durch?


Warum der Neustart ( unix.stackexchange.com/a/28162/65367 )? Muss es eine Marionette sein oder sind auch andere Lösungen erlaubt?
030

Weil es in letzter Zeit häufig Linux-Kernel-Updates gibt, die einen Neustart erfordern.
Pioto

OK. Ich habe es getestet und es funktioniert auf meinem System. Könnten Sie es auch auf Ihrem System überprüfen?
030

Antworten:


2

Aufbau

Bereitstellen

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

und

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

auf beiden Hosts, dh test-server1und test-server2.

Dienstleistungen

Starten Sie mcollective auf beiden Diensten neu:

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

und

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

Befehle

Führen Sie die folgenden Befehle auf dem mcollective-Serverknoten aus:

Der Gastgeber test-server2hört zu:

[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

Starten Sie Folgendes neu 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

Das test-server2wird neu gestartet:

[vagrant@test-server1 ~]$ mco ping
test-server1                             time=13.87 ms


---- ping statistics ----
1 replies max: 13.87 min: 13.87 avg: 13.87

und es wurde neu gestartet:

[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

Beachten Sie, dass es auch möglich ist, einen Host herunterzufahren:

[vagrant@test-server1 ~]$ mco power shutdown -I test-server2

 * [ ============================================================> ] 1 / 1

test-server2                             Shutdown initiated

Finished processing 1 / 1 hosts in 213.18 ms

Originalcode

/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

Geänderter Code

/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

Befehl

[vagrant@test-server1 ~]$ mco power update-and-reboot -I test-server2

 * [ ============================================================> ] 1 / 1


Finished processing 1 / 1 hosts in 1001.22 ms

Viele gute Details, danke. Ich suchte nach einem einzelnen Befehl, mit dem das Aktualisieren und Neustarten nacheinander ausgeführt werden kann, z. B. mco power update-and-reboot -I-Testserver. mco wendet dann Update-and-Reboot auf einen Server an, wartet, bis es wieder hochgefahren ist, und wendet dann auf den zweiten Server an.
Benjamin Goodacre
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.