在生产部署oxidized的时候还是遇到了不少问题,这里整理出来:

1. 时区问题

默认页面上显示的是UTC时间,需要修改一个js文件。

1
2
3
4
#查找js所在目录
find / -name oxidized.js

/usr/local/rvm/gems/ruby-2.5.1/gems/oxidized-web-0.11.1/lib/oxidized/web/public/scripts/oxidized.js

编辑js,注释掉56行,删掉57行的timezone部分:

然后重启oxidized,刷新页面即可

2. group问题

默认没有设置的情况下,所有设备都在default组里。
设置group需要同时修改config和source源:

config部分,添加上group字段的映射:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
source:
default: csv
csv:
file: "/root/.config/oxidized/router.db"
delimiter: !ruby/regexp /:/
map:
name: 0
ip: 1
group: 2
model: 3
username: 4
password: 5
vars_map:
enable: 6
gpg: false

同一个group里的相同属性可以直接写在config里

source部分,分配对应的group

1
2
3
4
FW-5525X-017:192.168.1.1:Cisco:asa:admin:Admin@123:Enable@456
AC-7205-02:192.168.1.2:Aruba:aosw:admin:Admin@123
AS-5720-01:192.168.1.3:Huawei:vrp:admin:Admin@123
AS-5130-POE-02:192.168.1.4:H3C:comware:admin:Admin@123

重启后效果如图:

配置完group之后建议在output里开启以下两个feature

1
2
3
4
output:
git:
single_repo: true
type_as_directory: true

可以实现 将配置按照groups划分为文件夹。否则,oxidized将为每个group创建一个本地的git repo,从而导致push remote repo失败

3. 配置中的uptime问题

有些设备的配置中存在uptime字段,会导致每次git commit都提示设备配置有改变。
oxidized官方的脚本里仅支持了部分设备在commit之前忽略这部分。
我这里遇到两个漏网的,分别是山石网科的stoneos 和华为USG防火墙的vrp系统。

山石设备需要忽略的show versionUptimeshow configration running中ipsec的pre-share,其中pre-share的key本身是加密的,但是经过测试,隔一段时间再show的时候密文居然变了。

设备输出是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# show version
(...)
Built by buildmaster8 2017/04/28 18:22:25

Uptime is 323 days 4 hours 4 minutes 20 seconds
System language is "en"
(...)

# show configration running
(...)
isakmp peer "to XXX site"
isakmp-proposal "P1"
pre-share "ubKB5d7wZlMEWi5tyxsSfQl+G04BuQ"
peer 1.2.3.4
(...)

根据以上格式,需要删除uptime所在行,以及替换加密的文本。修改ruby脚本如下(修改部分已添加注释):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# vim /usr/local/rvm/gems/ruby-2.5.1/gems/oxidized-0.24.0/lib/oxidized/model/stoneos.rb
(...)
cmd 'show configuration running' do |cfg|
# replace secret text
cfg.gsub! /pre-share (.*)/, 'pre-share <secret hidden>'
cfg
end

cmd 'show version' do |cfg|
# avoid commits due to uptime / Uptime is 323 days 4 hours 4 minutes 20 seconds
cfg = cfg.each_line.reject { |line| line.match /(Uptime\s+\d+\s+)|(.*seconds.*)/ }
cfg = cfg.join
comment cfg
end
(...)

对于华为的USG防火墙,主要是每次运行display命令的时候,会先输出当前时间2018-10-10 15:16:50.440 +08:00,然后才是命令的内容;另外就是下面的Datebase Version的时间,防火墙的数据库更新也没必要触发配置变更:

1
2
3
4
5
6
7
8
9
10
<BJ_IPSEC>disp version 
2018-10-10 15:16:50.440 +08:00
Huawei Versatile Routing Platform Software
VRP (R) Software, Version 5.170 (USG6300 V50...
(...)
AV Signature Database Version :
SA Signature Database Version : 2016070401
C&C Domain Name Database Version :
Location Database Version : 2015121515
(...)

修改的话就就类似uptime,直接过滤掉这一行再存储,这里使用固定的时区08:00作为过滤行的关键字:

1
2
3
4
5
6
7
8
9
# vim /usr/local/rvm/gems/ruby-2.5.1/gems/oxidized-0.24.0/lib/oxidized/model/vrp.rb
(...)
cmd 'display version' do |cfg|
cfg = cfg.each_line.reject { |l| l.match /08:00/ }.join
cfg = cfg.each_line.reject { |l| l.match /uptime/ }.join
# avoid commits due to Database auto update
cfg.gsub! /Database Version(\s+\:) (\d*)/, 'Database Version\1 <date hidden>'
comment cfg
end

上面的\1指的将第一个括号匹配的部分填充到这个位置。

修改完成后,再获取配置就不会提示有变化了。

这部分解决方案参考自Github的issues以及其他OS的脚本.

4. git repo冲突问题

默认情况下是不会出现冲突问题,但是如果在其他地方修改提交了remote repo,本地的oxidized repo没有变。这个如何再运行oxidized的push remote repo就回提示fail,解决办法也很简单:
确认下config中output部分的git目录的路径,直接删除rm -rf这个目录即可。