![SCP 选项](https://linux22.com/image/763930/SCP%20%E9%80%89%E9%A1%B9.png)
我使用 RANCID 来备份路由器和交换机配置。
我还希望能够让它自动备份我服务器上的配置文件,这样我就可以轻松地看到何时发生变化,如果出现问题,就恢复到最后一个已知的配置。
有很多方法可以实现这一点,但是 RANCID 拥有我想要的所有功能,而且我已经在使用它了,所以如果我能将它内置到其中那就太理想了。
我懂了这个问题9 年前问过同样的问题,而最佳答案基本上只是说“构建自己的模块” - 我看过 RANCID 模块,但我不明白如何做到这一点,所以看看在过去 9 年里是否有人知道现在有用于此的模块。
编辑: 虽然还不是一个完整的解决方案,但是我发现这个存储库似乎具备我通过 SCP 抓取文件并将其加载到 RANCID 中所需的基础知识:https://github.com/drewbeer/rancid-scp
答案1
通过调整代码https://github.com/drewbeer/rancid-scp,我现在已经有了一个可行的解决方案,要求如下:
SCP 选项
- 创建脚本以通过 SCP 检索和存储配置。必须授予此脚本执行权限。
$RANCID_HOME/bin/rancid-scp
!/bin/sh
# Copy a devices configuration via SCP and store it with rancid. should work on anything
#
# Writted by David Schweikert, 2016-11-03
# rewritten by DrewBeer to make it generic and work with any username, and config
# Modified by serverfault.com/users/121718/bdx, 2021-04-05 to make it work with SSH keys instead of password auth
# Downloaded from https://github.com/drewbeer/rancid-scp
#
# License: same as rancid version 3 (BSD-style)
#
# Note: for this to work you need to enable scp on the device in question.
# Gets username from $RANCID_HOME/.cloginrc
CONFIG_FILE=$1
ARG_HOST=$2
ARG_FILE="$ARG_HOST.new"
usage() {
echo "usage: /usr/local/libexec/rancid/rancid-scp remote_file_path hostname" 2>&1
exit 1
}
get_user() {
USER=`grep $1 $HOME/.cloginrc|grep user|sed 's/\s\+/ /g'|cut -d' ' -f4`
}
if [ -z "$ARG_HOST" ]; then
usage
fi
if [ -z "$CONFIG_FILE" ]; then
usage
fi
get_user $ARG_HOST
expect -c "
set timeout 10
spawn scp $USER@$ARG_HOST:$CONFIG_FILE $ARG_FILE
expect eof
"
- 在 rancid.types 中附加一行来引用您想要从此类型的目标设备中提取的文件路径的脚本。
$RANCID_HOME/etc/rancid.types.conf
myservertype;script;rancid-scp /path/to/my/server.conf
- 将条目附加到设备数据库以引用新类型
$RANCID_HOME/var/devices/servers.db
192.168.1.10;myservertype;up
192.168.1.11;myservertype;up
HTTP API 选项
SCP 选项中的步骤 2 和 3 中的相同原则适用,我刚刚创建了这个脚本来从特定设备的 HTTP API 中获取配置,这里作为奖励:
$RANCID_HOME/bin/an-http-config
#!/bin/sh
ARG_HOST=$1
ARG_FILE="$ARG_HOST.new"
usage() {
echo "usage: /usr/local/libexec/rancid/an-http-config hostname" 2>&1
exit 1
}
if [ -z "$ARG_HOST" ]; then
usage
fi
expect -c "
set timeout 10
spawn wget -O $ARG_FILE --http-user=rancid --http-password=abcd1234 https://$ARG_HOST/api/config/get
expect eof
"