我很好奇是否有一种便捷的方法可以从中央位置将更新推送到多个 Ubuntu 服务器,而不是远程访问每个服务器并手动更新它们。如果这个中央位置能够在更新需要时重新启动系统,那就更好了。
答案1
答案2
如果您愿意,您可以使用我为我的服务器编写的脚本...可能总是有更好的方法来做到这一点,但它做了它应该做的事情;)
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) 重启服务器
编写脚本/usr/local/bin/rebootServer
#!/bin/bash
echo -n "0"
sudo reboot &> /dev/null
exit
并使其可执行
chmod +x /usr/local/bin/rebootServer
c) 维苏多
跑步
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. 在主/控制服务器上
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