Система управления конфигурациями Oxidized
Система управления конфигурациями Oxidized.
Содержание
1 Общая информация
- Создавался как альтернатива RANCID.
- Репозиторий: https://github.com/ytti/oxidized
2 Установка
2.1 Необходимое программное обеспечение
- Установите язык ruby:
1dnf -y install ruby
- Установите необходимые средства разработки:
- Установите git для хранения файлов:
1dnf -y install git
2.2 Установка Oxidized
- Добавьте пользователя
oxidized
:1useradd -c "oxidized system account" -m -d /home/oxidized -s /bin/bash oxidized
- Устанавливаем Oxidized:
2.3 Обновление Oxidized
- Логинимся под пользователем oxidized:
1su - oxidized
- Обновляем Oxidized:
3 Конфигурация
3.1 Конфигурация Oxidized
- Документация: https://github.com/ytti/oxidized/blob/master/docs/Configuration.md
- Запустите oxidized однократно для создания структуры каталогов и шаблона конфигурационного файла:
- Отредактируйте шаблон файла конфигурации
~oxidized/.config/oxidized/config
. - Oxidized использует формат YAML для конфигурационных файлов, поэтому все отступы должны быть выполнены пробелами, допускается два или четыре пробела на отступ.
- Основные элементы файла конфигурации:
Задание имени пользователя и пароля по умолчанию для соединения с устройствами:
Указание типа устройства по умолчанию (например, Cisco):
1model: ios
- Список устройств можно посмотреть в https://github.com/ytti/oxidized/tree/master/lib/oxidized/model.
- Список операционных систем: https://github.com/ytti/oxidized/blob/master/docs/Supported-OS-Types.md.
Зададим интервал создания копий данных в секундах (рекомендуется делать копии раз в сутки, что соответствует 86400 секундам):
1interval: 86400
Для устройств со слабыми характеристиками и медленными каналами связи рекомендуется увеличить таймаут (здесь таймаут 60 секунд, три повторные попытки):
Если вы не хотите, чтобы ваши резервные копии содержали чувствительные данные, такие как ключи и пароли, добавьте следующую опцию:
1remove_secret: true
Раздел
input
отвечает за связь с устройствами (по умолчанию используются протоколыssh
иtelnet
, протоколtelnet
не безопасен, рекомендуется использовать толькоssh
):Раздел
output
определяет способ хранения собранной информации (будем использовать git для этой цели):Раздел
source
задаёт базу данных устройств (используем CSV-файл с двоеточием в качестве разделителя):1source: 2 default: csv 3 csv: 4 file: "/home/oxidized/.config/oxidized/router.db" 5 delimiter: !ruby/regexp /:/ 6 map: 7 name: 0 8 model: 1 9 ip: 2 10 port: 3 11 username: 4 12 password: 5 13 gpg: false
- Опция
file
задаёт путь к файлу с базой устройств. - Подсекция
map
определяет порядок параметров подключения к устройству в строке CSV-файла.
- Опция
- Весь файл конфигурации:
1--- 2username: oxidized 3password: Password 4model: ios 5resolve_dns: true 6interval: 86400 7use_syslog: false 8debug: false 9threads: 30 10timeout: 140 11retries: 3 12prompt: !ruby/regexp /^([\w.@-]+[#>]\s?)$/ 13rest: 127.0.0.1:8888 14next_adds_job: false 15remove_secret: true 16vars: {} 17groups: {} 18models: {} 19pid: "/home/oxidized/.config/oxidized/pid" 20log: "/home/oxidized/.config/oxidized/log" 21crash: 22 directory: "/home/oxidized/.config/oxidized/crashes" 23 hostnames: false 24stats: 25 history_size: 10 26input: 27 default: ssh 28 debug: false 29 ssh: 30 secure: false 31 ftp: 32 passive: true 33 utf8_encoded: true 34output: 35 default: git 36 git: 37 user: oxidized 38 email: oxidized@MYDOMAIN.ru 39 repo: "/home/oxidized/.config/oxidized/devices.git" 40source: 41 default: csv 42 csv: 43 file: "/home/oxidized/.config/oxidized/router.db" 44 delimiter: !ruby/regexp /:/ 45 map: 46 name: 0 47 model: 1 48 ip: 2 49 port: 3 50 username: 4 51 password: 5 52 gpg: false 53model_map: 54 juniper: junos 55 cisco: ios
3.2 Хранение в git
3.2.1 Конфигурация сохранения в git
- Здесь используется интерфейс
libgit2
(не работают хуки).
Репозиторий без групп
- Конфигурация имеет вид:
Репозитории с группами
- Конфигурация имеет вид:
- Oxidized создаст репозиторий для каждой группы в том же каталоге, что и репозиторий
default.git
. - Если вы хотите использовать группы и один репозиторий, вы можете принудительно сделать это с помощью конфигурации
single_repo
:
3.2.2 Просмотр файлов устройств
- Перейдите в правильный репозиторий git для необходимого устройства и получите список устройств:
1git ls-files -s
- Посмотрите содержимое файла:
1git cat-file -p <object id>
3.2.3 Удалить отключённое устройство
- Очистить сохранённую конфигурацию устройства:
1git rm --cached <object id>
3.3 Файл описания оборудования
- Создадим файл:
/home/oxidized/.config/oxidized/router.db
: - Структура полей: наименование, тип оборудования, IP-адрес, порт, логин, пароль.
- Если значения отсутствуют, то используются значения по умолчания.
3.4 Службы запуска
- Запустим oxidized:
1systemctl enable --now oxidized.service
4 Подключение к LibreNMS
- Подключим oxidized к LibreNMS (см. Система мониторинга LibreNMS)
4.1 Общая информация
- Интеграция LibreNMS с Oxidized дает следующие преимущества:
- Просмотр конфигурации: «Текущая», «История» и «Различия» на вкладке «Конфигурации» каждого устройства.
- Автоматическое добавление устройств в Oxidized: включая фильтрацию и группировку для упрощения управления учетными данными.
- Поиск конфигурации.
4.2 Порядок действий
- Установить Oxidized.
- Подключить Oxidized к web-интерфейсу LibreNMS.
- Чтобы устройства добавлялись автоматически, вам необходимо настроить извлечения их из LibreNMS.
- LibreNMS автоматически сопоставит ОС с именем модели Oxidized, не нужно использовать параметр конфигурации
model_map
в Oxidized.
4.3 SELinux
- Необходимо разрешить
httpd
исходящие подключения к сети:1setsebool -P httpd_can_network_connect 1
4.4 Подключение Oxidized к web-интерфейсу LibreNMS
- Активируйте подключение к Oxidized/
Подключить можно в web-интерфейсе:
https://<ваш URL-адрес librenms>/settings/external/oxidized
Подключить можно в командной строке:
- Подключите управление версиями конфигурации (работает с модулем вывода git).
4.5 Информация о группах
- Oxidized поддерживает различные способы использования учётных данных для входа на устройства.
- Вы можете указать глобальное имя пользователя и пароль в Oxidized, имя пользователя и пароль на уровне группы или для каждого устройства.
- При синхронизации с LibreNMS можно делать только конфигурации для групп.
- LibreNMS поддерживает отправку групп в Oxidized, чтобы вы могли затем определить учётные данные группы в Oxidized. Чтобы включить эту поддержку, включите «Включить возврат групп в Oxidized».
- Можно установить группу по умолчанию (все устройства попадут в эту группу):
4.5.1 Задание разделения на группы
- Группы для Oxidized никак не связаны с группами LibreNMS.
- Чтобы вернуть переопределение в Oxidized, вы можете сделать это, предоставив ключ переопределения, затем сопоставив поиск хоста (или хостов) и, наконец, определив само значение переопределения.
- LibreNMS не проверяет достоверность этих атрибутов, а передает их в Oxidized в соответствии с определением.
- Сопоставление хостов можно выполнить с помощью
hostname
,sysname
,os
,location
,sysDescr
,hardware
,purpose
,notes
. - Порядок соответствия следующий:
- hostname
- sysName
- sysDescr
- hardware
- os
- location
- ip
- purpose
- notes
- Пример:
1lnms config:set oxidized.maps.group.os.+ '{"match": "ios", "value": "cisco"}' 2lnms config:set oxidized.maps.group.os.+ '{"match": "vrp", "value": "huawei"}' 3lnms config:set oxidized.maps.group.os.+ '{"match": "asa", "value": "asa"}' 4lnms config:set oxidized.maps.group.os.+ '{"match": "bdcom", "value": "bdcom"}'
4.5.2 Конфигурация в Oxidized
- При необходимости вы можете указать учетные данные для групп, используя следующее в вашей конфигурации Oxidized:
- Например:
4.6 Автоматическое добавление устройств в Oxidized
Нужно настроить учётные данные по умолчанию для ваших устройств в конфигурации Oxidized:
LibreNMS может перезагружать список узлов каждый раз, когда устройство добавляется в LibreNMS.
4.7 Переименование устройства
Чтобы история конфигурационных файлов осталась вместе с устройством, необходимо переписать историю git.
Для переписывания истории используется скрипт https://gist.github.com/emiller/6769886:
1#!/bin/bash 2# 3# git-mv-with-history -- move/rename file or folder, with history. 4# 5# Moving a file in git doesn't track history, so the purpose of this 6# utility is best explained from the kernel wiki: 7# 8# Git has a rename command git mv, but that is just for convenience. 9# The effect is indistinguishable from removing the file and adding another 10# with different name and the same content. 11# 12# https://git.wiki.kernel.org/index.php/GitFaq#Why_does_Git_not_.22track.22_renames.3F 13# 14# While the above sucks, git has the ability to let you rewrite history 15# of anything via `filter-branch`. This utility just wraps that functionality, 16# but also allows you to easily specify more than one rename/move at a 17# time (since the `filter-branch` can be slow on big repos). 18# 19# Usage: 20# 21# git-rewrite-history [-d/--dry-run] [-v/--verbose] <srcname>=<destname> <...> <...> 22# 23# After the repsitory is re-written, eyeball it, commit and push up. 24# 25# Given this example repository structure: 26# 27# src/makefile 28# src/test.cpp 29# src/test.h 30# src/help.txt 31# README.txt 32# 33# The command: 34# 35# git-rewrite-history README.txt=README.md \ <-- rename to markdpown 36# src/help.txt=docs/ \ <-- move help.txt into docs 37# src/makefile=src/Makefile <-- capitalize makefile 38# 39# Would restructure and retain history, resulting in the new structure: 40# 41# docs/help.txt 42# src/Makefile 43# src/test.cpp 44# src/test.h 45# README.md 46# 47# @author emiller 48# @date 2013-09-29 49# 50 51function usage() { 52 echo "usage: `basename $0` [-d/--dry-run] [-v/--verbose] <srcname>=<destname> <...> <...>" 53 [ -z "$1" ] || echo $1 54 55 exit 1 56} 57 58[ ! -d .git ] && usage "error: must be ran from within the root of the repository" 59 60dryrun=0 61filter="" 62verbose="" 63repo=$(basename `git rev-parse --show-toplevel`) 64 65while [[ $1 =~ ^\- ]]; do 66 case $1 in 67 -d|--dry-run) 68 dryrun=1 69 ;; 70 71 -v|--verbose) 72 verbose="-v" 73 ;; 74 75 *) 76 usage "invalid argument: $1" 77 esac 78 79 shift 80done 81 82for arg in $@; do 83 val=`echo $arg | grep -q '=' && echo 1 || echo 0` 84 src=`echo $arg | sed 's/\(.*\)=\(.*\)/\1/'` 85 dst=`echo $arg | sed 's/\(.*\)=\(.*\)/\2/'` 86 dir=`echo $dst | grep -q '/$' && echo $dst || dirname $dst` 87 88 [ "$val" -ne 1 ] && usage 89 [ ! -e "$src" ] && usage "error: $src does not exist" 90 91 filter="$filter \n\ 92 if [ -e \"$src\" ]; then \n\ 93 echo \n\ 94 if [ ! -e \"$dir\" ]; then \n\ 95 mkdir -p ${verbose} \"$dir\" && echo \n\ 96 fi \n\ 97 mv $verbose \"$src\" \"$dst\" \n\ 98 fi \n\ 99 " 100done 101 102[ -z "$filter" ] && usage 103 104if [[ $dryrun -eq 1 || ! -z $verbose ]]; then 105 echo 106 echo "tree-filter to execute against $repo:" 107 echo -e "$filter" 108fi 109 110[ $dryrun -eq 0 ] && git filter-branch -f --tree-filter "`echo -e $filter`"
- Поместим его в файл
/home/oxidized/bin/git-mv-with-history
.
- Поместим его в файл
Полный скрипт взят со страницы: https://github.com/ytti/oxidized/issues/1449:
1#!/bin/bash 2## https://github.com/ytti/oxidized/issues/1449 3#echo "Call rename-host host_old host_new huawei" 4 5OLD_NAME=$1 6NEW_NAME=$2 7HARD_TYPE=$3 8 9sudo systemctl stop oxidized 10 11sudo -u oxidized git config --global --add safe.directory "*" 12## can't commit without setting email 13sudo -u oxidized git config --global user.email "oxidized@rudn.su" 14## can't commit without setting name 15sudo -u oxidized git config --global user.name "Oxidized" 16 17rm -rf /tmp/devices.git.clone 18sudo -u oxidized mkdir -p /tmp/devices.git.clone && cd /tmp/devices.git.clone ;\ 19 git clone /home/oxidized/.config/oxidized/devices.git; \ 20 cd devices ; \ 21 /home/oxidized/bin/git-mv-with-history ${HARD_TYPE}/${OLD_NAME}=${HARD_TYPE}/${NEW_NAME} ; \ 22 git push --force 23rm -rf /tmp/devices.git.clone 24cd 25sudo -u librenms /usr/local/bin/lnms device:rename -vv ${OLD_NAME} ${NEW_NAME} 26sudo systemctl start oxidized