上文回顾
书接上文, 对于最近一些小伙伴遇到一些问题,总结如下:
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,有效的数据 好几百条呢。
配置步骤
先安装一个软件。
apt–get install libmysqlclient–dev
来修改下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