1. 在每个客户端服务器上

1. 在每个客户端服务器上

我很好奇是否有一种便捷的方法可以从中央位置将更新推送到多个 Ubuntu 服务器,而不是远程访问每个服务器并手动更新它们。如果这个中央位置能够在更新需要时重新启动系统,那就更好了。

答案1

关键词是配置管理。我为此使用的一个工具是Ansible。您可以使用 YAML 文件表达所需的配置,Ansible 会处理所有事情。当然,您也可以使用它重新启动主机,请参阅这个答案这也给你提供了它的外观的第一印象。

还有其他选择,例如木偶, 或者厨师

答案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

相关内容