Eu não conheço nenhum software de internet-café que faria isso e acho que algo como Puppet ou Chef seria um exagero. Você pode criar uma configuração muito simples baseada em SSH que funcione.
Digamos que você tenha 20 clientes (10.0.0.101 a 10.0.0.120) e 1 estação de gerenciamento (10.0.0.1).
Todas as etapas a seguir podem ser testadas inicialmente em apenas um cliente para testar as coisas. A configuração inicial precisará ser executada manualmente em todos os clientes.
Passo 1: Torne-o mais seguro (Opcional?)
Crie uma regra de firewall em todos os clientes para aceitar apenas novas conexões de 10.0.0.1
Talvez você possa abrir uma outra questão sobre isso. Eu também posso fornecer alguma ajuda com o iptables
, mas não tenho experiência com as novas regras de firewall do Ubuntu.
Etapa 2: estabeleça uma conexão
Você precisaria ter o serviço SSH em execução em todos os clientes.
- Crie uma conta diferente não raiz na estação da estação de gerenciamento.
- Execute
ssh-keygen
para obter um par de chaves SSH. Não forneça nenhuma senha.
- Crie uma conta separada nos clientes. O Takkat mencionou como excluí-lo da janela de login do Gnome.
-
Adicione a conta aos sudoers (por exemplo, com sudo visudo
). Adicione esta linha:
aptaccount1 ALL=(silktree) NOPASSWD: /usr/bin/apt-get
NOPASSWD é importante porque você precisará executar as instalações sem pedir uma senha para cada cliente.
Agora você pode testar. A partir da sua estação de trabalho de gerenciamento, execute:
ssh 10.0.0.101 sudo apt-get update
Passo 3: Conecte-se a todos em paralelo
Agora aqui é onde entra a minha contribuição. Eu usei este script por cerca de 3 anos e estou muito feliz com isso. Ele executa um comando ssh em paralelo a muitos nós imprimindo bem a saída e / ou erros.
Você precisaria instalar o ruby na estação de gerenciamento apt-get install ruby
e colocar todos os hosts de seus clientes em uma lista em / etc / managed-clients assim:
n01
n02
n03
n04
E também na estação de gerenciamento, adicione a /etc/hosts
:
10.0.0.101 n01
10.0.0.102 n02
10.0.0.103 n03
10.0.0.103 n04
Em seguida, salve este script em /usr/local/bin/on-all-nodes-run
#!/usr/bin/ruby
CLIENTS_FILE = "/etc/managed-clients"
require "open3"
# Non-interactive, no password asking, and seasonable timeouts
SSH_OPTIONS = ["-o PreferredAuthentications=publickey,hostbased,gssapi,gssapi-with-mic",
"-o ForwardX11=no",
"-o BatchMode=yes",
"-o SetupTimeOut=5",
"-o ServerAliveInterval=5",
"-o ServerAliveCountMax=2"
].join(" ")
SSH = "/usr/bin/ssh #{SSH_OPTIONS}"
MKDIR = "/bin/mkdir"
raise "Pleae give this command at least one argument" if ARGV.size < 1
COMMAND = ARGV[0..-1].join(' ')
output_o = {}
output_e = {}
IO_CONNECTIONS_TO_REMOTE_PROCESSES = {}
def on_all_nodes(&block)
nodes = []
File.open(CLIENTS_FILE) do |f|
while line = f.gets
i = line.split(' ').first
nodes.push(i)
end
end
nodes.sort.each {|n| block.call(n)}
end
# Create processes
on_all_nodes do |node|
stdin, stdout, stderr = Open3.popen3("#{SSH} #{node} \"#{COMMAND}\"")
IO_CONNECTIONS_TO_REMOTE_PROCESSES[node] = [stdin, stdout, stderr]
end
has_remote_errors = false
# Collect results
on_all_nodes do |node|
stdin, stdout, stderr = IO_CONNECTIONS_TO_REMOTE_PROCESSES[node]
stdin.close
e_thread = Thread.new do
while line = stderr.gets
line.chomp!
STDERR.puts "#{node} ERROR: #{line}"
has_remote_errors = true
end
end
o_thread = Thread.new do
while line = stdout.gets
line.chomp!
puts "#{node} : #{line}"
end
end
# Let the threads finish
t1 = nil
t2 = nil
while [t1, t2].include? nil
if t1.nil?
t1 = e_thread.join(0.1) # Gives 1/10 of a second to STDERR
end
if t2.nil?
t2 = o_thread.join(0.1) # Give 1/10 of a second to STDOUT
end
end
end
exit(1) if has_remote_errors
O código foi revisado para um bom estilo de codificação e há algumas capturas de tela aqui:
link
mas nunca tive tempo de apresentar essas sugestões. O código funciona bem como é.
Teste assim:
on-all-nodes-run echo hi
n01 : hi
n02 : hi
n03 ERROR: Timeout, server not responding.
n04 : hi
Etapa 4: instalar o software em paralelo
Agora você deve poder instalar e atualizar um software como este (desculpe, eu só tenho o exemplo show
com aptitude mas deve ser possível fazer o mesmo com apt-get
):
on-all-nodes-run sudo aptitude show pbzip2 \| grep State
n01 : State: not installed
n02 : State: not installed
n03 ERROR: Timeout, server not responding.
n04 : State: not installed
on-all-nodes-run echo "Yes" \| sudo apt-get install pbzip2
...
on-all-nodes-run sudo aptitude show pbzip2 \| grep State
n01 : State: installed
n02 : State: installed
n03 ERROR: Timeout, server not responding.
n04 : State: installed
Nota final
Se você tiver mais de 10 a 20 clientes, então além do script acima, você deverá encontrar uma maneira de reprovisionar os discos rígidos com algo como Perceus . Dessa forma, você pode economizar tempo (adicionar novo cliente, etc ...) e garantir que tudo seja igual em todos os clientes. Na prática, uso on-all-nodes-run
100s de vezes por ano. Eu re-imagem com Perceus todos os clientes algumas vezes por ano.