我需要一个脚本来审查 200 台服务器的 IP 列表并获取 Ubuntu 操作系统信息并将其存入文件中。
我所有的服务器都是 Ubuntu 14 到 18 之间的版本。
SSH 是一种使用基于密钥的身份验证通过 RSA 密钥生成来访问每个服务器的重要方法。
我可以获得一些帮助来创建一个可以实现这一目标的脚本吗?
附加的文件可以放在通用 nfs 存储位置(server01:/file-storage /mnt/lsb-info
)。
该脚本应该执行以下任务:
- 审查来自以下来源的 IP 列表
IP_list.txt
- 登录到每个服务器
- 执行命令:
lsb_release -a
- 附加信息至
LSB_Release_Info.txt
答案1
由于您在 SSH 中使用基于密钥的身份验证,因此很容易在许多机器上自动运行命令。您可以编写一个简单的脚本来执行此操作,但实际上并不需要。您可以使用单个命令来完成此操作,例如:
xargs -a IP_list.txt -d'\n' -I{} ssh {} 'printf "\n%s:\n" {}; lsb_release -a' | tee -a LSB_Release_Info.txt
这ssh
将为 的每一行运行一个命令IP_list.txt
,将 行代入{}
。要使其正常工作,每行都应该是您要通过 SSH 连接的服务器的 IP 地址或主机名。例如,假设IP_list.txt
包含 行192.168.10.2
。那么为该行运行的 SSH 命令xargs
是:
ssh 192.168.10.2 'printf "\n%s:\n" 192.168.10.2; lsb_release -a'
该命令的作用ssh
是尝试连接到 192.168.10.2 并在非交互式 shell 中执行此代码:
printf "\n%s:\n" 192.168.10.2; lsb_release -a
它由两个命令组成。第一个命令打印一个空白行,然后打印行192.168.10.2:
。第二个命令是lsb_release -a
。
ssh
仅当您使用正确的凭据登录时,该命令才会成功:
- 正如我所写,你的当地的将使用用户名。如果不正确,则必须相应地修改命令。例如,如果所有机器的用户名都相同(例如,
foo
--那么您应该ssh foo@{}
在 的位置写入 )ssh {}
。 - 您可能知道,您需要使用身份验证代理缓存解密的私钥,以避免需要为每个
ssh
命令输入本地 SSH 密钥密码。我猜您已经设置好了;如果没有,请参阅man ssh-agent
。(运行eval "$(ssh-agent)"
后跟ssh-add
输入密码可能就足够了。)
xargs
将该命令的输出通过|
操作员传输到tee -a LSB_Release_Info.txt
节目你输出的同时也追加将其保存到(本地)文件LSB_Release_Info.txt
。错误消息不包含在文件中;这些消息只会显示给您。如果你想将它们包含在输出文件中,你可以使用|&
而不是|
,但你不太可能想要它们。更有可能的是,你可能仅有的想要查看错误消息,在这种情况下,您可以使用>>LSB_Release_Info.txt
而不是| tee -a LSB_Release_Info.txt
--,也就是说,只需重定向到文件,而不是通过管道传输到tee
。请注意,如果您在运行tee
时不使用-a
,或者如果您使用>
而不是>>
,那么您覆盖 LSB_Release_info.txt
而不是附加到它。
我建议先用一个只包含几个 IP 地址的输入文件来测试一下。按Ctrl+C通常可以成功停止长时间运行的命令,但我仍然建议在为所有服务器运行该命令之前进行一些测试以确保正确。例如,为了写这个答案,我在本地网络上用四个 IP 地址进行了测试,并将输出发送到我的终端(和LSB_Release_Info.txt
),如下所示:
192.168.10.2:
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.3 LTS
Release: 18.04
Codename: bionic
192.168.10.4:
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.6 LTS
Release: 16.04
Codename: xenial
192.168.203.128:
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu Eoan Ermine (development branch)
Release: 19.10
Codename: eoan
192.168.31.130:
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.3 LTS
Release: 18.04
Codename: bionic
这就是上面给出的命令的输出结果。您可以相应地调整命令,然后在生成所需的输出格式后在所有 200 台服务器上运行它。