说起配置管理,一直我面临的头疼问题——企业网的设备品牌太多太杂了。
基本上很少有机会去使用厂商私有的配置管理工具。SolarWinds的KiWi CaTools是一个非常不错的商业解决方案,但是,应该没有多少公司会在信息化上投入太多成本吧。

之前我是从网上找的和谐版CaTools,不过由于版本太旧,只能支持部分品牌的设备,将就了大半年。正要准备用python的netmiko自己写一个的时候,发现了这个工具——oxidized。简单测试了下,已经能覆盖我司的全部设备。

介绍

oxidized是一个轻量、可扩展的网络设备配置工具,目前能支持90多种操作系统。

  • 支持多线程
  • 支持多种数据源(csv,db,http)
  • 支持多种输出类型(file,git,http)
  • 支持RESTful API

Github项目地址:oxidized

安装

oxidized可以直接通过ruby的gem进行安装,也可以从docker启动:

1. CentOS手动安装

基于ruby,所以需要先把centos7上的ruby2.0升级到2.3版本,这里是有RVM来管理ruby版本。
首先是更新依赖包

1
2
3
yum install -y curl gcc-c++ patch readline readline-devel zlib zlib-devel
yum install -y libyaml-devel libffi-devel openssl-devel make cmake
yum install -y bzip2 autoconf automake libtool bison iconv-devel libssh2-devel libicu-devel

安装RVM前需要先导入gpg的公钥:

1
2
3
gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
#安装:
curl -L get.rvm.io | bash -s stable

最新的rvm安装完成之后,还需手动把当前用户添加到rvm组才行:

1
2
#把root用户加入到rvm group
usermod -a -G rvm root

log out注销当前用户,然后再log in重新读取组信息,可以使用groups命令查看当前用户的数组,加入rvm组后可以执行rvm命令
设置RVM环境并编译,然后安装Ruby 2.3.0并设置为默认值

1
2
3
source /etc/profile.d/rvm.sh
rvm install 2.3.0
rvm use --default 2.3.0

然后就可以通过Rubygems安装oxidized

1
2
3
gem install oxidized
gem install oxidized-script oxidized-web
# 如果不想安装oxidized-web,需要在启动前从config里删除rest部分的配置

安装完成后就可以进行初始配置了。

2. docker启动

首先需要创建一个配置文件的目录在宿主机上:

1
mkdir /etc/oxidized

然后第一次运行容器,来生成初始配置文件:

这一步仅用作生成config文件,如果已经有了,跳过这一步

1
docker run --rm -v /etc/oxidized:/root/.config/oxidized -p 8888:8888/tcp -t oxidized/oxidized:latest oxidized

这个时候/etc/oxidized下应该已经有了一个config文件,把它编辑成你想要的样子;

同时,创建数据源/etc/oxidized/router.db(下文具体解析config文件的内容和数据源格式)

正式启动容器:

1
2
3
4
5
6
7
8
docker run -v /etc/oxidized:/root/.config/oxidized -p 8888:8888/tcp -t oxidized/oxidized:latest
# 成功启动后会看到如下信息:
oxidized[1]: Oxidized starting, running as pid 1
oxidized[1]: Loaded 1 nodes
Puma 2.13.4 starting...
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://0.0.0.0:8888

初始配置

Oxidized的配置文件是用的yaml格式,文件默认读取目录是/etc/oxidized/config~/.config/oxidized/config
初次运行的时候会自动生成默认的~/.config/oxidized/config

config文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
---
username: username
password: password
model: junos
resolve_dns: false
log: /var/log/oxidized.log
interval: 3600
use_syslog: false
debug: false
threads: 30
timeout: 20
retries: 3
prompt: !ruby/regexp /^([\w.@-]+[#>]\s?)$/
rest: 127.0.0.1:8888
next_adds_job: false
vars: {}
groups: {}
models: {}
pid: "/root/.config/oxidized/pid"
crash:
directory: "/root/.config/oxidized/crashes"
hostnames: false
stats:
history_size: 10
input:
default: ssh, telnet
debug: false
ssh:
secure: false
ftp:
passive: true
utf8_encoded: true
output:
default: git
git:
user: Mansur
email: i@nbma.info
repo: "/root/.config/oxidized/backup_conf/devices.git"
file:
directory: "/root/.config/oxidized/configs"
hooks:
push_to_remote:
type: githubrepo
events: [post_store]
user: Mansur
email: i@nbma.info
remote_repo: git@nbma.info:mansur/test-oxidized.git
publickey: /root/.ssh/id_rsa.pub
privatekey: /root/.ssh/id_rsa
source:
default: csv
csv:
file: "/root/.config/oxidized/router.db"
delimiter: !ruby/regexp /:/
map:
name: 0
ip: 1
model: 2
username: 3
password: 4
gpg: false
model_map:
cisco: ios
juniper: junos

需要关注的内容不多:
username, password, model这些无需修改,source文件里的相应字段会更优先;
interval即是备份的周期;
rest部分是oxidized-web生成的网页,可以直观的查看各个设备的备份状态,保持127.0.0.0,后面可以另外部署一个nginx用于代理和认证。
下面是其他几个比较重要的配置:

1. source

定义了数据源,map是解析的字段映射:

1
2
3
more /root/.config/oxidized/router.db
S5720-05:192.168.1.2:vrp:admin:Admin@123
C2960-01:192.168.1.3:ios:cisco:Cisco@123

2. output

  • file 以文件方式输出
1
2
3
4
output:
default: file
file:
directory: "/root/.config/oxidized/configs"
  • git 以git方式输出
1
2
3
4
5
6
output:
default: git
git:
user: Mansur
email: i@nbma.info
repo: "/root/.config/oxidized/backup_conf/devices.git"

3. hook

hook需要先指定类型,然后通过监听事件event来执行相应的动作

  • push_to_remote

将配置保存到公司的gitlab是个不错的选择,可以方便直观的进行历史版本控制,以及进行配置对比。
push_to_remote能够运行的前提是output是以git方式进行输出。
先到gitlab上新建一个repo,然后上传key,修改oxidized的配置文件:

1
2
3
4
5
6
7
8
9
hooks:
push_to_remote:
type: githubrepo
events: [post_store]
user: Mansur
email: i@nbma.info
remote_repo: git@nbma.info:mansur/test-oxidized.git
publickey: /root/.ssh/id_rsa.pub
privatekey: /root/.ssh/id_rsa

运行

准备好配置文件之后,就可以运行了,默认直接在bash里已经安装了oxidized命令;
使用oxidized &来后台运行
或者启动一个screen,或者启动oxidied.service
查看日志,备份的file,或者git来确认备份进度

其他feature

nginx的web验证

nginx安装之前有写过
账号密码的话,需要使用apache的httpd-tools来生成密码文件,或者不想安装的话,可以使用在线 htpasswd 生成器

手动生成的话使用以下命令

1
2
3
htpasswd –c /home/htpasswd user1
# 回车之后,连续输入两次密码即可。后续添加用户不需要-c参数
htpasswd /home/htpasswd user2

然后,新建nginx配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
listen 80;
server_name 192.168.1.1;

auth_basic "oxidized web UI login";
auth_basic_user_file /home/htpasswd;

location / {
proxy_pass http://127.0.0.1:8888/;
}

access_log /var/log/nginx/access_oxidized.log;
error_log /var/log/nginx/error_oxidized.log;
}

重启nginx就可以了

设备group

当网络设备足够多时,可以将设备分组,以实现对某些属性的批量管理。