¿Cómo puedo implementar actualizaciones y reinicios continuos del sistema operativo con Puppet o MCollective?

8

Estoy buscando la mejor manera de realizar actualizaciones periódicas para mi infraestructura.

Por lo general, esto implica hacer esto en cada host, uno a la vez:

sudo yum update -y && sudo reboot

Pero, estoy llegando a los límites de que sea escalable.

Solo quiero reiniciar un nodo a la vez dentro de cada uno de mis roles, de modo que, por ejemplo, no elimine todos mis equilibradores de carga o miembros del clúster de base de datos, al mismo tiempo.

Idealmente, me gustaría hacer algo como:

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

Pero, eso no parece existir. No estoy seguro si usar el agente "shell" es el mejor enfoque, ¿tampoco?

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

Sin embargo, ¿estoy buscando la herramienta incorrecta para este trabajo? ¿Hay algo mejor para administrar este tipo de reinicios continuos, pero que de alguna manera puedo vincularme con mis roles asignados por Puppet, de modo que pueda estar seguro de que no estoy eliminando nada importante de una vez, pero que aún puedo hacer algunas actualizaciones paralelas y reinicios?

pioto
fuente
¿Por qué reiniciar ( unix.stackexchange.com/a/28162/65367 )? ¿Necesita ser un títere o también se permiten otras soluciones?
030
Debido a que hay actualizaciones frecuentes del kernel de Linux últimamente, que requieren un reinicio.
pioto
Okay. Lo he probado y funciona en mi sistema. ¿Podrías comprobarlo también en tu sistema?
030

Respuestas:

2

Configuración

Desplegar

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

y

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

en ambos hosts, es decir test-server1y test-server2.

Servicios

Reinicie mcollective en ambos servicios:

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

y

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

Comandos

Ejecute los siguientes comandos en el nodo del servidor mcollective:

El anfitrión test-server2está escuchando:

[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

Reinicia el 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

El se test-server2está reiniciando:

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


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

y se ha reiniciado:

[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

Tenga en cuenta que también es posible apagar un host:

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

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

test-server2                             Shutdown initiated

Finished processing 1 / 1 hosts in 213.18 ms

Código original

/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

Código modificado

/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

Mando

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

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


Finished processing 1 / 1 hosts in 1001.22 ms
030
fuente
Muchos buenos detalles, gracias. Estaba buscando un solo comando que pudiera realizar la actualización y el reinicio de uno en uno, por ejemplo, mco power update-and-reiniciar -I servidores de prueba. mco luego aplicaría la actualización y el reinicio a un servidor, esperaría a que volviera a funcionar y luego se aplicaría al segundo.
Benjamin Goodacre