Comment puis-je déployer des mises à niveau et des redémarrages du système d'exploitation avec Puppet ou MCollective?

8

Je recherche le meilleur moyen d'effectuer des mises à niveau régulières et continues pour mon infrastructure.

En règle générale, cela implique de le faire sur chaque hôte, un à la fois:

sudo yum update -y && sudo reboot

Mais, je frappe les limites de ce qui est évolutif.

Je souhaite redémarrer un seul nœud à la fois dans chacun de mes rôles, afin que, par exemple, je ne supprime pas tous mes équilibreurs de charge ou membres de cluster DB en même temps.

Idéalement, je voudrais faire quelque chose comme:

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

Mais cela ne semble pas tout à fait exister. Je ne sais pas si l'utilisation de l'agent "shell" est la meilleure approche non plus?

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

Suis-je en train de regarder le mauvais type d'outil pour ce travail? Y a-t-il quelque chose de mieux pour gérer ce genre de redémarrages continus, mais que je peux en quelque sorte me connecter avec mes rôles assignés à Puppet, afin que je puisse être à l'aise de ne pas supprimer quoi que ce soit d'important à la fois, mais que je peux toujours faire des mises à jour et des redémarrages parallèles?

pioto
la source
Pourquoi le redémarrage ( unix.stackexchange.com/a/28162/65367 )? Doit-il être une marionnette ou d'autres sollicitations sont-elles également autorisées?
030
Parce qu'il y a des mises à jour fréquentes du noyau Linux récemment, qui nécessitent un redémarrage.
pioto
D'accord. Je l'ai testé et cela fonctionne sur mon système. Pourriez-vous également le vérifier sur votre système?
030

Réponses:

2

Configuration

Déployer

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

et

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

sur les deux hôtes, à savoir test-server1et test-server2.

Prestations de service

Redémarrez mcollective sur les deux services:

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

et

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

Commandes

Exécutez les commandes suivantes sur le nœud du serveur mcollective:

L'hôte test-server2écoute:

[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

Redémarrez le 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

Le test-server2redémarre:

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


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

et il a été redémarré:

[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

Notez qu'il est également possible d'arrêter un hôte:

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

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

test-server2                             Shutdown initiated

Finished processing 1 / 1 hosts in 213.18 ms

Code d'origine

/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

Code modifié

/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

Commander

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

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


Finished processing 1 / 1 hosts in 1001.22 ms
030
la source
Beaucoup de bons détails, merci. Je cherchais une seule commande qui pourrait effectuer la mise à jour et le redémarrage un par un, par exemple les serveurs de test mco power update-and-reboot -I. mco appliquera ensuite la mise à jour et le redémarrage à un serveur, attendra qu'il revienne, puis appliquera au second.
Benjamin Goodacre