RANCID 3.13 Ubuntu 22.04 安装指南

在 Ubuntu 22.04.5 LTS 上安装 RANCID 3.13:官方仓库在线与 deb 离线两种方案、Git 版本库初始化、router.db/.cloginrc 设备登记、cron 与 systemd timer 双调度方案、端到端采集验证与四条实测排障(2026-10-28 实测)。

RANCIDRANCIDUbuntu网络2026/10/28

RANCID 3.13 Ubuntu 22.04 安装指南

目标:在 Ubuntu 22.04.5 LTS 上从零安装并初始化 RANCID 3.13 配置备份套件:官方仓库在线安装与 deb 离线安装两种方案、版本库初始化(Git)、设备清单与登录凭据配置、cron 与 systemd timer 两种定时调度、端到端采集验证与卸载清理。全文命令与回显均于 2026-10-28 在 Ubuntu 22.04.5 LTS 环境逐条实测。本次实测无真实 Cisco/Juniper 设备,采集链路验证使用本地模拟设备(脚本位于 /opt/data/quzuo/tmp/rancid/sim_ios.py,监听 telnet 23 端口回放固定命令输出),真实设备行为以厂商命令为准。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(jammy),x86_64
  • 软件版本:RANCID 3.13-1(Ubuntu 22.04 官方仓库 stable 版本)
  • 安装位置:命令 /usr/lib/rancid/bin/(/usr/bin/rancid-run、/usr/bin/clogin 为符号链接),配置 /etc/rancid/,工作区 /var/lib/rancid/,日志 /var/log/rancid/
  • 版本库类型:Git(/var/lib/rancid/CVS/<组名> 裸仓库)
  • 运行用户:安装时自动创建的 rancid(uid/gid 999)
  • 演示组名:lab;演示设备:router1(模拟 Cisco IOS 2911,telnet 23)
  • 演示管理账号:root/admin,密码 q1w2e3r4(示例用途)

二、前置条件

安装 RANCID 前确认以下事项:

  1. 系统可访问 Ubuntu 官方仓库或其国内同步源(在线方案),或已备好 deb 包(离线方案);
  2. 已规划好设备清单:设备名称能被解析(DNS 或 /etc/hosts)、登录账号与密码、连接方式(telnet/SSH);
  3. 已决定版本库类型(cvs/svn/git,本篇用 git)与组划分(本篇演示一个组 lab);
  4. 可选:本机已配置邮件投递(postfix/sendmail)——没有也不影响采集,只影响变更邮件通知(见十、常见问题 Q3)。

系统基础依赖(expect、perl 等)由 apt 自动解决,无需手工安装。

三、版本选型说明

版本来源说明
3.13-1Ubuntu 22.04 官方仓库本篇实测版本;Debian/Ubuntu 打包维护,含 cron 脚手架
3.13-1Ubuntu noble/后续版本仓库同上游版本
3.14官网 ftp.shrubbery.net 源码包(2026-10-28 查询)上游最新稳定版,需自行编译

关键差异与选择:发行版仓库的 3.13-1 与上游 3.14 功能面差异很小(详见官网 CHANGES),生产环境优先用仓库版本——补丁与依赖随 apt 管理,且打包层已处理 rancid 用户、目录属主等细节;仅在需要 3.14 新特性或自定义补丁时才考虑官网源码编译。本篇以 3.13-1 为准。

四、在线安装方案(A:Ubuntu 官方仓库)

本方案适用于能访问 Ubuntu 软件源(直连或国内同步源)的服务器,从零到安装完成约 1 分钟。

4.1 更新仓库索引

sudo apt-get update

实测回显(国内同步源,节选):

Get:5 http://mirrors.aliyun.com/ubuntu jammy/main amd64 Packages [1,279 kB]
Fetched 30.1 MB in 4s (7,858 kB/s)
Reading package lists... Done

4.2 安装 RANCID 与 telnet 客户端

RANCID 的登录脚本默认通过系统的 telnet 客户端连接设备(SSH 方式则用 ssh 命令),Ubuntu 最小安装通常不带 telnet,必须一并安装:

sudo DEBIAN_FRONTEND=noninteractive apt-get install -y rancid telnet

实测回显(干净系统首次安装,节选首尾):

Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  cvs expect iputils-ping libbsd0 libcap2-bin libcbor0.8 libedit2 libfido2-1
  libgdbm-compat4 libgdbm6 libmd0 libpam-cap libperl4-corelibs-perl
  libperl5.34 libtcl8.6 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6
  libxext6 libxmuu1 netbase openssh-client perl perl-modules-5.34 tcl-expect
  tcl8.6 tzdata xauth
The following NEW packages will be installed:
  cvs expect iputils-ping libbsd0 ... rancid telnet tcl-expect tcl8.6 ...
0 upgraded, 32 newly installed, 0 to remove and 3 not upgraded.
Need to get 14.7 MB of archives.
After this operation, 71.7 MB of additional disk space will be used.
...
Setting up expect (5.45.4-2build1) ...
Setting up rancid (3.13-1) ...
Processing triggers for libc-bin (2.35-0ubuntu3.15) ...

⚠️ 注意:安装脚本会自动创建系统用户 rancid(家目录 /var/lib/rancid,登录 shell /bin/bash)。RANCID 的全部脚本禁止以 root 运行,采集必须以 rancid 用户身份执行(sudo -u rancid ... 或 su - rancid -c ...)。

4.3 验证安装

rancid -V
dpkg -l rancid | tail -1
ls /etc/rancid/

实测回显:

rancid 3.13
ii  rancid  3.13-1  amd64  Really Awesome New Cisco confIg Differ
rancid.conf  rancid.types.base  rancid.types.conf

三条回显分别确认:版本号 3.13、包状态 ii(已安装)、三份核心配置文件就位。此时 RANCID 尚未可用,还需完成第七节的仓库初始化与设备登记。

五、离线安装方案(B:deb 包)

内网或受限网络环境下,可先在能上网的机器取回 deb 包,再拷贝到目标机安装。RANCID 3.13-1 及其依赖的 deb 可通过 apt-get download 批量下载。

5.1 在联网机上下载 deb 包

mkdir -p ~/rancid-deb && cd ~/rancid-deb
apt-get download rancid
apt-get download telnet

实测回显(在 Ubuntu 22.04.5 上):

Get:1 http://mirrors.aliyun.com/ubuntu jammy/universe amd64 rancid amd64 3.13-1 [200 kB]
Fetched 200 kB in 2s (111 kB/s)

⚠️ 注意:apt-get download 只下载当前包本身,不递归依赖。RANCID 依赖的 expect、libexpect-perl 等 20 余个包需一并下载(可在联网机上用 apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances rancid telnet | grep "^\w") 全量导出,或直接使用 apt-offline 工具)。本节演示核心包的安装方式。

5.2 拷贝到目标机并安装

cd ~/rancid-deb
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y ./rancid_3.13-1_amd64.deb ./telnet_0.17-44build1_amd64.deb

预期结果:apt 会先安装 ./ 指定包的依赖,再安装这两个本地包,安装完成后的状态与在线方案完全一致(rancid -V 输出 rancid 3.13)。若依赖包未备齐,会报 Error: Unsatisfiable dependency,按报错补齐对应 deb 即可。

5.3 验证安装

rancid -V && dpkg -l rancid | tail -1

预期输出与 4.3 相同:rancid 3.13 与 ii rancid 3.13-1 ...。

六、方案对比与选择建议

维度方案 A:官方仓库在线方案 B:deb 离线包
是否需联网需要仓库访问目标机无需联网
版本仓库当前版本 3.13-1同源 deb,版本一致
依赖处理apt 自动解决需自行备齐全量依赖 deb
升级方式apt upgrade重新下载新版 deb 安装
适用场景可联网服务器/VM内网隔离、安全审计环境

选择建议:能联网选方案 A(省心、依赖全自动);内网隔离环境选方案 B,并务必在联网机上用依赖递归方式备齐全部 deb 包。

七、配置说明

两个安装方案的后续配置完全一致,按以下顺序完成初始化。

7.1 编辑 rancid.conf

sudo vim /etc/rancid/rancid.conf

修改以下三处(其余参数保持默认,逐项含义见《RANCID 3.13 配置参数详解》):

# 版本库类型:cvs | svn | git,此处选 git
RCSSYS=git; export RCSSYS
# 组列表:每组一个独立目录、独立版本库、独立邮件列表
LIST_OF_GROUPS="lab"; export LIST_OF_GROUPS
# 密码过滤:NO | YES | ALL(生产建议 YES 或 ALL,本篇演示用 NO 保留密码以便对照)
FILTER_PWDS=NO; export FILTER_PWDS

逐项说明:RCSSYS 决定 rancid-cvs/rancid-run 使用哪个版本控制系统;LIST_OF_GROUPS 是 RANCID 一切目录与调度的根(有空格分隔多个组,如 "lab core dmz");FILTER_PWDS 控制配置入库时的密码脱敏档位。

7.2 初始化版本库与组目录

sudo -u rancid rancid-cvs

实测回显(节选):

hint: Using 'master' as the name for the initial branch. ...
Initialized empty Git repository in /var/lib/rancid/CVS/lab/
Cloning into '.'...
warning: You appear to have cloned an empty repository.
done.
[master (root-commit) 2a0d2f2] new
 1 file changed, 3 insertions(+)
 create mode 100644 configs/.gitignore
To /var/lib/rancid/CVS/lab
 * [new branch]      master -> master
[master d6da75c] new
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 router.db

验证目录骨架:

ls -la /var/lib/rancid/lab/

实测回显:

drwxr-x--- 4 rancid rancid 4096 .git
drwxr-x--- 2 rancid rancid 4096 configs
-rw-r----- 1 rancid rancid    0 router.db
-rw-r----- 1 rancid rancid    0 routers.all
-rw-r----- 1 rancid rancid    0 routers.down
-rw-r----- 1 rancid rancid    0 routers.up

说明:rancid-cvs 幂等可重复执行;组目录中的 routers.up/down/all 由采集过程自动维护,无需手工编辑。新增组时在 LIST_OF_GROUPS 补名字后再跑一次 rancid-cvs 即可。

7.3 登记设备(router.db)

每行一台设备,分号分隔三字段:设备名;设备类型;状态(设备名必须能解析;类型取自 /etc/rancid/rancid.types.base 中 80 余个类型之一,如 cisco、juniper;状态 up/down):

echo "router1;cisco;up" | sudo tee -a /var/lib/rancid/lab/router.db
sudo chown rancid:rancid /var/lib/rancid/lab/router.db

实测环境无真实 Cisco 设备,用本地模拟设备替代真实设备(脚本位于 /opt/data/quzuo/tmp/rancid/sim_ios.py,监听本机 23 端口,按 Cisco IOS 2911 回放 show version、show running-config 等固定输出,真实设备行为以厂商命令为准)。让设备名 router1 解析到本机:

echo "127.0.0.1 router1" | sudo tee -a /etc/hosts

7.4 配置登录凭据(.cloginrc)

该文件是所有 *login 脚本的凭据库,权限必须 0600:

sudo tee /var/lib/rancid/.cloginrc > /dev/null <<'EOF'
add user router1 {admin}
add password router1 {q1w2e3r4} {q1w2e3r4}
add method router1 {telnet}
EOF
sudo chown rancid:rancid /var/lib/rancid/.cloginrc
sudo chmod 600 /var/lib/rancid/.cloginrc

逐项说明:add user 登录用户名;add password 后两个花括号值分别是 VTY 密码与 enable 密码(两值相同时 Cisco 常见配置);add method 连接方式(telnet 或 ssh,SSH 时还可加 add cyphertype/add sshcmd)。凭据按"设备名 glob"从上到下匹配,* 可做兜底规则。

7.5 首轮采集验证

先单测登录脚本,确认凭据与连通性:

sudo -u rancid clogin -c "show version" 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
Cisco IOS Software, C2900 Software (C2900-UNIVERSALK9-M), Version 15.2(4)M7, RELEASE SOFTWARE (fc1)
...
Configuration register is 0x2102
router1#exit

再跑完整采集:

sudo -u rancid rancid-run

实测回显(日志文件 /var/log/rancid/lab.20261028.001725,节选):

starting: Wed Oct 28 00:17:25 UTC 2026

Trying to get all of the configs.
All routers successfully completed.

[master 0551223] new router
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 configs/router1
Added router1

ending: Wed Oct 28 00:17:32 UTC 2026

验证配置落盘与版本历史:

head -8 /var/lib/rancid/lab/configs/router1
sudo -u rancid git -C /var/lib/rancid/lab log --oneline | head -5

实测回显:

!RANCID-CONTENT-TYPE: cisco
!
!Chassis type: CISCO2911/K9
!
!Memory: main 487424K/36864K
!Memory: nvram 255K
!
!Processor ID: FTX1524ABCDE
0551223 new router
d6da75c new
2a0d2f2 new

采集成功的判定标准:日志含 All routers successfully completed.、configs/<设备名> 生成且首行是 !RANCID-CONTENT-TYPE: cisco、Git 历史出现 new router 提交。

八、定时调度

RANCID 是一次性批处理工具,靠调度器周期执行。以下两种方案二选一即可。

8.1 方案一:cron(包自带脚手架)

Debian/Ubuntu 包自带 /etc/cron.d/rancid,默认整段注释,取消注释即可启用每小时采集:

sudo vim /etc/cron.d/rancid

将文件改为(取消两行注释):

# run config differ hourly
1 * * * * rancid /usr/bin/rancid-run
# clean out config differ logs
50 23 * * * rancid find /var/log/rancid -type f -mtime +2 -exec rm {} \;

逐项说明:第一行在每小时的第 1 分钟以 rancid 用户跑一次全组采集;第二行每晚 23:50 清理 2 天前的采集日志,防止日志无限增长。修改后无需重启 cron(cron 每分钟重读 /etc/cron.d),验证服务在运行即可:

systemctl is-active cron

实测回显:

active

8.2 方案二:systemd timer

需要更精确的调度语义(如 RandomizedDelaySec 抖动、错峰、Persistent 补跑)时,用 systemd timer。写入两个单元文件:

sudo tee /etc/systemd/system/rancid-run.service > /dev/null <<'EOF'
[Unit]
Description=RANCID network device config collection
After=network-online.target

[Service]
Type=oneshot
User=rancid
ExecStart=/usr/bin/rancid-run
EOF

sudo tee /etc/systemd/system/rancid-run.timer > /dev/null <<'EOF'
[Unit]
Description=Hourly RANCID config collection

[Timer]
OnCalendar=hourly
RandomizedDelaySec=300
Persistent=true

[Install]
WantedBy=timers.target
EOF

启用并验证:

sudo systemctl daemon-reload
sudo systemctl enable --now rancid-run.timer
systemctl list-timers rancid-run.timer --no-pager

实测回显:

NEXT                        LEFT       LAST PASSED UNIT             ACTIVATES
Wed 2026-10-28 01:00:09 UTC 35min left n/a  n/a    rancid-run.timer rancid-run.service
1 timers listed.

手动触发一次以验证链路(结果立即产生):

sudo systemctl start rancid-run.service
systemctl show rancid-run.service -p Result,ExecMainStatus
ls -t /var/log/rancid/ | head -1

实测回显:

Result=success
ExecMainStatus=0
lab.20261028.002410

⚠️ 注意:方案一与方案二不要同时启用,否则同一时刻可能出现两轮采集;rancid-run 自带 .run.lock 锁文件可防并发,但会造成其中一轮直接退出。

九、常见问题(FAQ)

Q1:clogin 报 Error: telnet failed: couldn't execute "telnet": no such file or directory? 系统缺少 telnet 客户端。RANCID 的登录脚本靠它连接设备,安装并重试:

sudo apt-get install -y telnet

实测:安装包 telnet (0.17-44build1) 后 clogin 即可正常 spawn(spawn telnet -K router1)。

Q2:rancid-run 报 /usr/bin/rancid-run: 149: cannot create /var/lib/rancid/logs/lab.20261028.001705: Permission denied? 日志目录 /var/lib/rancid/logs 是指向 /var/log/rancid 的符号链接,该目录默认属主为 root,rancid 用户写不进去。修正属主后重跑:

sudo chown rancid:adm /var/log/rancid

实测:修正后 rancid-run 正常在 /var/log/rancid/ 生成 lab.<时间戳> 日志文件。这是 Debian/Ubuntu 打包的一个已知坑,所有新装环境都会遇到。

Q3:日志出现 /usr/sbin/sendmail: not found,影响采集吗? 不影响采集与版本库提交(配置照常入库),只是 diff 邮件发不出去。需要邮件通知时安装一个 MTA(如 postfix),或将邮件目标指向已有的内网邮件主机:

sudo DEBIAN_FRONTEND=noninteractive apt-get install -y postfix

实测:安装 postfix 并 systemctl start postfix 后,触发一次设备配置变更再采集,本地收到主题为 lab router config diffs 的邮件,正文为 git diff 格式的配置变更(+ ip route 192.168.20.0 255.255.255.0 192.168.10.2),投递记录在 /var/mail/rancid。

Q4:以 root 运行报 Do not run /usr/bin/rancid-run as root!? RANCID 全家桶脚本禁止 root 运行(防止凭据文件与版本库属主混乱)。统一用 sudo -u rancid <命令> 或 su - rancid -c '<命令>' 执行。

Q5:设备明明在线,日志却报某台设备超时/失败? 按顺序排查:① sudo -u rancid clogin -c "show version" <设备名> 单测登录,报错会具体到账号或提示符;② router.db 的设备类型是否写对(cisco 设备写成其他类型会用错命令集);③ .cloginrc 的 glob 是否命中该设备名;④ 设备端 vty 会话数是否耗尽。定位到具体设备后可用 rancid-run -r <设备名> 单独重跑(不重跑全组)。

十、升级与卸载

升级:Ubuntu 仓库发布新版后 sudo apt-get update && sudo apt-get install --only-upgrade rancid;版本库与 router.db/.cloginrc 都在 /var/lib/rancid 与 /var/lib/rancid/.cloginrc,升级不触碰这些数据,跨大版本升级前建议先备份 /var/lib/rancid 整个目录。

卸载与清理(保留配置数据时先备份):

sudo systemctl disable --now rancid-run.timer 2>/dev/null   # 用了 timer 方案才需要
sudo apt-get purge -y rancid
sudo rm -rf /var/lib/rancid /var/log/rancid /etc/rancid     # purge 不一定清理数据目录,手工复核

说明:apt-get purge 会删除包文件,但 /var/lib/rancid(版本库与采集配置)是运行期产生的数据,卸载后需手工确认删除;/etc/cron.d/rancid 属包文件,purge 时自动移除。

十一、参考链接

本系列其他篇目: