Oxidized是一个使用Ruby编写的开源网络设备配置备份工具

描述

 

Oxidized是一个使用 Ruby 编写的开源网络设备配置备份工具,是 RANCID(思科的一个工具) 的替代品,轻量级且可扩展的 Oxidized 支持 130 多种操作系统。

体验一下它的功能以及各种实现,看如何能与现有的系统进行整合,或者用 Python 造个简单的轮子。

结论:

  1. 整体使用感受:作为一个专门的配置备份软件,可以说把一个功能做到了比较高的水平!

  2. 亮点功能:可以支持监听设备上报的 syslog 日志中的配置改动来触发配置文件备份,对我来说是一个新的思路

目前支持 ios、junos、eos、nsos、aruba,后面有时间可以验证一次。

  1. 很多实现细节没有体验,大致过了一遍文档

安装过程

拉取镜像

docker pull oxidized/oxidized

配置文件相关

创建目录,用来存放配置文件、备份的配置、运行日志、主机清单文件等等

mkdir /etc/oxidized

运行一次容器,让程序自动生成初始配置文件,--rm 参数为容器退出后自动删除该容器:

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

回显信息为:edit ~/.config/oxidized/config,说明已经生成了默认的配置文件。

编辑配置文件,oxidized 的配置文件是 yaml 格式的,详细的配置项Configuration,提供了多种灵活的数据继承的方法,即可以为每台、每组、每种设备等等进行不同的配置。

---
username: oxidized    # 值随意,以数据库为准
password: S3cr3tx     # 值随意,以数据库为准
model: junos          # 值随意,以数据库为准
interval: 3600        # 配置备份的间隔时间
log: ~/.config/oxidized/log   # 日志文件
debug: false
threads: 30   # 线程
timeout: 20   # 超时时间
retries: 3    # 失败重试次数
prompt: !ruby/regexp /^([w.@-]+[#>]s?)$/    # 登录设备后的提示符判断
crash:
  directory: ~/.config/oxidized/crashes
  hostnames: false
rest: 0.0.0.0:8888    # 前端界面
pid: ~/.config/oxidized/oxidized.pid
input:    # 连接方式
  default: ssh, telnet
  debug: false
  ssh:
    secure: false
output:
  default: git      # 以git方式存储
  git:
      user: Oxidized
      email: oxidized@example.com
      repo: "~/.config/oxidized/oxidized.git"
source:
  default: csv
  csv:
    file: ~/.config/oxidized/router.db  # CSV 格式的主机数据库
    delimiter: !ruby/regexp /:/
    map:
      name: 0     # CSV 里面的值映射关系
      ip: 1
      model: 2
      username: 3
      password: 4
      group: 6
    vars_map:
      enable: 5
groups:             # 为每个组进行单独的配置
  mikrotik:
    username: admin
    password: blank
  ubiquiti:
    username: ubnt
    password: ubnt
model_map:            # 为每种设备类型进行单独的配置
  cisco: ios
    username: admin
    password: password
  juniper: junos
  ironware:
    username: admin
    password: password
    vars:
      enable: enablepassword

router.db 主机数据库,默认是 CSV 格式,也支持通过 SQL 、SQLite、HTTP 等方式来拉取,最终的数据结构根据不同的来源进行处理,然后重点是主机清单里面的数据,要通过 mapvar_map 建立对应的映射关系,这里是配置文件可以灵活制定的关键。

以 CSV 格式为例,应当是以下格式,默认是以 : 为分隔符,最终结果是个列表,然后映射值时根据下标:

r1comwareNetDevops@01group1
r2comwareNetDevops@01group2
r3comwareNetDevops@01group2

运行

运行容器,将本地数据卷映射到容器内的指定目录,容器内部默认监听 8888 端口:

docker run -td 
  --name oxidized_1 
  --restart=always 
  -v /etc/oxidized:/root/.config/oxidized 
  -p 8888:8888/tcp 
  oxidized/oxidized:latest 
  oxidized

程序输出

配置输出:

  1. 以文件的方式存储

需要手动创建父目录 configs,每个设备一个配置文件,只保留最新的配置,不会保存历史配置。

默认为每个组建立一个文件夹。

每次会在原文件的基础上更新文件,不会保存历史。

  1. 以 git 的方式存储,默认为每个组创建一个 git 仓库,可以通过 single_repo: true 来配置使用同一个仓库,此时每个组为一个文件夹。

oxidized 默认创建的的是bare repo,相当于一个私有的 git 仓库,里面没有 git 的工作目录,只有版本文件,每次备份配置后会进行一次提交;本地的私有仓库,可以通过克隆来查看具体的备份文件。

例如,我这里有一个 default.git 的目录,是上面 router.db 里面几台主机的配置备份信息:

操作系统

如果要查看具体的文件,可以克隆这个仓库:

git clone /etc/oxidized/default.git my_config
操作系统

如果要把文件提交到远程仓库,可以在配置文件中添加 hooks 来实现,例如:

hooks:
push_to_remote:
type: githubrepo
events: [post_store]  # 发生改变时触发操作
remote_repo:
   routers: git@git.intranet:oxidized/routers.git
   switches: git@git.intranet:oxidized/switches.git
   firewalls: git@git.intranet:oxidized/firewalls.git
publickey: /root/.ssh/id_rsa.pub
privatekey: /root/.ssh/id_rsa

上面的配置会在备份的配置发生改变时,把三个本地仓库分别推送到远程仓库,远端仓库使用密钥认证。

注意事项

  1. 修改配置文件需要重启 docker 的时候,不会自动删除 pid 文件,会导致无法启动,需要手动删除解决。
    
rm -rf /etc/oxidized/pid && docker restart oxidized_1

前端界面展示

首页:

操作系统

查看配置:

操作系统

基于 git 方式时,查看版本:

操作系统

查看版本差异:

操作系统

 

审核编辑 :李倩

 


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分