Я не знаю никакого программного обеспечения интернет-кафе, которое бы это сделало, и я думаю, что что-то вроде кукольного или шеф-повара будет излишним. Вы можете создать очень простую настройку на основе SSH, которая будет работать.
Допустим, у вас есть 20 клиентов (10.0.0.101 - 10.0.0.120) и 1 станция управления (10.0.0.1).
Все следующие шаги могут быть протестированы изначально на одном клиенте только для проверки.
Сделать правило брандмауэра для всех клиентов только для всех клиентов. принять новые соединения из 10.0.0.1
Возможно, вы можете открыть другой вопрос об этом. Я также могу оказать некоторую помощь с iptables, но у меня нет опыта работы с новыми правилами брандмауэра Ubuntu.
Вам нужно будет иметь Служба SSH работает на всех клиентах.
Создайте отдельную учетную запись без полномочий root на станции станции управления. Запустите ssh-keygen, чтобы получить пару ключей SSH. Не указывайте пароль. Создайте отдельную учетную запись для клиентов. Takkat упомянул, как исключить его из окна входа в Gnome. Добавьте учетную запись в sudoers (например, с помощью sudo visudo). Добавьте эту строку: aptaccount1 ALL=(silktree) NOPASSWD: /usr/bin/apt-get NOPASSWD важен, потому что вам нужно, чтобы установки запускались без запроса пароля для каждого клиента.Теперь вы можете проверить. С вашей рабочей станции управления:
ssh 10.0.0.101 sudo apt-get update
Теперь вот где мой вклад входит. Я использовал этот скрипт около 3 лет и am действительно доволен этим. Он выполняет команду ssh параллельно со многими узлами, печатающими выходные и / или ошибки.
Вам нужно будет установить ruby на станции управления apt-get install ruby и поместить все ваши клиенты в список в / etc / managed-clients:
n01
n02
n03
n04
А также на станции управления добавьте /etc/hosts:
10.0.0.101 n01
10.0.0.102 n02
10.0.0.103 n03
10.0.0.103 n04
Затем сохраните этот скрипт в /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
Код был рассмотрен для хорошего стиля кодирования, и здесь есть несколько скриншотов: https://codereview.stackexchange.com/questions/1180/ruby-script-on-all-nodes-run- для обучения, но у меня не было времени, чтобы представить эти предложения.
Протестируйте следующим образом:
on-all-nodes-run echo hi
n01 : hi
n02 : hi
n03 ERROR: Timeout, server not responding.
n04 : hi
Теперь вы должны иметь возможность устанавливать и (извините, у меня есть только пример show с aptitude, но с 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
[d28 ] Если у вас более 10-20 клиентов, то в дополнение к вышеприведенному сценарию вы должны найти способ переустановки жестких дисков с помощью чего-то вроде https://codereview.stackexchange.com/questions/1180/ рубиново-скрипт-на-все-узлы запустить обмен на преподавание . Таким образом, вы можете сэкономить некоторое время (добавив новый клиент и т. Д.) И убедитесь, что все одинаково для всех клиентов. На практике я использую on-all-nodes-run 100 раз в год. Я повторно переписываю с Персеем всех клиентов несколько раз в год.