Как централизованно администрировать серверы Ubuntu [дубликат]

Мне интересно, есть ли удобный способ рассылать обновления на несколько серверов Ubuntu из центрального места, вместо того, чтобы удаленно заходить на каждый из них по отдельности и обновлять их вручную. Бонусные очки, если это центральное место сможет перезагружать системы, если это необходимо из-за обновлений.

1
задан 6 July 2017 в 15:07

2 ответа

Ключевое слово является управлением конфигурацией. Одним инструментом, который я использую с этой целью, является Ansible. Там Вы выражаете свою желаемую конфигурацию файлом YAML, и Ansible заботится обо всем этом. Конечно, можно также перезагрузить хосты с этим, видеть этот ответ, который также производит Вам первое впечатление от того, как это посмотрит.

Существуют также другие опции как Соль, Марионетка или Шеф-повар.

0
ответ дан 8 December 2019 в 04:46

Если Вам нравитесь Вы, может использовать мой сценарий, который я записал для своих серверов... там, всегда могли бы быть лучшие способы сделать это, но это делает то, что это должно ;)

1. На каждом клиент-сервере

a) сценарий обновления (этот также на сервере управления)

Сделайте сценарий в /usr/local/bin/update

#!/bin/bash

# First get sudo rights
sudo echo ""

echo -e "\e[92m UPDATE PACKAGE SOURCES \e[39m"
sudo apt update
echo -e "\e[92m UPGRADE TO NEW PACKAGES \e[39m"
sudo apt upgrade
echo -e "\e[92m UPGRADE DISTRIBUTION-PACKAGES \e[39m"
sudo apt dist-upgrade
echo -e "\e[92m AUTOREMOVE OLD PACKAGES \e[39m"
sudo apt autoremove
clear
if [ -f /var/run/reboot-required ]; then
  echo -e "\e[92m#####################################\e[39m"
  echo -e "\e[92m#                                   #\e[39m"
  echo -e "\e[92m#               DONE                #\e[39m"
  echo -e "\e[92m#                                   #\e[39m"
  echo -e "\e[92m# \e[91mNOTE: A reboot of the System is\e[92m   #\e[39m"
  echo -e "\e[92m#       \e[91mrequired in order to\e[92m        #\e[39m"
  echo -e "\e[92m#       \e[91mcomplete the Update!\e[92m        #\e[39m"
  echo -e "\e[92m#                                   #\e[39m"
  echo -e "\e[92m#####################################\e[39m"
else
  echo -e "\e[92m#####################################\e[39m"
  echo -e "\e[92m#                                   #\e[39m"
  echo -e "\e[92m#               DONE                #\e[39m"
  echo -e "\e[92m#                                   #\e[39m"
  echo -e "\e[92m#####################################\e[39m"

если Вы доверяете обновлениям, также можно использовать-y опцию, таким образом, Вы не должны взаимодействовать (большая часть времени; конечно, иногда Вам предлагают вход в зависимости от обновлений).

Сделайте это исполняемым файлом

chmod +x /usr/local/bin/update

b) rebootServer

сделайте сценарий в /usr/local/bin/rebootServer

#!/bin/bash

echo -n "0"
sudo reboot &> /dev/null
exit

и сделайте это исполняемым файлом

chmod +x /usr/local/bin/rebootServer

c) visudo

выполненный

sudo visudo

добавьте строки

<userName> ALL=NOPASSWD: /usr/local/bin/update
<userName> ALL=NOPASSWD: /usr/local/bin/rebootServer

сохраните и выйдите.
Это позволяет sudo пользователю работать rebootServer и update (и любой код/сценарий в них), не будучи продвинутым для ввода sudo пароля.

d) добавьте еще два сценария управления

Один в /usr/local/bin/sshResponse

#!/bin/bash

echo -n "0"

и один в /usr/local/bin/rebootResponse

#!/bin/bash

#!/bin/bash

if [ -f /var/run/reboot-required ];
then
   echo -n "1"
else
   echo -n "0"
fi

И сделайте их исполняемым файлом также

chmod +x /usr/local/bin/sshResponse
chmod +x /usr/local/bin/rebootResponse

Первый только используется для подтверждения рабочего соединения SSH (могли бы быть лучшие пути).
Второй используется для отображения позже, требуется ли перезагрузка на обновленных серверах.



2. На main/controle Сервере

a) ssh-keygen

Поскольку Вы не делаете не будет для ввода пароля на каждом входе в систему ssh, мы используем ключи. Выполненный

ssh-keygen

и следуйте инструкциям.

Теперь Вы передаете ключ к каждому клиент-серверу. Таким образом для каждого выполненного сервера (на сервере управления)

ssh-copy-id <usernameOnClient>@<clientServerIP>

после этого необходимо смочь соединиться с ssh с сервера управления, не будучи предложенным пароль.

b) сценарий генератора

Теперь сумасшедшая часть. Я использую следующую установку для автоматически сгенерированного:

  • отдельный Сценарий перезагрузки для каждого клиент-сервера в /usr/local/bin/rebootSERVERNAME
  • отдельный Сценарий обновления для каждого клиент-сервера в /usr/local/bin/updateSERVERNAME
  • a /usr/local/bin/rebootAllServers
  • a /usr/local/bin/updateAllServers (последний также обновляет сам сервер управления),

добавьте МОЙ СЦЕНАРИЙ ГЕНЕРАТОРА к /usr/local/bin/generateAllUpdateScripts и сделайте это исполняемым файлом

chmod +x /usr/local/bin/generateAllUpdateScripts

c) файл конфигурации

Наконец Вам нужен файл в /root/.virtualMachines из того, где генератор читает клиент-сервер. Это должно быть похожим, например.

ClientServer1 192.168.1.2
ClientServer2 192.168.1.3



3. Использование

a) добавьте клиент-серверы к /root/.virtualMachines

Сценарий генератора использует этот файл и читает клиент-серверную строку конфигураций для строки для генерации согласно сценариям. (Никакие пустые строки! Никакие пробелы, ни _ или - позволенный в Именах серверов!!)

b) генерируйте сценарии

просто выполненный

generateUpdateAllScripts

После окончания Вас должен смочь назвать любую из тех команд:

обновить все Серверы

выполняет сценарий обновления на каждой машине и дает сводку в конце, ли клиент-серверы, где обновлено и если перезагрузка требуется.

updateAllServers

перезагружать все Серверы

произошли перезагрузки все Серверы и в конце ожидают, пока все серверы не возвращаются онлайн или дисплеи ошибок,

rebootAllServers

обновите определенный сервер

updateSERVERNAME

перезагрузите определенный сервер

rebootSERVERNAME
0
ответ дан 8 December 2019 в 04:46

Другие вопросы по тегам:

Похожие вопросы: