SCP 选项

SCP 选项

我使用 RANCID 来备份路由器和交换机配置。

我还希望能够让它自动备份我服务器上的配置文件,这样我就可以轻松地看到何时发生变化,如果出现问题,就恢复到最后一个已知的配置。

有很多方法可以实现这一点,但是 RANCID 拥有我想要的所有功能,而且我已经在使用它了,所以如果我能将它内置到其中那就太理想了。

我懂了这个问题9 年前问过同样的问题,而最佳答案基本上只是说“构建自己的模块” - 我看过 RANCID 模块,但我不明白如何做到这一点,所以看看在过去 9 年里是否有人知道现在有用于此的模块。

编辑: 虽然还不是一个完整的解决方案,但是我发现这个存储库似乎具备我通过 SCP 抓取文件并将其加载到 RANCID 中所需的基础知识:https://github.com/drewbeer/rancid-scp

答案1

通过调整代码https://github.com/drewbeer/rancid-scp,我现在已经有了一个可行的解决方案,要求如下:

SCP 选项

  1. 创建脚本以通过 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
"
  1. 在 rancid.types 中附加一行来引用您想要从此类型的目标设备中提取的文件路径的脚本。

$RANCID_HOME/etc/rancid.types.conf

myservertype;script;rancid-scp /path/to/my/server.conf
  1. 将条目附加到设备数据库以引用新类型

$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
"

相关内容