“Oxidized is a network device configuration backup tool. It's a RANCID replacement!”, это действительно так, но в сравнении с Rancid в Oxidized есть пару моментов, которые недоступны прямо из коробки:
Проблемы не смертельные, можно и надо будет придумать как их решить.
Сейчас получается, что полностью автономномно oxidized работать не может, ему нужна небольшая обвязка.
При это стоит отметить, что Oxidized сильно активнее развивается и у него есть активная публика которая сдаёт проблемы.
Rancid резилится раз в несколько лет, последний раз в 2025.
Поэтому хорошо освоенный oxidized всё равно предпочтительнее.
Вариант хорошо подойдёт для быстрого запуска и ознакомления.
Ниже будет описание этого варианта установки, но в очень базовом виде:
Позже надо будет поставить angie перед oxidized для https и аутентификации, настроить ротирование логов в докере и собрать всё в docker-compose.
Для прода планирую поставить на отдельную ВМ, т.к. скорее всего надо будет что-нибудь править в Ruby скриптах которые собирают конфиг с устройств.
В таком варианте проще будет сохранить изменения в скриптах, чем при использовании докер образа.
Этот вариант хорошо написан у человека тут,
Официальная документация - https://github.com/ytti/oxidized/blob/master/docs/Docker.md
На хостовой ВМ создаём директорию, которую будет подключать к контейнеру для хранения конфигурации, ключей и внутреннего репозитория.
Задаем овнера и группу, 30000 это UID и GID из Dockefile контейнера.
root@4-docker1:~# mkdir -p /data/volume-oxidized2 root@4-docker1:~# chown -R 30000:30000 root@4-docker1:~# ll /data/ total 8 drwxr-xr-x 4 30000 30000 4096 Aug 13 12:29 volume-oxidized2
Запускаем контейнер и делаем первичную инициализацию конфигов (“su - oxidized -c oxidized”).
После выполнения “su - oxidized -c oxidized” контейнер остановится.
root@4-docker1:/data# docker run -ti -d -v /data/volume-oxidized2:/home/oxidized/ -p 8888:8888/tcp -t oxidized/oxidized su - oxidized -c oxidized
В примонтированной директории появится начальный конфиг.
root@4-docker1:~# cd /data/volume-oxidized2/.config/oxidized root@4-docker1:/data/volume-oxidized2/.config/oxidized# ll -a total 12 drwxrwxr-x 2 30000 30000 4096 Aug 16 15:01 . drwxrwxr-x 3 30000 30000 4096 Aug 16 15:01 .. -rw-rw-r-- 1 30000 30000 697 Aug 16 15:01 config
Приводим файл config к виду.
---
resolve_dns: false
interval: 3600
use_syslog: false
debug: false
threads: 30
timeout: 140
retries: 3
prompt: !ruby/regexp /^([\w.@-]+[#>]\s?)$/
next_adds_job: false
remove_secret: true
extensions:
oxidized-web:
load: true
# Bind to any IPv4 interface
listen: 0.0.0.0
# Bind to port 8888 (default)
port: 8888
vars: {}
groups:
routers: {}
switches: {}
models: {}
pid: "/home/oxidized/.config/oxidized/pid"
logger:
# level: :trace
appenders:
- type: file
level: info
file: /home/oxidized/.config/oxidized/log
# - type: file
# level: trace
# file: /home/oxidized/.config/oxidized/trace.log
crash:
directory: "/home/oxidized/.config/oxidized/crashes"
hostnames: false
stats:
history_size: 10
source:
default: csv
csv:
file: "/home/oxidized/.config/oxidized/router.db"
delimiter: !ruby/regexp /:/
map:
group: 0
name: 1
model: 2
ip: 3
port: 4
username: 5
password: 6
gpg: false
input:
default: ssh
debug: false
ssh:
secure: false
utf8_encoded: true
output:
default: git
git:
user: oxidized
email: oxidized@MYDOMAIN.ru
single_repo: true
repo: "/home/oxidized/.config/oxidized/devices.git"
C хостовой ВМ создаём файл router.db со списком оборудования.
root@4-docker1:~# touch /data/volume-oxidized2/.config/oxidized/router.db root@4-docker1:~# chown 30000:30000 /data/volume-oxidized2/.config/oxidized/router.db root@4-docker1:~# chmod 640 /data/volume-oxidized2/.config/oxidized/router.db
Добавляем в router.db первое оборудование.
root@4-docker1:/data/volume-oxidized2/.config/oxidized# cat router.db # routers:R11:junos:x.x.x.x:22:oxidized:Cakyiemweo...taphoonIb
Запускаем ещё раз контейнер, у oxidized уже есть конфигурация.
docker run -ti -d -v /data/volume-oxidized2:/home/oxidized/ -p 8888:8888/tcp -t oxidized/oxidized
Если всё хорошо, и oxidized смог снять кофниг с железке, то в рабочей директории появится “встроенный” репозиторий device.git.
root@4-docker1:/data/volume-oxidized2/.config/oxidized# ll total 164 -rw-r--r-- 1 30000 30000 1652 Aug 16 15:18 config -rw-r--r-- 1 30000 30000 693 Aug 16 15:31 crash drwxr-xr-x 2 30000 30000 4096 Aug 16 15:31 crashes drwxr-xr-x 6 30000 30000 4096 Aug 16 15:35 devices.git -rw-r--r-- 1 30000 30000 119028 Aug 16 15:35 log drwxr-xr-x 2 30000 30000 4096 Aug 16 15:20 logs -rw-r--r-- 1 30000 30000 2 Aug 16 15:35 pid -rw-r--r-- 1 30000 30000 64 Aug 16 15:35 router.db
Так же заработает веб-интерфейс на порту tcp/8888.
ВСТАВИТЬ КАРТИНКУ
Если что-то не поднялось, смотрим в файлы log и\или crash.
Если нужно собирать конфигурацию оборудования в виде файлов, то секцию output надо привести к виду ниже.
output:
default: file
file:
directory: "/home/oxidized2/.config/oxidized/configs-as-file/"
Если оборудование в группе, то в “/home/oxidized2/.config/oxidized” будет создана папка с именем группы и туда положен файл с конфигурацией.
Если оборудование без группы, то файл с конфигом будет в рабочей директории “/home/oxidized2/.config/oxidized”, а не в директории указанной в “output”.
В веб-интерфейсе конфигурация будет видна, но не будет диффов.
“Внутренний” репозиторий oxidized можно запушить в github/gitlab/gitea, в результате конфиг можно будет посмотреть в виде файлов.
На хостовой ВМ генерим ssh-ключ для пользователя контейнера “oxidized” (https://github.com/ytti/oxidized/blob/master/docs/Docker.md#store-the-ssh-keys-a-remote-git-repository).
Делаем директорию “.ssh” и задаём права.
root@4-docker1:~# mkdir /data/volume-oxidized2/.ssh root@4-docker1:~# chmod 700 /data/volume-oxidized2/.ssh/ root@4-docker1:~# chown 30000:30000 /data/volume-oxidized2/.ssh/
Генерим ключ.
root@4-docker1:~# ssh-keygen -t ed25519 -f /data/volume-oxidized2/.ssh/id_ox_key -C oxidized_in_docker
Сканируем публичные ключи хранилища, в данном случае ключи github.com, без этого oxidized не будет пушить (https://github.com/ytti/oxidized/issues/2753).
root@4-docker1:~# ssh-keyscan github.com >> /data/volume-oxidized2/.ssh/known_host # github.com:22 SSH-2.0-5ec3cafd # github.com:22 SSH-2.0-5ec3cafd # github.com:22 SSH-2.0-5ec3cafd # github.com:22 SSH-2.0-5ec3cafd # github.com:22 SSH-2.0-5ec3cafd
Ещё раз правим права для созданных файлов.
root@4-docker1:~# chown -R 30000:30000 /data/volume-oxidized2/.ssh/ root@4-docker1:~# ll /data/volume-oxidized2/.ssh/ total 12 -rw------- 1 30000 30000 411 Aug 16 21:33 id_ox_key -rw-r--r-- 1 30000 30000 100 Aug 16 21:33 id_ox_key.pub -rw-r--r-- 1 30000 30000 828 Aug 16 21:32 known_host
На github заводим приватный репозиторий.
В настройках репозитория добавляем публичную часть ранее созданного ключа: “Settings” → “Deploy keys” → “Add deploy key” (ставим галку “Allow write access ”).
Из контейнера проверяем доступ к github.
root@4-docker1:~# docker exec -it -u 30000:30000 <container_id> /bin/bash oxidized@63f75b7a022a:/$ oxidized@63f75b7a022a:/$ ssh -T -i ~/.ssh/id_ox_key git@github.com The authenticity of host 'github.com (140.82.121.3)' can't be established. ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU. This key is not known by any other names. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'github.com' (ED25519) to the list of known hosts. Hi kostyana/ox! You've successfully authenticated, but GitHub does not provide shell access.
Дописываем в config секцию hooks.
hooks:
push_to_remote:
type: githubrepo
events: [post_store]
remote_repo: git@github.com:kostyana/ox.git
publickey: /home/oxidized/.ssh/id_ox_key.pub
privatekey: /home/oxidized/.ssh/id_ox_key
Перезапускаем контейнер, файл конфига появится в github.