Komputer z pojedynczym administratorem dla systemów z tylko zwykłym kontem w sieci

7

Jak mogę mieć systemy z tylko zwykłym kontem z zadaniami administracyjnymi zarządzanymi przez jeden komputer?

Po prostu chcę móc dodawać / usuwać oprogramowanie na wszystkich komputerach z jednego systemu. Hurt - nie pojedynczo logując się do każdego komputera i robiąc to, co należy zrobić. Mogę to zrobić fizycznie lub przez SSH, ale z setką komputerów, to naprawdę nie jest opcja, którą chciałbym wziąć pod uwagę.

    
zadawane Oxwivi 10.05.2011, 19:09
źródło

5 odpowiedzi

11

Aby zarządzać wieloma komputerami z komputera centralnego, możesz spróbować nauczyć się platformy zarządzania systemem, takiej jak Puppet . Pozwala na zarządzanie wieloma maszynami (marionetkami) z jednej głównej maszyny (puppetmaster). W zależności od scenariusza może to być trochę przesadzone, ale jest doskonałym narzędziem do zarządzania wieloma maszynami z centralnego punktu kontroli. Ułatwia także konfigurowanie nowych komputerów (lub ponowne instalowanie starych), ponieważ można pobrać całą konfigurację, listy pakietów itp. Z serwera.

Oto link do przewodnika po sposobie instalowania & amp; przetestuj puppetmaster.

    
odpowiedział Egil 13.05.2011, 09:06
źródło
5

Ukryj administratorów

Przynajmniej jeden użytkownik administracyjny jest potrzebny w każdym systemie, ponieważ w Ubuntu odrębne konto root jest wyłączone * . Mimo to możliwe byłoby ukrycie tego "administratora" użytkownika z gdm login przez dodanie następującego wiersza w /etc/gdm/custom.conf :

[greeter]
Exclude=nobody,administrator

Możemy dodatkowo ograniczyć dostęp do odczytu dla użytkowników nieadministracyjnych do /home/administrator/ .

W przypadku zadań administracyjnych logujemy się lokalnie jako administrator użytkownika (np. w wierszu poleceń lub wybierając inne w GUI) lub zdalnie przez ssh.

Zdefiniuj ssh_config

Aby wydać polecenie do wielu zdalnych maszyn, musimy zdefiniować lokalny plik konfiguracyjny w ~/.ssh/ssh_config gdzie podajemy szczegóły potrzebne do zalogowania się na naszych zdalnych komputerach i gdzie możemy zdefiniować wygodne nazwy dla klientów:

# ssh configuration
Host remote1
    HostName 192.168.0.1
    Port 22
    User USERNAME

Host remote2
    HostName 192.168.0.2
    Port 22
    User USERNAME

Dodatkowe opcje mogą być potrzebne do dalszego kontrolowania szczegółów sesji (takich jak wyłączanie uwierzytelniania hasła).

Uruchom polecenie na wielu klientach

Teraz piszemy skrypt, który łączy się z jednym klientem po drugim, aby uruchomić daną komendę:

#!/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

Jeśli ten skrypt został nazwany remote_command.sh , jesteśmy w stanie uruchomić dowolne polecenie na naszych zdalnych maszynach 1-X, wywołując:

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

W zależności od indywidualnych potrzeb możemy odczytać listę $ REMOTES z pliku lub możemy użyć standardowego wzorca dla nazw pilotów dla wygodnego użycia skryptu. Jeśli klienci zdalni nie ulegną zmianie, możemy również zakodować wszystkie nazwy w tym skrypcie, aby wywołać je tylko za pomocą komendy.

* Ponowne włączenie konta root (poprzez określenie prawidłowego hasła dla root'a z passwd root <password> w powłoce root) jest zniechęcane jako wada przeważająca.

    
odpowiedział Takkat 10.05.2011, 21:43
źródło
3

Nie jest to tanie, ani open source, ale może pomóc Krajobraz firmie Canonical.

    
odpowiedział Javier Rivera 13.05.2011, 09:31
źródło
3

Jeśli używasz własnego lokalnego repo (jak myślę, że powinieneś, jeśli pracujesz w szkole, aby zmniejszyć wymagania dotyczące przepustowości), możesz po prostu zrobić deb z zależnościami oprogramowania, które chcesz. Następnie za każdym razem, gdy aktualizujesz deb, jeśli jest zainstalowane zadanie aktualizacji cron, które działa jako root lub cokolwiek, co to magicznie się dzieje. Nie potrzebujesz dużej ilości bezpośredniej kontroli na każdym komputerze. Zrobiłbym to z manipulacją pakietami. Możesz nawet wcisnąć jednorazowe skrypty w ten sposób, jeśli masz wbudowane w deb zadanie "poinstalacyjne".

    
odpowiedział RobotHumans 16.05.2011, 22:08
źródło
3

Nie znam żadnego oprogramowania do kawiarenek internetowych, które by to zrobiło i myślę, że coś w stylu Kukiełki lub Szefa Kuchni byłoby przesadą. Możesz zbudować bardzo prostą konfigurację opartą na SSH, która działałaby.

Powiedzmy, że masz 20 klientów (10.0.0.101 do 10.0.0.120) i 1 stanowisko zarządzania (10.0.0.1).

Wszystkie poniższe kroki można przetestować początkowo tylko na 1 kliencie, aby przetestować różne rzeczy. Wstępna konfiguracja będzie musiała zostać wykonana ręcznie na wszystkich klientach.

Krok 1: Zwiększ bezpieczeństwo (opcjonalnie?)

Utwórz regułę zapory ogniowej dla wszystkich klientów, aby akceptować tylko nowe połączenia z 10.0.0.1

Może uda ci się otworzyć inne pytanie na ten temat. Mogę również zapewnić pomoc w iptables , ale nie mam doświadczenia z nowymi regułami zapory Ubuntu.

Krok 2: Nawiąż połączenie

Konieczne byłoby uruchomienie usługi SSH na wszystkich klientach.

  1. Utwórz oddzielne konto użytkownika innego niż root na stacji stacji zarządzania.
  2. Uruchom ssh-keygen , aby uzyskać parę kluczy SSH. Nie podawaj żadnych haseł.
  3. Utwórz osobne konto na klientach. Takkat wspomniał, jak wykluczyć go z okna logowania Gnome.
  4. Dodaj konto do sudoers (np. z sudo visudo ). Dodaj tę linię:

    aptaccount1 ALL=(silktree) NOPASSWD: /usr/bin/apt-get

    NOPASSWD jest ważny, ponieważ będziesz potrzebować instalacji bez pytania o hasło dla każdego klienta.

Teraz możesz testować. Z poziomu stacji roboczej zarządzania uruchom:

ssh 10.0.0.101 sudo apt-get update

Krok 3: Połącz się ze wszystkimi równolegle

Tutaj jest mój wkład. Użyłem tego skryptu przez około 3 lata i jestem z niego bardzo zadowolony. Uruchamia polecenie ssh równolegle do wielu węzłów drukujących ładnie wydruki i / lub błędy.

Musisz zainstalować ruby ​​na stacji zarządzającej apt-get install ruby i umieścić wszystkie hosty swoich klientów na liście w / etc / managed-clients:

n01
n02
n03
n04

A także na stacji zarządzania dodaj do /etc/hosts :

10.0.0.101 n01
10.0.0.102 n02
10.0.0.103 n03
10.0.0.103 n04

Następnie zapisz ten skrypt w /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

Kod został sprawdzony pod kątem dobrego stylu kodowania i istnieje kilka zrzutów ekranu: link ale nigdy nie miałem czasu, aby przedstawić te sugestie. Kod działa tak jak jest.

Testuj tak:

on-all-nodes-run echo hi
n01      : hi
n02      : hi
n03 ERROR: Timeout, server not responding.
n04      : hi

Krok 4: Zainstaluj oprogramowanie równolegle

Teraz powinieneś móc instalować i aktualizować oprogramowanie w ten sposób (przykro mi, mam tylko przykład show z aptitude, ale powinno być możliwe zrobienie tego samego z 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

Ostatnia uwaga

Jeśli masz ponad 10-20 klientów, a następnie dodatkowo do powyższego skryptu, powinieneś znaleźć sposób na ponowne dostarczenie twardych dysków za pomocą czegoś w stylu Perceus . W ten sposób możesz zaoszczędzić sobie trochę czasu (dodając nowego klienta itp.) I upewnić się, że wszystko jest takie samo dla wszystkich klientów. W praktyce używam on-all-nodes-run 100s razy w roku. Ponownie obrazuję u Perceusa wszystkich klientów kilka razy w roku.

    
odpowiedział Aleksandr Levchuk 18.05.2011, 20:48
źródło

Przeczytaj inne pytania na temat tagów