RANCID 3.13 配置参数详解
逐一详解 RANCID 3.13 三份核心配置:rancid.conf 24 个全局参数(默认值与实测行为)、router.db 设备清单四字段与 47+10 设备类型机制、.cloginrc 19 条认证指令;附密码过滤源码级实测、clogin 登录回显、生产配置模板与排障方法。
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) | 登录凭据与连接方式 | 每次设备登录时读取 |
三个要点:
- rancid.conf 是 bourne shell 脚本。手册明确"It is interpreted directly by sh(1)",因此语法就是 shell 语法,每个参数都必须
export,否则子进程(clogin、rancid 等)拿不到值。这也意味着可以在其中写 shell 逻辑(如按主机名条件赋值),但请保持克制,便于升级时 diff。 - 组级覆盖:每个组目录下可以放一份
$BASEDIR/<组名>/rancid.conf覆盖全局值(LOGDIR 除外,手册明确其"cannot be set or altered effectively in a group-specific rancid.conf")。 - 修改后无需重启任何服务——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 | 版本库路径,可指向远程(需自行处理认证) |
| RCSSYS | cvs | 版本控制系统:cvs / svn / git |
| LOGDIR | $BASEDIR/logs | rancid-run 日志目录 |
| TMPDIR | /tmp | 临时文件与锁文件目录 |
| PATH | (configure 时确定) | 脚本查找 telnet、ssh 等程序的搜索路径 |
| TERM | network | 终端类型,会传给设备,影响登录会话行为 |
| LC_COLLATE | (未设) | 排序规则;Debian 配置显式设为 POSIX |
| FILTER_PWDS | YES | 密码过滤级别:NO / YES / ALL |
| FILTER_OSC | YES | 振荡数据(密钥等)过滤:NO / YES / ALL |
| NOCOMMSTR | (未设) | 设置后过滤 SNMP community 字符串 |
| ACLSORT | YES | 是否对 access-list 排序 |
| ACLFILTERSEQ | YES | 是否过滤 prefix-list/access-list 序号(隐含 ACLSORT=NO) |
| DIFFSCRIPT | (control_rancid 内置) | 自定义 diff 输出过滤器(stdin→stdout) |
| SENDMAIL | (configure 时确定) | sendmail 可执行文件路径,须支持 -t 选项 |
| MAILDOMAIN | (未设) | 追加到管理/差异邮件地址的域名后缀 |
| MAILHEADERS | Precedence: bulk | 附加邮件头,多个用 \n 分隔 |
| MAILOPTS | (未设) | 调用 sendmail 的附加选项 |
| MAILSPLIT | 0 | diff 邮件按 KB 拆分,0 为不拆分 |
| PAR_COUNT | 5 | rancid_par 同时启动的采集进程数 |
| MAX_ROUNDS | 4 | 失败设备的重试轮数(最小 0) |
| OLDTIME | 24 | 距上次成功采集多少小时后开始告警 |
| LOCKTIME | 4 | 组锁文件多少小时后判定采集挂起 |
提示: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 |
| NOCOMMSTR | SNMP 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 四个字段
- device_name:设备名,必须能经 gethostbyname 解析(DNS 或 /etc/hosts),直接作为 telnet/ssh 的连接参数;转小写后同时也是
configs/下配置文件的文件名。手册建议用 FQDN,多台设备共用短名时易混淆。 - device_type:设备类型,决定用哪个采集脚本与登录脚本(见 8.3)。大小写不敏感(rancid-fe 中统一转小写)。
- state:手册原文——值为
up或其他任意值(如down);非 up 的设备不会被采集。强烈建议为非 up 设备写明原因的注释。实测将 router1 置为 down 后运行 rancid-run,日志显示设备被跳过、配置不再更新。 - 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 cyphertype | SSH 加密算法类型 | |
| add identity | SSH 私钥文件路径 | 免密登录用 |
| add passphrase | SSH 私钥口令 | |
| 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_COUNT | MAX_ROUNDS | MAILSPLIT | RCSSYS |
|---|---|---|---|---|
| 小型(<50 台,日采集) | 5(默认) | 2 | 0 | git |
| 中型(50–300 台,小时级) | 10–15 | 2 | 256 | git |
| 大型(>300 台,小时级) | 15–20 | 1–2 | 256 | svn/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 来源。
十二、参考链接
- 系统手册(随包安装,权威来源):
man 5 rancid.conf、man 5 router.db、man 5 cloginrc、man 1 clogin、man 1 control_rancid - 源码:
/usr/share/perl5/rancid/ios.pm(密码过滤正则,3.13 实测行号 2435/2441/2445/2490) - 设备类型定义:
/etc/rancid/rancid.types.base(勿改)与/etc/rancid/rancid.types.conf(自定义区) - 官方站点:http://www.shrubbery.net/rancid/ (上游版本与 CHANGES,2026-10-28 查询)
- 安装与初始化:《RANCID 3.13 Ubuntu 22.04 安装指南》
- 命令行与运维:《RANCID 3.13 常用 CLI 与运维命令详解》
- 定位与选型:《RANCID 介绍与选型指南》