Computador de administrador único para sistemas com conta apenas regular na rede

7

Como posso ter sistemas com apenas uma conta regular com tarefas administrativas gerenciadas por um único computador?

Eu simplesmente quero poder adicionar / remover software em todos os computadores de um único sistema. Atacado - não fazer logon individualmente em cada computador e fazer o que precisa ser feito. Eu posso fazer isso fisicamente ou pelo SSH, mas com uma centena de computadores, isso não é realmente uma opção que eu gostaria de considerar.

    
por Oxwivi 10.05.2011 / 19:09

5 respostas

11

Para gerenciar várias máquinas a partir de um computador central, você pode tentar aprender uma plataforma de gerenciamento de sistema, como Puppet . Ele permite que você gerencie várias máquinas (fantoches) de uma máquina principal (mestre de fantoches). Dependendo do seu cenário, pode ser um pouco exagerado, mas é uma excelente ferramenta para gerenciar muitas máquinas a partir de um ponto central de controle. Também torna muito fácil configurar novas máquinas (ou reinstalar as antigas), já que você pode extrair toda a configuração, listas de pacotes, etc. do servidor.

Aqui está um link para um guia de instruções do ubuntu para instalar o & amp; teste puppetmaster.

    
por Egil 13.05.2011 / 09:06
5

Ocultar administradores

Pelo menos um usuário administrativo é necessário em cada sistema, porque no Ubuntu uma conta root distinta é desativada * . No entanto, seria possível ocultar esse usuário "administrador" do login do gdm adicionando a seguinte linha em /etc/gdm/custom.conf :

[greeter]
Exclude=nobody,administrator

Podemos restringir ainda mais o acesso de leitura de usuários não administrativos a /home/administrator/ .

Para tarefas administrativas, fazemos login localmente como usuário administrador (por exemplo, na linha de comando ou escolhendo outros na GUI), ou remotamente via ssh.

Defina ssh_config

Para emitir um comando para várias máquinas remotas, precisamos definir um arquivo de configuração em ~/.ssh/ssh_config onde listamos os detalhes necessários para efetuar login em nossas máquinas remotas e onde podemos definir nomes convenientes para os clientes:

# ssh configuration
Host remote1
    HostName 192.168.0.1
    Port 22
    User USERNAME

Host remote2
    HostName 192.168.0.2
    Port 22
    User USERNAME

Opções adicionais podem ser necessárias para controlar ainda mais os detalhes da sessão (como desabilitar a autenticação por senha).

Executar comando em vários clientes

Agora escrevemos um script que se conecta a um cliente após o outro para executar um determinado comando:

#!/bin/bash

# run a command on multiple remotes   

REMOTES=;shift
COMMAND=;shift

for remote in $REMOTES
do
    echo $remote
    ssh -oConnectTimeout=10 $remote $COMMAND
done

Se este script foi nomeado remote_command.sh , podemos executar qualquer comando em nossas máquinas remotas 1-X invocando:

remote_command "remote1 remote2 ... remote<X>" "<COMMAND>" > remote_command.log

Dependendo das necessidades individuais, podemos ler uma lista de $ REMOTES a partir de um arquivo ou podemos usar um padrão regular para nomes dos controles remotos para uso conveniente do script. Se os clientes remotos não mudarem, poderíamos também codificar todos os nomes neste script para invocá-lo apenas com o comando.

* A reativação da conta root (definindo uma senha válida para root com passwd root <password> em um shell raiz) é desencorajada à medida que as desvantagens aumentam.

    
por Takkat 10.05.2011 / 21:43
3

Não é exatamente barato, nem open source, mas talvez o Landscape da Canonical possa ajudar.

    
por Javier Rivera 13.05.2011 / 09:31
3

Se você estiver usando seu próprio repositório local (como eu acho que você deveria se você está trabalhando em uma escola para cortar os requisitos de largura de banda), você poderia apenas fazer um deb com dependências do software que você deseja. Então sempre que você atualizar o deb, se houver um cron job de atualização de instalação que seja executado como root ou o que acontece magicamente. Você não precisa de uma grande quantidade de controle direto em cada PC. Eu faria isso com manipulação de pacotes. Você pode até mesmo empurrar scripts de execução única desta maneira se tiver uma "tarefa de pós-instalação" embutida no deb.

    
por RobotHumans 16.05.2011 / 22:08
3

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.

  1. Crie uma conta diferente não raiz na estação da estação de gerenciamento.
  2. Execute ssh-keygen para obter um par de chaves SSH. Não forneça nenhuma senha.
  3. Crie uma conta separada nos clientes. O Takkat mencionou como excluí-lo da janela de login do Gnome.
  4. 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.

    
por Aleksandr Levchuk 18.05.2011 / 20:48