Como implantar atualizações e reinicializações contínuas do SO com Puppet ou MCollective?

8

Estou procurando a melhor maneira de realizar atualizações contínuas regulares para minha infraestrutura.

Normalmente, isso envolve fazer isso em cada host, um de cada vez:

sudo yum update -y && sudo reboot

Mas estou atingindo limites de ser escalável.

Desejo reiniciar apenas um nó de cada vez em cada uma das minhas funções, para que, digamos, não abandone todos os meus balanceadores de carga ou membros de cluster do DB ao mesmo tempo.

Idealmente, eu gostaria de fazer 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

Mas, isso não parece existir. Não tenho certeza se o uso do agente "shell" é a melhor abordagem, também?

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

Estou apenas olhando para o tipo errado de ferramenta para este trabalho? Existe algo melhor para gerenciar esse tipo de reinicializações contínuas, mas que, de alguma forma, posso vincular-me às minhas funções atribuídas ao Puppet, para que eu possa me sentir confortável por não retirar nada importante de uma só vez, mas que ainda possa fazer algumas atualizações paralelas e reinicializações?

pioto
fonte
Por que a reinicialização ( unix.stackexchange.com/a/28162/65367 )? Precisa ser fantoche ou são permitidas outras soluções também?
030
Porque há atualizações freqüentes do kernel Linux ultimamente, o que requer reinicialização.
pioto
Está bem. Eu testei e funciona no meu sistema. Você poderia verificá-lo também no seu sistema?
030

Respostas:

2

Configuração

Implantar

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

e

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

nos dois hosts, ie test-server1e test-server2.

Serviços

Reinicie o mcollective nos dois serviços:

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

e

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

Comandos

Execute os seguintes comandos no nó do servidor mcollective:

O host test-server2está ouvindo:

[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

Reinicie o 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

O 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

e foi 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

Observe que também é possível desligar um 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

Comando

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

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


Finished processing 1 / 1 hosts in 1001.22 ms
030
fonte
Muitos bons detalhes, obrigado. Eu estava procurando por um único comando que pudesse executar a atualização e reinicialização uma de cada vez, por exemplo, mco power update-and-reboot -I test-servers. O mco aplicaria o update-and-reboot a um servidor, esperaria que ele voltasse e depois aplicaria ao segundo.
Benjamin Goodacre