我对这些脚本很陌生,因此需要帮助来解决这个问题。
我们有大约 3000 台虚拟机和 450 台物理服务器,它们都是基于 Linux 的服务器(其中一些是从 9.x 开始的 ubuntu,一些是从 8.X 开始的 Susu,大多数是从 4.x 到 7.4 的 RHEL),我需要在所有这些服务器各自的 /etc/hosts 文件中添加一些带有 IP 详细信息的主机名条目。
我在每台服务器上都有不同的用户,他们拥有完整的 sudoers 访问权限,因此我创建了一个包含主机名、用户名和密码格式的 CSV 文件。其中包含登录所需的详细信息。文件名为“hostname_logins.csv”
我需要将一个文件(即 hostname_list)上传到每个服务器,然后在每个服务器的主机文件中更新相同的详细信息。
我将使用一台 RHEL 6 服务器运行此脚本。(所有其他主机都可以从此服务器解析并可访问,我已经确认了这一点。)
因此需要帮助来修复该脚本。
脚本不确定其中有什么问题,因为我对脚本还不熟悉:
#!/bin/bash
while read hostname_login user_name user_password
do
scp -p ./hostname_list $user_name:$user_password@$hostname_login:/tmp
ssh -eS $user_name:$user_password@$hostname_login [bash -c "echo rishee | sudo -S mv /tmp/hostname_list ./hostname_list && cp -p /etc/hosts /etc/hosts.bkp && cat ./hostname_list >> /etc/hosts && rm -f ./hostname_list"]
done < hostname_logins.csv
我需要将其作为可以在所有这些服务器上运行的单个脚本。提前致谢。
答案1
让你的脚本能够重复执行而没有副作用(幂等)总是一个好主意...在上面,你正在备份关键文件 /etc/hosts,但是你在下次运行时会擦除同一个备份 - 当 /etc/hosts 损坏时,非常危险,甚至致命
运行一个初步脚本,简单地将 /etc/hosts 复制到某个工作文件,然后针对该工作副本运行脚本,然后一旦它在某些玩具服务器上运行正常,然后使用实际的 /etc/hosts 发出脚本
上述命令集混合使用了您的用户 ID 和 sudo,这将导致您出现权限错误...我建议您将下面的文件 scp 到每个框上,然后在每个远程框上以 sudo 身份执行它...理解 /etc/hosts 中的语法并确认您附加的行符合良好的语法
#!/bin/bash
set -o errexit # exit on any error
set -o xtrace # print command prior to execution
hostname_file=/root/hostname_list
working_hosts=/etc/hosts.working
mv /tmp/hostname_list $hostname_file
cp -p /etc/hosts $working_hosts
cat $hostname_file >> $working_hosts
rm $hostname_file
echo here is contents of file $working_hosts
cat $working_hosts
以上不是完成的脚本,但它将带你完成 90% 的工作...在玩具服务器上,一旦你修改了上述内容以使用真实的 /etc/hosts 文件,请确保重新启动该玩具服务器,然后检查是否正常