oxidized 最好用的网络设备备份系统(三)

 

上文回顾

书接上文, 对于最近一些小伙伴遇到一些问题,总结如下:

Model 选择

目前的版本(oxidized == 0.21.0)支持的OS 类型 在一个叫做 Supported-OS-Types.md 文件里面可以看到详情。

假设你在的公司有一款 Brocade的设备,通过查询Supported-OS-Types.md

发现Brocade 下面有这么多model.

* Brocade


* [FabricOS](lib/oxidized/model/fabricos.rb)


* [Ironware](lib/oxidized/model/ironware.rb)


* [NOS (Network Operating System)](lib/oxidized/model/nos.rb)


* [Vyatta](lib/oxidized/model/vyatta.rb)


* [6910](lib/oxidized/model/br6910.rb)


* [SLX-OS](lib/oxidized/model/slxos.rb)

 

如果你不确定设备用的那一个model 最简单的办法就是每个都试一下。

not matching configured prompt

有的小伙伴 遇到这个问题。

Model文件中有个参数 “prompt”一串正则表达, 它会去匹配设备的主机名,如果你的主机名设置的 正则表达式匹配不到 那么就会报类似下面的错误。

W, [2018-04-27T14:29:32.728506 #7152]
WARN — : 10.10.10.10 raised Oxidized::PromptUndetect with msg “SWITCH:SWITCH:SWITCH>
not matching configured prompt (?-mix:\@.*?\:~\$\s)”

W, [2018-04-27T14:29:58.902359 #7152]
WARN — : 10.10.10.10 raised Oxidized::PromptUndetect with msg “unable to detect prompt: (?-mix:\@.*?\:~\$\s)”

解决办法也很简单,写个正则表达式匹配你的主机名就行了。

举个例子

Cisco(ios): XXX-YY-2F-A#160.12# 用了#做分隔符。

官方自带prompt

prompt /^([\w.@()-]+[#>]\s?)$/
			

就匹配不到这个主机名。

改修后的 prompt

prompt /^([\w#.@()-]+[#>]\s?)$/

 

Last update

细心的小伙伴 发现 last update 用的是UTC 时间。比当前时间完了8个小时。

这个问题产生原因是 oxidized-web的一个oxidized.js文件导致的

注释掉红色框的一行,删掉下面一行的 timeZone参数

然后会发现 UTC没有了,时间也恢复正常了。

Advanced Group Configuration

原理简介

这里引入组的概念,组的应用把设备的账号密码从router.db中 转移到config文件中,有个限制就是需要你的标准化做的比较好,

比如说,如果你按照设备型号分组,那么要求该型号的所有设备拥有一个共同的账号密码。 我的环境就是这样设计的 感谢同事们,已经把标准化做的很完善。

配置步骤

Config中 groups配置如下:

groups:


H3C S5110:


username: admin


password: Admin!5110


HUAWEI S5720-24S:


username: admin


password: Admin!5720


HUAWEI S5720-48S:


username: admin


password: Admin!5720


HUAWEI S2750:


username: admin


password: Admin!2750

map 的配置 把 username,password 缩减成groups

map:


name: 0


model: 1


group: 2

 

router.db

router.db 也对应只要三个参数。

ip:model:group

这样就配置好了。配置操作又简单了一些呢。

也许会觉得 虽然有优化,但是感觉不怎么给力呢, 不要急,继续看下去,这一点点优化,实现从CMDB中导入数据很方便很多呢。

Source: MYSQL

原理简介

设备的数量到一定量级,编辑router.db就会变成一个痛苦的事情,

因为公司已经有一套完善的CMDB 我找维护的同事要了一个接口。数据源全部从CMDB中提取,定期同步一次,如果有新设备加入或者老设备下线, 我只要同步CMDB中的数据。系统只会备份CMDB中有效的设备。

 

数据准备

我用了django 来实现调用接口,处理数据,写入mysql.

Models.py

class Oxidized(models.Model):


“””oxidized mysql source”””

ip = models.CharField(max_length=50, verbose_name=‘设备IP’)

dev_model = models.CharField(max_length=50, verbose_name=‘模块名称’)

group = models.CharField(max_length=50, verbose_name=‘组的名字’, null=True, blank=True)


role = models.IntegerField(verbose_name=‘角色’)

dev_type = models.IntegerField(verbose_name=‘设备类型’)

dev_status = models.IntegerField(verbose_name=‘设备状态’)

idc_name = models.CharField(max_length=50, verbose_name=‘IDC名字’, null=True, blank=True)

location = models.CharField(max_length=50, verbose_name=‘位置’, null=True, blank=True)

host_name = models.CharField(max_length=255, verbose_name=‘主机名’, null=True, blank=True)

 

def __str__(self):


return
self.ip

 


class Meta:

verbose_name = “Oxidized”

 

Ip, dev_model, group 这3个参数是必须的。

其它的参数你接口中带的,后面做数据整形时候有的参数用的到。

Views.py

def init_oxidized(request):


“””初始化oxidized数据表”””

try:

Oxidized.objects.all().delete()

querysetlist = []

res = get_data()

res_list = res[‘data’]


for result in res_list:

querysetlist.append(Oxidized(ip=result[‘ip’], group=result[‘dev_model’],

dev_model=re.match(r'(\w+)[ -].*‘, result[‘dev_model’]).group(1),


role=result[‘role’], dev_type=result[‘dev_type’],

dev_status=result[‘dev_status’], idc_name=result[‘idc_name’],

location=result[‘location’], host_name=result[‘host_name’]

))

Oxidized.objects.bulk_create(querysetlist)


# 删除XX的设备

Oxidized.objects.filter(location__contains=‘xx’).delete()


# 删除 yy交换机

Oxidized.objects.filter(group=‘yy’).delete()


# 删除 aa 测试交换机

Oxidized.objects.filter(ip=‘10.10.10.10’).delete()


# 删除 bb的交换机

Oxidized.objects.filter(role=9).delete()


return JsonResponse({“status”: False, “msg”: “用户session不存在”})

except Exception
as e:


return {“status”: False, “msg”: “请联系管理员:{}”

 

跑一下接口 查看mysql,有效的数据 好几百条呢。


 

配置步骤

先安装一个软件。

aptget install libmysqlclientdev

来修改下config文件。

几个参数 大家注意下 groups source model_map 这3个地方 模仿写就行。


username: username

password: password

model: junos

interval: 43200

log: /home/oxidized/.config/oxidized/logs/oxidized.log

debug: false

threads: 30

timeout: 10

retries: 1

prompt: !ruby/regexp /^([\w.@-]+[#>]\s?)$/

rest: 127.0.0.1:8888

next_adds_job: false

vars: {}

groups:

H3C S5110:

username: admin

password: admin!5110

HUAWEI S5720-24S:

username: admin

password: admin!5720

HUAWEI S5720-48S:

username: admin

password: admin!5720

HUAWEI S2750:

username: admin

password: admin!2750

models: {}

pid: “/home/oxidized/.config/oxidized/pid”

input:

default: ssh, telnet

debug: false

ssh:

secure: false

output:

default: git

git:

single_repo: true

user: Oxidized

email: o@example.com

repo: “/home/oxidized/.config/oxidized/default.git”

source:

default: sql

debug: true

sql:

adapter: mysql2

database: ‘oxidized’

table: ‘users_oxidized’

user: ‘root’

password: ‘xxx@yyy’

host: ‘10.10.10.10’

map:

name: ip

model: dev_model

group: group

model_map:

CISCO: ios

H3C: comware

HUAWEI: vrp

RG: ios

hooks:

email_output:

type: exec

events: [post_store, node_fail]

cmd: ‘/home/oxidized/.config/oxidized/extra/oxidized-report-git-commits | heirloom-mailx -s “Oxidized updates for ${OX_NODE_NAME}” 191801737@qq.com’

async: true

timeout: 120

push_to_remote:

type: githubrepo

events: [post_store]

single_repo: true

remote_repo: git@git.xxxxx.com:it-ops/oxidized.git

publickey: /home/oxidized/.config/.ssh/id_rsa.pub

privatekey: /home/oxidized/.config/.ssh/id_rsa

 

 

验证结果

数百台设备 这样搞定。

设备的变更都会自动发送到公司的gitlab。wonderful! ! !

 

隐藏敏感数据

原理简介

如果你想备份数据到github上面,密码 ,snmp 等敏感信息想要过滤掉。

Oxidized就是隐藏账号的密码 和 snmp的信息

配置步骤

 

vars:

remove_secret:
true

验证结果

通过2次的配置对比 很清楚发现,密码和snmp的信息都已经被隐藏了。

in the end

oxidized 前前后后也写了3篇文章,自我感觉写的比较用心吧,每张截图的背后都是多次亲自实验的成果。

oxidized应该就会写到这里,后续还有问题想交流的小伙伴 加QQ群:752774493

终章

Oxidized 是偶然发现的一个备份软件,对于网络工程师来说,确实是一个很好用的系统。也算是多年来 在备份问题上一个终点,用好oxidized也就够了。

愿景

Old soldiers never die. They just fade away