RANCID 3.13 配置参数详解

逐一详解 RANCID 3.13 三份核心配置:rancid.conf 24 个全局参数(默认值与实测行为)、router.db 设备清单四字段与 47+10 设备类型机制、.cloginrc 19 条认证指令;附密码过滤源码级实测、clogin 登录回显、生产配置模板与排障方法。

RANCIDRANCID版本控制网络2026/10/28

RANCID 3.13 配置参数详解

目标:系统讲解 RANCID 3.13 的三份核心配置——rancid.conf(24 个全局参数逐一释义,含默认值与实测行为)、router.db(设备清单四字段与设备类型别名机制)、.cloginrc(19 条登录认证指令),并给出可直接落地的生产配置模板与排障方法。全文释义核对自系统手册 rancid.conf(5)、router.db(5)、cloginrc(5) 及源码 ios.pm,实测回显均于 2026-10-28 在 Ubuntu 22.04.5 LTS + RANCID 3.13-1 环境采集。本次实测无真实网络设备,验证链路使用本地模拟设备(脚本位于 /opt/data/quzuo/tmp/rancid/sim_ios.py,监听 telnet 23 端口回放 Cisco IOS 固定输出),真实设备行为以厂商命令为准。安装步骤见《RANCID 3.13 Ubuntu 22.04 安装指南》。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(jammy),x86_64
  • 软件版本:RANCID 3.13-1(Ubuntu 22.04 官方仓库)
  • 手册来源:/usr/share/man/man5/(rancid.conf.5.gz、router.db.5.gz、cloginrc.5.gz)、/usr/share/man/man1/(各登录脚本手册)
  • 源码定位:/usr/share/perl5/rancid/ios.pm(密码过滤逻辑)、/usr/lib/rancid/bin/(55 个可执行脚本)
  • 配置文件:/etc/rancid/rancid.conf、/etc/rancid/rancid.types.base、/etc/rancid/rancid.types.conf
  • 工作区:/var/lib/rancid/(BASEDIR 默认值);版本库:/var/lib/rancid/CVS/lab(Git 裸仓库);日志:/var/lib/rancid/logs/
  • 运行用户:rancid(安装时自动创建)
  • 演示组:lab;演示设备:router1(模拟 Cisco IOS 2911,telnet);示例账号:root/admin,密码 q1w2e3r4

二、配置文件总览

RANCID 3.13 的行为由三份配置叠加决定,职责边界如下:

文件位置职责生效方式
rancid.conf/etc/rancid/rancid.conf全局参数:组、存储、过滤、邮件、调度rancid-run 每次运行时重新读取
router.db$BASEDIR/<组名>/router.db每组的设备清单与采集状态rancid-run 每次运行时重新读取
.cloginrc运行用户家目录(/var/lib/rancid/.cloginrc)登录凭据与连接方式每次设备登录时读取

三个要点:

  1. rancid.conf 是 bourne shell 脚本。手册明确"It is interpreted directly by sh(1)",因此语法就是 shell 语法,每个参数都必须 export,否则子进程(clogin、rancid 等)拿不到值。这也意味着可以在其中写 shell 逻辑(如按主机名条件赋值),但请保持克制,便于升级时 diff。
  2. 组级覆盖:每个组目录下可以放一份 $BASEDIR/<组名>/rancid.conf 覆盖全局值(LOGDIR 除外,手册明确其"cannot be set or altered effectively in a group-specific rancid.conf")。
  3. 修改后无需重启任何服务——RANCID 无常驻进程(除非用 systemd timer,那也只影响触发时刻),下次 rancid-run 即生效。改完配置立即验证的手段见第八章。

Debian/Ubuntu 打包层在原版 rancid.conf 基础上附加了一段 root 运行保护:主脚本(control_rancid)检测到以 root 身份运行时直接退出并提示 Do not run $0 as root!,这是采集脚本必须以 rancid 用户执行的原因(详见《RANCID 3.13 Ubuntu 22.04 安装指南》第九章)。

三、rancid.conf 参数总览

安装后 /etc/rancid/rancid.conf 中被注释的参数示例行实测如下(grep -nE "#[A-Z_]+=" /etc/rancid/rancid.conf):

70:#ACLFILTERSEQ=YES; export FILTERSEQ
73:#ACLSORT=YES; export ACLSORT
81:#NOCOMMSTR=YES; export NOCOMMSTR
86:#FILTER_OSC=YES; export FILTER_OSC
90:#MAX_ROUNDS=4; export MAX_ROUNDS
95:#OLDTIME=4; export OLDTIME
99:#LOCKTIME=4; export LOCKTIME
102:#PAR_COUNT=5; export PAR_COUNT
112:#DIFFSCRIPT="filter1 | filter2"; export DIFFSCRIPT
124:#MAILDOMAIN="@example.com"; export MAILDOMAIN
130:#MAILHEADERS="Precedence: bulk\nAuto-submitted: auto-generated\nX-Auto-Response-Suppress: All"; export MAILHEADERS
133:#MAILOPTS="-f bounces.go.here@example.com"; export MAILOPTS
136:#MAILSPLIT=0; export MAILSPLIT

24 个参数按手册 rancid.conf(5) 汇总为速查表(默认值以手册为准):

参数默认值一句话作用
LIST_OF_GROUPS(空)定义组名列表,决定采集哪些组、建哪些目录
BASEDIR/var/lib/rancid工作区根:日志、版本库、组目录都放在它下面
CVSROOT$BASEDIR/CVS版本库路径,可指向远程(需自行处理认证)
RCSSYScvs版本控制系统:cvs / svn / git
LOGDIR$BASEDIR/logsrancid-run 日志目录
TMPDIR/tmp临时文件与锁文件目录
PATH(configure 时确定)脚本查找 telnet、ssh 等程序的搜索路径
TERMnetwork终端类型,会传给设备,影响登录会话行为
LC_COLLATE(未设)排序规则;Debian 配置显式设为 POSIX
FILTER_PWDSYES密码过滤级别:NO / YES / ALL
FILTER_OSCYES振荡数据(密钥等)过滤:NO / YES / ALL
NOCOMMSTR(未设)设置后过滤 SNMP community 字符串
ACLSORTYES是否对 access-list 排序
ACLFILTERSEQYES是否过滤 prefix-list/access-list 序号(隐含 ACLSORT=NO)
DIFFSCRIPT(control_rancid 内置)自定义 diff 输出过滤器(stdin→stdout)
SENDMAIL(configure 时确定)sendmail 可执行文件路径,须支持 -t 选项
MAILDOMAIN(未设)追加到管理/差异邮件地址的域名后缀
MAILHEADERSPrecedence: bulk附加邮件头,多个用 \n 分隔
MAILOPTS(未设)调用 sendmail 的附加选项
MAILSPLIT0diff 邮件按 KB 拆分,0 为不拆分
PAR_COUNT5rancid_par 同时启动的采集进程数
MAX_ROUNDS4失败设备的重试轮数(最小 0)
OLDTIME24距上次成功采集多少小时后开始告警
LOCKTIME4组锁文件多少小时后判定采集挂起

提示:MAX_ROUNDS 与 OLDTIME 的注释示例写的 4 与 4,与手册默认值 4 与 24 不同——注释行只是示例写法,不是默认值,以手册为准。

四、组与存储参数详解

4.1 LIST_OF_GROUPS:组划分

手册释义:定义以空白分隔的组名列表,组名将成为 $BASEDIR 下的目录名,rancid-run 也以它决定采集哪些组。命名要求:描述性强、不含空格与不可打印字符。示例(手册原文):LIST_OF_GROUPS="UofO USFS" 定义 UofO 与 USFS 两组。

本环境实测值与效果:

LIST_OF_GROUPS="lab"; export LIST_OF_GROUPS

rancid-cvs 首次运行后生成的目录结构(ls /var/lib/rancid/):

CVS      ← 版本库(CVSROOT 指向的 git 裸仓库所在)
bin      ← 组级脚本目录(可放自定义 hook)
lab      ← 组目录:router.db、configs/、versions 记录都在这
logs     ← LOGDIR 日志目录

组划分经验:按管理边界而非厂商划分(如 core/branch/datacenter),每组的 diff 邮件独立投递给对应团队,这是 RANCID 多组设计的核心价值。

4.2 BASEDIR / CVSROOT / RCSSYS:工作区与版本库

  • BASEDIR(默认 /var/lib/rancid):日志目录、版本库、组目录三者的根。手册说明其值为 configure 的 localstatedir,若手工迁移 RANCID 目录需要同步修改。
  • CVSROOT(默认 $BASEDIR/CVS):版本库定位变量。名字里有 CVS 是历史遗留,git/svn 同样用它。可指向远程位置,但手册明确 RANCID 不提供对远程版本库的认证交互,需自行处理密钥。
  • RCSSYS(默认 cvs):可选 cvs/git/svn。实测采用 git:
RCSSYS=git; export RCSSYS

切换 RCSSYS 前必须先运行 rancid-cvs 按新类型重新初始化版本库(旧库不会自动转换)。git 模式下每次采集的提交记录实测(git log --oneline):

5172f91 rollback router1 config to previous revision
3a6458b updates
32bd55d updates
83ce3e7 updates
0551223 new router
d6da75c new
2a0d2f2 new

提交人为 RANCiD <rancid>,新增设备、配置变更、手工回滚各产生一次提交。

4.3 LOGDIR / TMPDIR:日志与锁文件

  • LOGDIR(默认 $BASEDIR/logs):rancid-run 每次运行在日志目录生成一个 <组名>.<YYYYMMDD>.<HHMMSS> 文件,实测文件名:
lab.20261028.002222
lab.20261028.002337
lab.20261028.002410

排障第一步永远是看这个文件(见第十一章 Q1)。

  • TMPDIR(默认 /tmp):锁文件与临时文件目录。手册提示"rancid utilizes this directory for lock files",若 /tmp 挂载了 noexec 或被周期清理,可改到专用目录。

五、敏感信息过滤参数详解

这是 rancid.conf 中安全权重最高的一组参数,三者的作用对象互不重叠:

参数过滤对象默认
FILTER_PWDS各类登录密码、enable 密码、SSH 密钥YES
FILTER_OSC振荡变化的数据(自动生成的密钥、证书等)YES
NOCOMMSTRSNMP community 字符串未设(不过滤)

5.1 FILTER_PWDS 三档语义与源码定位

手册释义:值可为 NO / YES / ALL,分别过滤"无 / 仅可逆或明文密码 / 全部(含 SSH 密钥等)"。手册同时给出两条安全提示:NO 档有安全风险因为 diff 会经邮件发送,鼓励使用 ALL;FILTER_PWDS 不影响 SNMP community(那是 NOCOMMSTR 的事)。

"可逆"的边界最容易误解,直接看 3.13 源码 /usr/share/perl5/rancid/ios.pm(行号为实测文件行号):

2435:  if (/^(\s+password) \d+ / && $filter_pwds >= 1) {   # line 块内带加密索引的密码
2441:  if (/^(enable )?(password|passwd)( level \d+)? / && $filter_pwds >= 1) {
2445:  if (/^(enable secret) / && $filter_pwds >= 2) {     # enable secret 只有 ALL 才滤
2490:  if (/^(\s*)password / && $filter_pwds >= 1) {       # 顶层裸 password
2494:  if (/^(\s*)secret / && $filter_pwds >= 2) {

结论:YES(=1)过滤明文与 type-7 可逆加密密码,但不过滤 enable secret 的散列值(type 5 为单向散列,属"不可逆",归 ALL 管);username ... password 在 YES 档只滤非 5 型值(源码 2462 行 $filter_pwds >= 1 && $4 ne "5"),ALL 档全滤——与手册"reversable or plain-text"的措辞完全对应。

5.2 实测:FILTER_PWDS=ALL 的过滤效果

模拟设备的运行配置中含 enable secret 5 $1$mERr$9cTjUIEqNGurQiFU.ZeCi1 与 line 块密码。设 FILTER_PWDS=ALL 后运行 rancid-run,采集结果 configs/router1 中相关行实测:

!enable secret <removed>
! password <removed>
! password <removed>

对应版本库中的变更 diff 片段(git show 节选):

-enable secret 5 $1$mERr$9cTjUIEqNGurQiFU.ZeCi1
+!enable secret <removed>
- password q1w2e3r4
+! password <removed>

注意过滤形式:原行被替换为 ! 开头的注释行 <removed>,即配置行数与结构不变,diff 不会产生行位移。

一个实测中踩到的细节:line 块内不带加密索引的裸明文密码(如 password q1w2e3r4)不匹配 ios.pm 2435 行的正则(要求 password \d+ 形式,即 password 7 01100F... 这类带 type-7 索引的写法),且 line 块内层循环不经过顶层的 2490 行规则,因此 YES 档不会过滤它——把设备密码统一配置为 type-7 形式(或升级到 ALL 档)才能覆盖。如果你的设备存在大量裸明文 line 密码,这正是"设了 YES 还是漏"的原因。

5.3 FILTER_OSC 与 NOCOMMSTR

  • FILTER_OSC(默认 YES):过滤"振荡数据"——密钥、密码等每次 show 都变化、会产生海量虚假 diff 的内容。手册:NO 档"will most likely produce large repositories and frequent diff e-mail",鼓励 YES;YES 与 ALL 的差别是过滤激进度。FILTER_PWDS 可覆盖其行为。注意它同样不管 SNMP community。
  • NOCOMMSTR(默认未设):设为 YES 后过滤 snmp-server community 行中的 community 值(ios.pm 2728 行处理 ^(snmp-server .*community))。未设时 community 明文保留在配置与 diff 邮件中——SNMP community 等同于只读/读写凭据,生产环境建议 NOCOMMSTR=YES; export NOCOMMSTR。

六、邮件通知参数详解

RANCID 的 diff 告警链路:control_rancid 生成 diff → 通过 SENDMAIL 指定的程序投递 → 收件地址为 rancid-<组名>(组级邮件)与 rancid-admin-<组名>(管理邮件)。

6.1 SENDMAIL

手册:sendmail 可执行文件的路径或 FQPN,必须支持 -t 选项(从 stdin 读取收件人与头信息)。Debian 配置默认值实测:

SENDMAIL="/usr/sbin/sendmail"

Ubuntu 上 /usr/sbin/sendmail 由 postfix(或其他 MTA)提供。未安装 MTA 时采集本身不受影响,但日志会记录 sendmail: not found,diff 不会送达任何人。实测安装 postfix 后,/var/mail/rancid 中收到了主题为 Subject: lab router config diffs 的变更邮件。

6.2 MAILDOMAIN / MAILHEADERS / MAILOPTS / MAILSPLIT

  • MAILDOMAIN(默认未设):手册原文释义——该值被"简单地追加到常规邮件地址后面",如设 MAILDOMAIN="@example.com" 后 rancid-usfs 实际投递到 rancid-usfs@example.com。适用场景:RANCID 主机本身不做本地投递,组别名统一注册在邮件网关上。
  • MAILHEADERS(默认 Precedence: bulk):附加邮件头,多个头用 \n 分隔。注释示例含 Auto-submitted: auto-generated——用于防止邮件系统对告警邮件自动回复。
  • MAILOPTS(默认未设):调用 sendmail 的附加参数,手册示例 MAILOPTS="-f bounces.go.here@example.com" 用于指定退信地址。
  • MAILSPLIT(默认 0):diff 邮件正文超过 N KB 时拆成多封(最小值 0 即不拆分)。核心交换机全量配置 diff 可达数百 KB,超过邮件网关限制时设置此项。

组收件别名 rancid-lab、rancid-admin-lab 需要在 MTA 的 aliases 中登记(Ubuntu 打包已提供 /etc/aliases 片段),否则会出现实测中出现过的 Undelivered Mail Returned to Sender 退信。

七、采集调度与稳定性参数详解

7.1 PAR_COUNT:并发度

手册:定义 rancid_par 同时启动的采集进程数,调大可缩短总采集时长、代价是系统负载升高;默认值"相对谨慎",建议用速度与负载的试错法找合适值。默认 5。

规模参考:50 台以内设备默认值足够;数百台设备且单台采集超 30 秒时,可逐步上调至 10–20 观察 CPU 与设备侧压力。PAR_COUNT 过高还可能触发设备侧的并发登录限制,这比主机负载更容易先出问题。

7.2 MAX_ROUNDS / OLDTIME / LOCKTIME:重试与告警

  • MAX_ROUNDS(默认 4,最小 0):一轮采集中失败的设备重试几轮。网络抖动导致的偶发失败大多在第二轮就恢复;设 0 会让一次抖动直接产生 down 记录。
  • OLDTIME(默认 24 小时):距某设备上次成功采集超过该时长后,control_rancid 开始在管理邮件中抱怨。手册要求该值必须大于 rancid-run 的 cron 间隔——例如每小时采集一次,OLDTIME 设 24 没问题,若每 6 小时采集一次而 OLDTIME 仍是 4,就会误报。
  • LOCKTIME(默认 4 小时):组锁文件存在超过此时长即判定上次采集挂起并在日志告警。实测该机制:采集异常中断留下的锁不会被自动删除,需人工确认后清理(见第十一章 Q4)。

7.3 环境类参数:TERM / LC_COLLATE / PATH / umask

  • TERM(默认 network):登录脚本把 TERM 传给设备,影响设备回显(分页行为、行宽)。默认值手册称"should suffice",一般不动。
  • LC_COLLATE:排序 locale。Debian 配置显式设定 LC_COLLATE="POSIX"; export LC_COLLATE——保证 diff 与 keysort 输出跨主机一致,这是排查"diff 顺序每天乱跳"类问题的关键参数。
  • PATH:默认 PATH=/usr/lib/rancid/bin:/usr/bin:/usr/sbin:/bin:/usr/local/bin。自行编译的登录脚本或 hpuifilter 放进这些目录之一即可被找到。
  • umask 027:Debian 配置设定,保证组目录下文件对 rancid 组可读、其他用户不可读——配置文件里有(过滤后的)设备信息,权限收敛是必要的。

7.4 diff 呈现类:ACLSORT / ACLFILTERSEQ / DIFFSCRIPT

  • ACLSORT(默认 YES):对 access-list 语句排序后再存库。手册提醒:若管理员为性能精心调整过语句顺序,排序会破坏它,使恢复与比对失真——此类设备可在组级配置设 ACLSORT=NO。
  • ACLFILTERSEQ(默认 YES):过滤 prefix-list/access-list 的序号;对带序号的列表隐含 ACLSORT=NO。很多设备的 ACL 序号会随编辑自增,不过滤会产生持续假 diff。
  • DIFFSCRIPT(默认在 control_rancid 中定义):替换 RCS diff 输出的过滤器管道(stdin→stdout),手册示例 DIFFSCRIPT="sed -e '/^=/d' | expand"。只影响邮件里 diff 的呈现,不影响版本库存档内容。

八、router.db 设备清单详解

8.1 位置与格式

手册 router.db(5):每组一份,位于 $BASEDIR/<组名>/router.db,rancid 编译它得到待采集设备列表。格式:

<device_name>;<device_type>;<state>[;comments]

实测本环境的清单(cat /var/lib/rancid/lab/router.db):

router1;cisco;up

分隔符是分号不是逗号;行首 # 为整行注释。

8.2 四个字段

  1. device_name:设备名,必须能经 gethostbyname 解析(DNS 或 /etc/hosts),直接作为 telnet/ssh 的连接参数;转小写后同时也是 configs/ 下配置文件的文件名。手册建议用 FQDN,多台设备共用短名时易混淆。
  2. device_type:设备类型,决定用哪个采集脚本与登录脚本(见 8.3)。大小写不敏感(rancid-fe 中统一转小写)。
  3. state:手册原文——值为 up 或其他任意值(如 down);非 up 的设备不会被采集。强烈建议为非 up 设备写明原因的注释。实测将 router1 置为 down 后运行 rancid-run,日志显示设备被跳过、配置不再更新。
  4. comments:自由文本,记录该设备当前状态说明,例如手册示例 core1.paris;cisco;down;in testing until 5/5/2001.。

删除设备的自动清理:手册明确,从 router.db 移除设备后 rancid 会清理 configs/ 下对应的配置文件(版本库历史仍保留)。

8.3 设备类型与别名机制

类型定义在 /etc/rancid/rancid.types.base(47 个原生类型 + 10 个别名,实测计数),每行格式 type;directive;value,指令包括 script(采集脚本)、login(登录脚本)、module(Perl 模块)、inloop(输出解析入口)、command(要执行的命令与解析函数)、alias(类型别名)。实测 Cisco 的定义节选:

cisco;script;rancid -t cisco
cisco;login;clogin
cisco;module;ios
ios;alias;cisco
juniper;alias;junos

常用别名实测清单:ios→cisco、ios-nx→cisco-nx、ios-xr→cisco-xr、force10→dnos9、juniper→junos、mikrotik→routeros、zebra→frr。原生类型覆盖 a10、alteon、arista、bigip、cat5、cisco 系列、dell、dnos9/dnos10、edgemax、enterasys、erx、extreme、f5、fortigate、foundry、fxos、hp、junos、netscreen、netscaler、paloalto、redback、riverstone、sros、vrp、xirrus、frr 等。

文件头警告值得转述:不要修改 base 文件(升级会覆盖),自定义类型请在 /etc/rancid/rancid.types.conf 中克隆一份新类型名再改——比如为某型号交换机增删要执行的 show 命令。未知类型报错样式见第十一章 Q3。

九、.cloginrc 认证配置详解

9.1 位置与权限

.cloginrc 放在运行 clogin 的用户家目录,本环境即 /var/lib/rancid/.cloginrc(rancid-cvs/rancid-run 以 rancid 用户执行,cron 与 timer 也是)。实测内容:

add user router1 {admin}
add password router1 {q1w2e3r4} {q1w2e3r4}
add method router1 {telnet}

手册要求该文件权限必须收紧(clogin 会检查,过宽的权限会被拒绝读取):

sudo chmod 600 /var/lib/rancid/.cloginrc
sudo chown rancid:rancid /var/lib/rancid/.cloginrc

9.2 指令语法与匹配顺序

每行指令的通用形式(手册 cloginrc(5)):

add <directive> <router name glob> {<value>} [{<value2>}]

关键规则:按行序匹配,先匹配先生效——device 名称支持 glob 通配(*、?),因此通用规则放前面、具体设备规则放后面是错误写法,正确做法是具体设备在前、* 兜底在后。include {<file>} 指令可在任意位置引入其他文件。

9.3 指令总览(19 条,据手册 cloginrc(5))

指令作用备注
add user登录用户名
add userpassword用户密码(与 password 的 vty 密码二选一场景)
add password{vty 密码} [{enable 密码}]第二个值可选
add enablecmd自定义提权命令默认 enable
add enableprompt自定义提权密码提示符
add enauser提权时改用的用户名
add autoenable{0/1}:1=登录即特权模式默认 0
add noenable{1}=不执行提权与 autoenable 互补
add method连接方式序列 {ssh}/{telnet:端口}/{rsh}默认 {telnet} {ssh}
add cyphertypeSSH 加密算法类型
add identitySSH 私钥文件路径免密登录用
add passphraseSSH 私钥口令
add passprompt自定义密码提示符
add userprompt自定义用户名提示符
add prompt设备提示符正则提示符非标时必配
add sshcmd自定义 ssh 命令路径
add telnetcmd自定义 telnet 命令路径
add timeout登录各阶段超时秒数
include引入外部配置文件

method 的手册要点:按定义顺序尝试连接,失败(如 connection refused)后试下一种;ssh/telnet 可带 :端口 后缀;示例 add method * {ssh} {telnet:3000} {rsh} 表示先 ssh、再 telnet 3000 端口、最后 rsh。autoenable 手册要点:AAA 或本地用户可直接登录进特权模式(提示符以 # 结尾)的设备设 1,clogin 将跳过 enable 命令。

9.4 实测:clogin 单设备验证

.cloginrc 配好后先单独验证再纳入批量采集。实测命令与回显(模拟设备,clogin -c "show version | include IOS" router1 节选):

router1
spawn telnet -K router1
Trying 127.0.0.1...
Connected to router1.
Escape character is '^]'.

User Access Verification

Username: admin
Password:
router1>enable
Password:
router1#
router1#terminal length 0
router1#terminal width 132
router1#show version | include IOS
Cisco IOS Software, C2900 Software (C2900-UNIVERSALK9-M), Version 15.2(4)M7, RELEASE SOFTWARE (fc1)

从回显可读出 clogin 的标准动作序列:登录(Username/Password)→ enable 提权 → terminal length 0(关分页)与 terminal width 132(加宽)→ 执行命令。多设备批量验证:

sudo -u rancid clogin -c "show clock" $(awk -F\; '$3=="up"{printf "%s ",$1}' /var/lib/rancid/lab/router.db)

排查登录问题时,加 -d 参数可获得 expect 的完整调试输出(每一步 expect/send 都可见),比改 rancid-run 反复试跑高效得多。

十、生产配置模板

以下模板综合本篇参数语义,可直接按注释裁剪。三份文件都改完后运行 rancid-run -r <组名> 立即验证(-r 指定单组)。

10.1 rancid.conf 生产模板

# ---- 基础环境(保持打包默认即可) ----
TERM=network; export TERM
LC_COLLATE="POSIX"; export LC_COLLATE
umask 027
PATH=/usr/lib/rancid/bin:/usr/bin:/usr/sbin:/bin:/usr/local/bin; export PATH
TMPDIR=/tmp; export TMPDIR

# ---- 组与存储 ----
BASEDIR=/var/lib/rancid; export BASEDIR
CVSROOT=$BASEDIR/CVS; export CVSROOT
LOGDIR=$BASEDIR/logs; export LOGDIR
RCSSYS=git; export RCSSYS          # 团队熟悉 git 语义时推荐
LIST_OF_GROUPS="core branch dc"; export LIST_OF_GROUPS

# ---- 敏感信息过滤(安全底线) ----
FILTER_PWDS=ALL; export FILTER_PWDS   # 手册鼓励 ALL;至少 YES
NOCOMMSTR=YES; export NOCOMMSTR       # SNMP community 同属凭据
FILTER_OSC=YES; export FILTER_OSC

# ---- 邮件 ----
SENDMAIL="/usr/sbin/sendmail"; export SENDMAIL
MAILDOMAIN="@example.com"; export MAILDOMAIN   # 组别名注册在邮件网关时启用
MAILHEADERS="Precedence: bulk"; export MAILHEADERS
# MAILSPLIT=256; export MAILSPLIT              # 大配置 diff 超邮件网关限制时启用

# ---- 调度(按采集周期调整) ----
PAR_COUNT=10; export PAR_COUNT    # 设备数百台时上调;小规模保持默认 5
MAX_ROUNDS=2; export MAX_ROUNDS   # 网络稳定环境可降为 2 加速收敛
OLDTIME=24; export OLDTIME        # 必须大于 rancid-run 的 cron 间隔
LOCKTIME=4; export LOCKTIME

规模建议速查:

场景PAR_COUNTMAX_ROUNDSMAILSPLITRCSSYS
小型(<50 台,日采集)5(默认)20git
中型(50–300 台,小时级)10–152256git
大型(>300 台,小时级)15–201–2256svn/git 视团队运维习惯

10.2 router.db 生产模板

# 设备名必须可解析;类型见 rancid.types.base;非 up 必须写注释
core1.dc;cisco;up
core2.dc;cisco;up
agg1.branch;junos;up
agg2.branch;ios;up
fw1.dc;paloalto;up
old-core1.dc;cisco;decommissioned;下线于 2026-09-30,保留注释便于审计

10.3 .cloginrc 生产模板

# 顺序铁律:具体设备在前,通配兜底在后
add user fw1.dc {admin}
add password fw1.dc {q1w2e3r4} {q1w2e3r4}
add method fw1.dc {ssh}

# SSH 免密登录设备
add identity agg1.branch {/var/lib/rancid/.ssh/id_rsa}
add method agg1.branch {ssh}

# 登录即特权的设备(AAA 授权)
add autoenable agg2.branch {1}
add user agg2.branch {admin}
add password agg2.branch {q1w2e3r4}

# 通配兜底:telnet + 相同 vty/enable 密码
add method * {telnet}
add user * {admin}
add password * {q1w2e3r4} {q1w2e3r4}

十一、常见问题与排障

Q1:改了 rancid.conf/router.db/.cloginrc 怎么确认生效? 依次:rancid-run -r lab 单组跑一轮 → 看 $BASEDIR/logs/lab.<时间戳> 最新文件 → git log --oneline -n 3 看版本库有无新提交。三步都在 1 分钟内。改配置不需要重启任何东西,但必须由 rancid 用户跑(root 会被打包层的保护直接拒绝)。

Q2:FILTER_PWDS=YES 了,怎么 line 密码还在配置里? 见 5.2 节实测:line 块内不带加密索引的裸明文密码不匹配 ios.pm 的过滤正则(要求 password \d+ 形式)。处理:设备侧将 line 密码配置为 type-7 形式,或全局用 FILTER_PWDS=ALL 并复核 enable secret 是否也需隐藏(YES 不滤其散列,ALL 才滤)。

Q3:日志报 unknown router manufacturer for <设备>: <类型>? router.db 的 device_type 在 rancid.types.base 中不存在(拼写错误或该型号确实无内置支持)。先 grep ^<类型>;script; /etc/rancid/rancid.types.base 确认;无内置支持时找同族类型用 alias/克隆到 rancid.types.conf 适配,切勿改 base 文件。

Q4:日志报组被锁或采集一直 skip? rancid-run 运行期间会在 TMPDIR 留组锁,LOCKTIME(默认 4 小时)超时后日志告警。若确认无并发采集进程残留(ps -ef | grep rancid 以 rancid 用户视角核对),删除对应锁文件后重跑。根本原因常见于上次采集被强杀,注意排查当时是否有维护脚本介入。

Q5:diff 邮件收不到? 链路四点逐查:SENDMAIL 指向的程序是否存在(ls -l /usr/sbin/sendmail)→ MTA 别名表是否登记 rancid-<组名> 与 rancid-admin-<组名> → 运行用户邮箱(/var/mail/rancid)是否有退信 → MAILDOMAIN 是否把地址追到了错误域。实测中 postfix 缺失时日志为 sendmail: not found,别名缺失时为 Undelivered Mail Returned to Sender。

Q6:diff 内容顺序每天不一样、假 diff 很多? 三件事:确认 LC_COLLATE="POSIX" 存在且被 export;开启 ACLFILTERSEQ=YES 过滤 ACL 序号自增;确认 FILTER_OSC=YES 过滤振荡密钥。三者分别对应排序、序号、振荡三类经典假 diff 来源。

十二、参考链接