我正在尝试创建一个ssh到多个服务器的脚本并运行它们的备份。服务器具有应包含的不同文件夹。
我尝试使用2个文件来执行此操作,该文件指定了主机名和应包含在备份中的文件夹。
[SERVER]
HOST=server1
SOURCE="/home"
SOURCE="/etc"
[SERVER]
HOST=server2
SOURCE=/home"
SOURCE="/etc"
SOURCE="/var"
[EOF]
一个从该文件读取并执行备份的文件。
while read host
do
for i in
rsync -chazP --fake-super --rsync-path="sudo rsync" --stats backup@$host:/home /var/backup/$host/
done
done < /var/backup/testscripts/hosts
当选项文件中只包含主机名时,这是脚本的第一个版本。
如何创建脚本以便读取主机变量,然后读取1 SOURCE行并执行备份,然后读取下一个SOURCE行并再次运行它。当它读取[SERVER]时,它应该重新开始,当涉及到[EOF]它应该结束。
我是脚本编写的初学者,所以欢迎所有的帮助和解释。
答案 0 :(得分:0)
我建议你从不同角度解决这个问题,以使其更简单。
首先,使/var/backup/testscripts/hosts
成为目录,而不是文件。然后,为每个主机创建一个名为&#34; SERVERNAME.backup_config&#34;的配置文件。每个文件的内容都是这样的:
/home
/etc
基本上,只是备份到该主机的目录列表。这样就无需解析配置文件。
config_dir=/var/backup/testscripts/hosts
for config_file in "$config_dir"/*.backup_config
do
host=${config_file##*/}
host=${host%.backup_config}
while IFS= read -r dir
do
rsync -chazP --fake-super --rsync-path="sudo rsync" --stats backup@host:"$dir" "/var/backup/$host/"
done<"$config_file"
done
本质上,我们的想法是在文件名中对服务器名称进行编码,这样文件就变成了一次只能读取一行的列表。对于像这样的简单情况,这可以是一种简单的配置文件的方法。如果每个配置项需要多个列表,则可以再执行一步:将每个服务器作为目录,并为所需的各种列表使用多个配置文件(对于不是的所有列表,可以使用多个配置文件)包含作业的列表,可以使用source
或.
来源阅读。
用于分配host
的行是shell扩展,它从文件路径中删除目录名,然后删除扩展名以确定服务器名称。你可以在这里找到它(以及更多):http://wiki.bash-hackers.org/syntax/pe。
请注意我没有检查您的rsync
命令是否有效,我认为它适用于您的目的。
答案 1 :(得分:0)
不可否认,这个解决方案并不能很好地扩展,但是你将所有东西放在一个文件中,而且你不需要在bash中阅读配置文件。
function my_rsync() {
rsync -chazP --fake-super --rsync-path="sudo rsync" --stats "$1" "$2"
}
declare -a SERVERS=(
"server1"
"server2"
);
declare -a SOURCES1=(
"/home"
"/etc"
);
declare -a SOURCES2=(
"/home"
"/etc"
"/var"
);
for SERVER in "${SERVERS[@]}"; do
case "$SERVER" in
"server1")
for SOURCE in "${SOURCES1[@]}"; do
my_rsync backup@$SERVER:$SOURCE /var/backup/$SERVER/
done
;;
"server2")
for SOURCE in "${SOURCES2[@]}"; do
my_rsync backup@$SERVER:$SOURCE /var/backup/$SERVER/
done
;;
esac
done
另一个解决方案是使用包含rsync(--include-from=FILE read include patterns from FILE
)的包含文件
并为每个服务器创建一个包含文件并命名它们,例如server1.txt
/ server2.txt
等
那你就不需要开关/盒子了,可以写这样的东西(未经测试!):
for SERVER in "${SERVERS[@]}"; do
rsync -chazP --fake-super --rsync-path="sudo rsync" --stats --include-from=/path/to/$SERVER.txt backup@$SERVER /var/backup/$SERVER/
done