OSI:Netconf/Oxidized

Z HelpDesk

Sestavení a spuštění

  • nainstalovat docker a docker-compose
  • sestavit
cd /root/docker/oxidized
docker-compose build
  • spustit
docker-compose up -d

Automatické spouštění

  • Ve složce /root/docker/oxidized je celý projekt a proti tomu je spouštěn přes systemd service:
[Unit]
Description=%i service with docker compose
Requires=docker.service
After=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/root/docker/%i
ExecStart=/usr/bin/docker-compose up -d --remove-orphans
ExecStop=/usr/bin/docker-compose down
TimeoutStartSec=0
[Install]
WantedBy=multi-user.target
  • Samotný service je disabled - nespouští se po startu, ale je spuštěn timerem:
[Unit]
Description=Oxidized Timer
[Timer]
OnCalendar=*-*-* 3:00:00
[Install]
WantedBy=timers.target
  • Pokud se celý server restartuje, služba se nahodí v 3:00AM a poté se periodicky v tuto hodinu stahují konfigurace, automatické emaily uvnitř containeru kps_mailing se posílají v 6:00AM.

Adresářová struktura

├── docker-compose.yml #orchestrace containerů
├── mailing_build #container pro pravidelné posílání emailů
│   ├── ansi2html.sh #skript pro převod mezi barevným textem z gitu do HTML
│   ├── Dockerfile #recept na sestavení containeru
│   ├── mailing-crontab #nastavení cronu
│   ├── mailing.sh #rozesílací skript
│   └── mail-template #základní data pro mail
└── oxidized_build #container obsahující oxidized
    ├── Dockerfile
    ├── email_alert.sh #skript pro rozesílání emailů, pokud dojde k selhání
    ├── mail-template
    ├── oxidized #repozitář oxidized
    │   ├── bin
    │   ├── CHANGELOG.md
    │   ├── Dockerfile
    │   ├── docs
    │   ├── extra
    │   ├── Gemfile
    │   ├── lib
    │   ├── LICENSE
    │   ├── oxidized.gemspec
    │   ├── Rakefile
    │   ├── README.md
    │   ├── spec
    │   └── TODO.md
    └── oxidized-web #repozitář oxidized-web
        ├── Gemfile
        ├── lib
        ├── oxidized-web.gemspec
        ├── Rakefile
        └── README.md

Lokace na serveru

  • Ve složce /srv/oxidized na netconfu se nachází:
├── config #konfigurační soubor pro oxidized (konfigurace se sama změní po změně souboru)
├── crash
├── git-repos #jednotlivé repozitáře
├── logs
├── router.db #seznam všech prvků (konfigurace se sama změní po změně souboru)
├── router_test.db
└── tmp

docker compose

services:
 oxidized: #oxidized + oxidized-web
   #image: oxidized/oxidized:latest - pouzivame vlastni opatchovanou verzi
   build:
     context: './oxidized_build'
     dockerfile: Dockerfile
   container_name: kps_oxidized
   ports:
     - '127.0.0.1:8888:8888/tcp'
   environment:
     TZ: "Europe/Prague"
     CONFIG_RELOAD_INTERVAL: 600
     emails: "'simekm stan petrovic smrha avrba'" #emaily pro alerty
   volumes:
     - /srv/oxidized:/root/.config/oxidized #mapování složky s konfigurací a repozitářema
 mailing: #sluzba pro zasilani pravidelnych emailu
   build:
     context: './mailing_build'
     dockerfile: Dockerfile
   container_name: kps_mailing
   environment:
     TZ: "Europe/Prague"
     repos: "'mikrotik paman wlc fortinet asa cheb nectiny kolej switches'" #názvy repozitářů podle skupin
     emails: "'simekm stan petrovic smrha avrba'" #adresy pro pravidelné emaily
   volumes:
     - /srv/oxidized/git-repos:/srv:ro #mapování složky s repozitářema

Konfigurační soubor

username: aaa
password: bbb
model: junos #default
prompt: !ruby/regexp /^([w.@-]+[#>]s?)$/
resolve_dns: true
interval: 86400
use_syslog: false
debug: false
threads: 30
timeout: 20
retries: 3
rest: 0.0.0.0:8888/oxidized #naslouchání webového rozhraní
next_adds_job: false
vars:
remove_secret: true #obfuskování hesel
groups: {}
models: {}
pid: "/root/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: Oxidized
email: oxidized@netconf.civ.zcu.cz
repo: "/root/.config/oxidized/git-repos/default.git"
source:
default: csv
csv:
file: "/root/.config/oxidized/router.db"
delimiter: !ruby/regexp /;/
map:
name: 0
model: 1
group: 2
gpg: false
hooks:
email_alert:
type: exec
events: [node_fail]
cmd: 'bash /root/email_alert.sh $OX_NODE_NAME $OX_NODE_IP $OX_NODE_GROUP' #volání skriptu s parametry pokud stáhování configu selže
async: true