Мне интересно, есть ли удобный способ рассылать обновления на несколько серверов Ubuntu из центрального места, вместо того, чтобы удаленно заходить на каждый из них по отдельности и обновлять их вручную. Бонусные очки, если это центральное место сможет перезагружать системы, если это необходимо из-за обновлений.
Ключевое слово является управлением конфигурацией. Одним инструментом, который я использую с этой целью, является Ansible. Там Вы выражаете свою желаемую конфигурацию файлом YAML, и Ansible заботится обо всем этом. Конечно, можно также перезагрузить хосты с этим, видеть этот ответ, который также производит Вам первое впечатление от того, как это посмотрит.
Существуют также другие опции как Соль, Марионетка или Шеф-повар.
Если Вам нравитесь Вы, может использовать мой сценарий, который я записал для своих серверов... там, всегда могли бы быть лучшие способы сделать это, но это делает то, что это должно ;)
Сделайте сценарий в /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
сделайте сценарий в /usr/local/bin/rebootServer
#!/bin/bash
echo -n "0"
sudo reboot &> /dev/null
exit
и сделайте это исполняемым файлом
chmod +x /usr/local/bin/rebootServer
выполненный
sudo visudo
добавьте строки
<userName> ALL=NOPASSWD: /usr/local/bin/update
<userName> ALL=NOPASSWD: /usr/local/bin/rebootServer
сохраните и выйдите.
Это позволяет sudo пользователю работать rebootServer
и update
(и любой код/сценарий в них), не будучи продвинутым для ввода sudo пароля.
Один в /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 (могли бы быть лучшие пути).
Второй используется для отображения позже, требуется ли перезагрузка на обновленных серверах.
Поскольку Вы не делаете не будет для ввода пароля на каждом входе в систему ssh, мы используем ключи. Выполненный
ssh-keygen
и следуйте инструкциям.
Теперь Вы передаете ключ к каждому клиент-серверу. Таким образом для каждого выполненного сервера (на сервере управления)
ssh-copy-id <usernameOnClient>@<clientServerIP>
после этого необходимо смочь соединиться с ssh с сервера управления, не будучи предложенным пароль.
Теперь сумасшедшая часть. Я использую следующую установку для автоматически сгенерированного:
/usr/local/bin/rebootSERVERNAME
/usr/local/bin/updateSERVERNAME
/usr/local/bin/rebootAllServers
/usr/local/bin/updateAllServers
(последний также обновляет сам сервер управления),добавьте МОЙ СЦЕНАРИЙ ГЕНЕРАТОРА к /usr/local/bin/generateAllUpdateScripts
и сделайте это исполняемым файлом
chmod +x /usr/local/bin/generateAllUpdateScripts
Наконец Вам нужен файл в /root/.virtualMachines
из того, где генератор читает клиент-сервер. Это должно быть похожим, например.
ClientServer1 192.168.1.2
ClientServer2 192.168.1.3
/root/.virtualMachines
Сценарий генератора использует этот файл и читает клиент-серверную строку конфигураций для строки для генерации согласно сценариям. (Никакие пустые строки! Никакие пробелы, ни _ или - позволенный в Именах серверов!!)
просто выполненный
generateUpdateAllScripts
После окончания Вас должен смочь назвать любую из тех команд:
выполняет сценарий обновления на каждой машине и дает сводку в конце, ли клиент-серверы, где обновлено и если перезагрузка требуется.
updateAllServers
произошли перезагрузки все Серверы и в конце ожидают, пока все серверы не возвращаются онлайн или дисплеи ошибок,
rebootAllServers
updateSERVERNAME
rebootSERVERNAME