Блог
дек. 20 2024
Резервное копирование конфигураций оборудования средствами Netbox
Установка плагина
Для работы данного плагина у нас должен стоять napalm и плагин netbox-napalm-plugin, инструкция по настройка которого описывается в предыдущей статье.
Для резервного копирования конфигураций в netbox версии 4 и выше, существует плагин netbox-config-backup (GitHub - DanSheps/netbox-config-backup: A configuration backup system using napalm).
Перед установкой плагина необходимо установить git (если он еще у нас не стоит) для создания локального репозитория где будут храниться конфиги.
И создать репозиторий
$ cd /usr/local/share/netbox/condiff
$ git init
Поскольку я делал это на FreeBSD перед установкой плагина советую сделать симлинк git в каталог /usr/bin из каталога /usr/local/bin/git иначе плагин может не встать.
Устанавливаем из репозиториев или локально.
$ . /usr/local/share/netbox/venv/bin/activate
--- Ставим плагин ---
(venv)$ pip install netbox-config-backup
--- или ставим локально ---
python -m pip install path/to/Plugin
--- Добавляем плагин в зависимости Netbox что бы при обновлении он не слетел ---
(venv)$ echo netbox-config-backup >> /usr/local/share/netbox/requirements.txt
Теперь открываем configuration.py по пути /usr/local/share/netbox/netbox/ и добавляем в раздел PLUGIN и PLUGINS_CONFIG следующие строки.
PLUGINS_CONFIG = {
'netbox_config_backup': {
'repository': '/usr/local/share/netbox/condiff',
'committer': 'netbox commiter@example.com',
'author': 'netbox author@example.com',
'frequency': 3600,
},
Выполняем миграцию и перезапускаем службы
(venv)$ python3.11 /usr/local/share/netbox/netbox/manage.py migrate
--- перезапускаем службы ---
# service netbox restart
# service netboxrq restart
Создаем отдельную службу брокера через которую у нас будут выполняться задания резервного копирования.
# This sample rc script starts the RQ worker background service which is
# required for Webhooks and various automation tasks.
#
# PROVIDE: netbox_ncb
# REQUIRE: DAEMON
# KEYWORD: shutdown
#
# Add the following line to /etc/rc.conf.local or /etc/rc.conf
# to enable netbox-ncb:
#
# netbox_ncb_enable (bool): Set to NO by default.
# Set it to YES to enable netbox_ncb.
. /etc/rc.subr
name=netbox_ncb
rcvar=netbox_ncb_enable
load_rc_config $name
start_cmd="netbox_ncb_start"
start_precmd="netbox_ncb_precmd"
command="/usr/local/share/netbox/venv/bin/python3.11"
command_args="/usr/local/share/netbox/netbox/manage.py rqworker --name ncb@%i --with-scheduler netbox_config_backup.jobs"
pidfile=${netbox_ncb_pidfile:-/var/run/${name}/${name}.pid}
netbox_ncb_user=${netbox_ncb_user:-netbox}
netbox_ncb_precmd()
{
install -d -o ${netbox_ncb_user} `dirname ${pidfile}`
}
netbox_ncb_start()
{
echo "Starting netbox_ncb."
/usr/sbin/daemon -cf -p ${pidfile} -u ${netbox_ncb_user} ${command} ${command_args}
}
run_rc_command "$1"
Или можем также просто попробовать выполнить:
После версии плагина 2.1.4 все кастомные планировщики не нужны, данную службу создавать не нужно, задания должны выполняться через стандартный netbox-rq !!!!!!!!!!!!!!
Настройка Netbox
Для создания конфигов должны соблюдаться несколько условий:
- Установлен и настроен netbox-napalm-plugin;
- заведена платформа которая прописана в настройках napalm-plugin;
- устройства должен быть назначен основной ip адрес и указана платформа
Если все требования соблюдены идем в меню BACKUP JOBS\ Devices и добавляем новое устройство.

В поле name вводим имя бэкапа, выбираем device из перечня заведенных устройств и ip адрес, который мы выбрали основным в настройках устройства.

Поле статус означает, что данный бэкап включен и после сохранения задачи по сбору конфигурации попадут в планировщик.
Поле Config status отвечает всего лишь за визуальное обозначение наличия сохраненного конфига для данного бэкапа.
Если мы провалимся внутрь бекапа, то можем увидеть перечень резервных копий.
Справа можно увидеть две кнопки, первая показывает сам сохраненный конфиг, а вторая если выделить галками два конфига - их различия.
Так же после выхода версии плагина 2.1.4 можно посмотреть статус задач резервного копирования тут:

окт. 30 2024
Сбор конфигураций на сетевом оборудование средствами Netbox
Установка napalm
Для просмотра конфигурации устройств в netbox есть плагин, который называется netbox-napalm-plugin, он позволяет просматривать определенную информацию запрашиваемую у коммутатора или маршрутизатора, имеющего ssh или другой api через интерфейс netbox, про этом в самом netbox ничего не хранится.
Для начала необходимо установить сам napalm, плагин netbox-napalm-plugin и в нашем случае драйвер для RouterOS - napalm-ros.
При этом данные пакеты лучше добавить в зависимости самого netbox, что бы не было проблем при обновлении в будущем.
---Воспользуемся виртуальным окружением Netbox---
$ . venv/bin/activate
---Добавляем зависимости---
(venv)$ echo netbox-napalm-plugin >> /usr/local/share/netbox/requirements.txt
(venv)$ echo napalm-ros >> /usr/local/share/netbox/requirements.txt
---Ставим плагины---
(venv)$ pip install netbox-napalm-plugin
(venv)$ pip install napalm-ros
napalm позволяет запрашивать с оборудования структурированные данные в формате json, что в свою очередь очень удобно при использовании с сторонними API.
После установки необходимо добавить записи в конфиг /usr/local/share/netbox/netbox/netbox/configuration.py
2
3
4
5
6
7
8
9
10
11
PLUGINS_CONFIG = {
'netbox_napalm_plugin': {
'NAPALM_USERNAME': '<ssh_user>',
'NAPALM_PASSWORD': '<ssh_Password>',
'NAPALM_ARGS': {
'api_key': '<netbox-api>',
'ssh_port': '22',
}
}
}
Для например cisco требуются сообщать secret после ввода логина и пароля, для этого мы можем указывать дополнительные аргументы в конфигурационном файле:
NAPALM_ARGS = { 'secret': NAPALM_PASSWORD, # Include any additional args here }
(venv)$ python3.11 netbox/manage.py migrate
(venv)$ python3.11 netbox/manage.py collectstatic --no-input
---Перезапускаем службы---
# service netbox restart
# service netbox_rq restart
На примере микротиков, нам надо завести на всех устройствах учетку для napalm и разрешить подключаться с netbox к api и по ssh.
Добавление и настройка устройств в Netbox
После установки плагина у нас в меню появиться новый пункт:

К данному меню вернемся позже.
Для начала проверим правильно ли мы настроили устройства и можно ли запросить у них информацию через napalm.
Для этого можно выполнить команду
Мы увидим вывод:
"uptime": 7331045.0,
"vendor": "MikroTik",
"model": "CCR1036-8G-2S+",
"hostname": "CORE-MSK-ITSOFT",
"fqdn": "",
"os_version": "6.49.13 (long-term)",
"serial_number": "C6CC0C33A2EA",
"interface_list": [
.......
Теперь для того, что бы napalm мог запрашивать данные с устройств, нам необходимо добавить производителя:

платформу, где выберем ранее добавленного производителя:

И тип устройства, который можно добавить из шаблона или забить руками.
Далее в появившемся меню napalm, о котором говорилось в самом начале, создаем новую запись, где выбираем нашу платформу и указываем для нее драйвер napalm, в нашем случае "ros".

Теперь мы можем добавить устройство.

Заполняем все обязательные поля и платформу, которую мы ранее добавили.


После создания устройства переходим во вкладку интерфейсы и добавляем Ip адрес интерфейсу.

Вбиваем адрес с префиксом маски подсети и возвращаемся обратно в редактирование устройства, где в качестве основного адреса выбираем только что добавленный адрес.

Сохраняем и теперь мы можем увидеть, что у нас появились новые вкладки на странице устройства.



Еще раз напоминаю, данные получаемые по napalm не хранятся в netbox, а каждый раз запрашиваются с устройства.
окт. 15 2024
Создание кроссового журнала в Netbox
Подготовительные работы.
Для того чтобы использовать функционал кроссового журнала, нам необходимо:
1. Создать сайты к которым у нас будет привязано оборудование.
Сайты это сущности которые по сути могут приравниваться к зданию, помещению или фактическому месту нахождения оборудования.
2. Создать записи о производителях оборудования.
Тут мы заполняем только вендора (Dell, cisco и т.д.), при этом наименование производителя, которого мы завели должно совпадать с производителем в нашем шаблоне..
3. Добавить записи с типами устройств, которые являются шаблонами для непосредственно наших устройств.
Типы устройств могут заполняться вручную или быть загружены из шаблонов (большое количество готовых шаблонов можно найти на GitHuB или в ).
Для загрузки шаблона, переходим в "Типы устройств" -> "типы устройств", жмем импорт и вставляем в поле Data текст шаблона из файла yaml, нажимаем кнопку отправить.

4. Добавляем наше устройство:

Если мы выбрали тип устройства, которое добавили из шаблона, то все необходимые интерфейсы будут уже добавлены автоматически, проверить это можно на вкладке interfaces внутри записи о самом устройстве:
Если нам нахватает каких то интерфейсов, мы можем добавить их руками в этой же вкладке.
При желании мы можем назначить на интерфейс оборудования уже имеющийся IP адрес из IPAM или добавить новый, после чего в основных настройках оборудования мы можем выбрать для него основной IP адрес:


Создание кабельных соединений
После того как мы добавили все необходимые устройства и интерфейсы, можно начать создавать кабельные соединения:

Переходим в "Подключения" -> "Кабели" и добавляем новое соединение.
Выбираем устройства на стороне А и Б, интерфейсы и жмем добавить.
Так же новые соединения можно добавлять прямо из вкладки inerfaces внутри самого устройства:

После создания нового кабельного соединения мы можем посмотреть итоговую таблицу в разделе "Интерфейсные подключения", а также во вкладке Interfaces.
Отрисовка топологии
После создания всех соединений, можно установить плагин "NetBox Topology Views"
$ . /usr/local/share/netbox/venv/bin/activate
--- Создаем каталог для изображений ---
(venv)$ mkdir -p /usr/local/share/netbox/netbox/static/netbox_topology_views/img
--- Ставим плагин ---
(venv)$ pip install netbox-topology-views
--- Добавляем плагин в зависимости Netbox что бы при обновлении он не слетел ---
(venv)$ echo netbox-topology-views >> /usr/local/share/netbox/requirements.txt
Подключаем плагин в файле configuration.py
Настройки плагина:
'netbox_topology_views': {
'static_image_directory': 'netbox_topology_views/img',
'allow_coordinates_saving': True,
'always_save_coordinates': True
}
}
Теперь необходимо выполнить миграцию и наполнение статического содержимого и перезапустить службы:
(venv)$ python3.11 manage.py migrate
(venv)$ python3.11 manage.py collectstatic --no-input
# service netbox restart
# service netbox_rq restart
Теперь в интерфейсе у нас должен появиться раздел Topology views

Если мы перейдем в раздел Topology и на вкладке Filter поставим "Show cables", то увидим визуализацию всех наших соединений которые мы сделали в разделе "Подключения"


окт. 01 2024
Инвентаризация хостов Esxi в NetBox
Иногда в организации есть хренова тьма хостов с еще большей хреновой тьмой виртуальных машин, а при отсутствии системы управления например Vcenter или VMM запутаеться где какая ВМ проще чем кажется на первый взгляд.
Так же NetBox можно использовать в качестве "Источника истины" для добавления хостов сети в системы мониторинга на подобии Zabbix через REST API.
Данный скрипт создает сайты, устройства, платформы, интерфейсы устройств и виртуальные машины, а так же привязывает ip адреса к интерфейсам.
Установка
Ставим необходимые пакеты, скачиваем скрипт с GitHub или , проваливаемся в каталог со скриптом.
--- Активируем виртуальное окружение для Python (Будем использовать venv Netbox)---
$ cd /usr/local/share/netbox-scripts/
$ python3.11 -m venv venv
$ . venv/bin/activate
(venv)$ git clone https://github.com/bb-Ricardo/netbox-sync.git
(venv)$ cd netbox-sync/
(venv)$ pip install --upgrade pip
(venv)$ pip install wheel
(venv)$ pip install -r requirements.txt
Тут уже при установке зависимостей у нас может выскочить проблема с разрешением зависимостей для модуля cython, есть два варианта решения:
(venv)$ echo "cython<3" > /tmp/constraint.txt
(venv)$ PIP_CONSTRAINT=/tmp/constraint.txt pip install -r requirements.txt
2 вариант
(venv)$ pip install "cython<3.0.0" wheel
(venv)$ pip install "pyyaml==5.4.1" --no-build-isolation
(venv)$ pip install -r requirements.txt
vsphere-automation-sdk должен быть так же установлен для синхронизации VCenter с Netbox.
Качам для локальной установки или с GitHub
Получаем token

Редактируем settings.ini:
[netbox]
api_token = e34994b01df8ef81a57772336d2005d699118a02
host_fqdn = netbox.example.com
port = 443
validate_tls_certs = False
[source/Vcenter]
enabled = True
type = vmware
host_fqdn = 172.16.1.100
port = 443
username = netbox@example.com
password = P@ssw0rd
validate_tls_certs = False
permitted_subnets = 172.16.0.0/12, 10.0.0.0/8, 192.168.0.0/16, fd00::/8, !10.23.42.0/24
Указываем адрес сервера, token, порт и отключаем проверку сертификатов.
Данный скрипт работает как с Vcenter, так и с отдельными хостами ESXI.
Запускаем скрипт
После выполнения скрипта можно удостовериться, что у нас все добавилось.


окт. 01 2024
Настройка IPAM в Netbox
При наличии большого количества подсетей зачастую требуется аудит и мониторинг адресного пространства в них, для этого прекрасно подходит такой инструмент, как IPAM.
В качестве инструмента будем использовать Netbox и nmap.
Установка
Для установки нам потребуется скачать уже готовый скрипт от пользователя @lckrspirit с gitlab.
Для удобства его можно разместить где ни будь в каталоге c NetBox.
Качаем nmap, устанавливаем зависимости:
---Активируем виртуальное окружение (например в venv Netbox)--
$ cd/usr/local/share/netbox/
$ .venv/bin/activate
(venv)$ cd /usr/local/share/netbox/scripts
(venv)$ git clone https://gitlab.com/lckrspirit/netbox-ipam-auto-discovery.git
(venv)$ cd netbox-ipam-auto-discovery/
(venv)$ pip install python-nmap pynetbox
Так же его можно скачать
Заходим в NetBox в меню "Аутентификация" и получаем токен для обращения к API:

Генерируем токен (под суперпользователем это лучше не делать, а создать отдельного)

Открываем скрипт текстовым редактором и вводим адрес NetBox и сгенерированный Token

P.S. В netbox_url должны быть указаны адреса перечисленные в блоке "ALLOWED HOSTS" файла конфигурации Netbox configuration.py.
Запуск скрипта
Для запуска сканирования сети достаточно выполнить:
Теперь можно идти в меню IPAM и мы увидим отсканированные IP адреса.

Если мы еще добавим сеть в меню "Диапазоны IP- адресов мы сможем увидеть статистику использование адресного пространства в данном сегменте сети.

Скрипт сам обновляет и удаляет адреса, его можно назначить в задания cron на выполнение к примеру каждые 3 часа.
Дополнительно мы можем создать VLAN, группы и назначения, после чего связать с существующим диапазоном адресов.
Что бы мы могли видеть еще и свободные адреса, необходимо добавить префикс для нашей сети:

Указываем нашу сеть в поле префикс, статус, и ставим флаг, что данная сеть является пулом.
Синхронизация DNS записей.
Если в качестве DNS сервера используется роль Windows Server, то можно при помощи powershell-скрипта сопоставить найденные nmap ip адреса с записями DNS.
Пример скрипта:
.SYNOPSIS
Скрипт для синхронизации DNS записей с NetBox
.DESCRIPTION
Получает A-записи из DNS и обновляет соответствующие IP-адреса в NetBox с DNS именами
.NOTES
Требует модуля DnsServer для работы с DNS (устанавливается через Install-WindowsFeature RSAT-DNS-Server)
#>
#region Параметры
param (
[string]$ConfigFile = "config.json" # Файл конфигурации
)
# Загрузка конфигурации
try {
if (-not (Test-Path $ConfigFile)) {
throw "Конфигурационный файл не найден"
}
$config = Get-Content $ConfigFile | ConvertFrom-Json
# Обязательные параметры
$netboxUrl = $config.netboxUrl
$netboxToken = $config.netboxToken
$dnsServer = $config.dnsServer
$dnsZone = $config.dnsZone
# Проверка обязательных параметров
if ([string]::IsNullOrEmpty($netboxUrl) -or
[string]::IsNullOrEmpty($netboxToken) -or
[string]::IsNullOrEmpty($dnsServer) -or
[string]::IsNullOrEmpty($dnsZone)) {
throw "Не все обязательные параметры указаны в конфигурации"
}
}
catch {
Write-Error "Ошибка загрузки конфигурации: $_"
exit 1
}
#endregion
#region Вспомогательные функции
function Test-NetBoxConnection {
try {
$uri = "$netboxUrl/api/status/"
Write-Host "Проверка подключения к NetBox..."
$headers = @{
"Authorization" = "Token $netboxToken"
"Accept" = "application/json"
}
$response = Invoke-RestMethod -Uri $uri -Method Get -Headers $headers -TimeoutSec 5
if ($response) {
Write-Host "Подключение успешно. Версия NetBox: $($response.netbox_version)" -ForegroundColor Green
return $true
}
}
catch {
Write-Error "Ошибка подключения к NetBox: $($_.Exception.Message)"
return $false
}
}
function Invoke-NetBoxRequest {
param(
[string]$Endpoint,
[string]$Method = "GET",
[object]$Body = $null
)
$uri = "$netboxUrl/api/$($Endpoint.TrimStart('/'))"
try {
$headers = @{
"Authorization" = "Token $netboxToken"
"Accept" = "application/json"
}
$params = @{
Uri = $uri
Method = $Method
Headers = $headers
TimeoutSec = 10
}
if ($Body -ne $null) {
$params["ContentType"] = "application/json"
$params["Body"] = $Body | ConvertTo-Json -Depth 3
}
return Invoke-RestMethod @params
}
catch {
Write-Warning "Ошибка запроса к $uri : $($_.Exception.Message)"
return $null
}
}
function Get-NetBoxIpRecord {
param([string]$ipAddress)
$response = Invoke-NetBoxRequest "ipam/ip-addresses/?address=$ipAddress"
if (-not $response) { return $null }
foreach ($record in $response.results) {
$recordIp = ($record.address -split '/')[0]
if ($recordIp -eq $ipAddress) {
return $record
}
}
return $null
}
function Test-DnsServerConnection {
try {
Write-Host "Проверка подключения к DNS серверу $dnsServer..."
$test = Get-DnsServerZone -ComputerName $dnsServer -Name $dnsZone -ErrorAction Stop
return $true
}
catch {
Write-Error "Ошибка подключения к DNS серверу: $_"
return $false
}
}
function Clean-DnsName {
param([string]$name)
# Удаляем лишние символы и лишние точки
$cleanName = $name -replace '[^a-zA-Z0-9\-\.]', '' -replace '\.+', '.' -replace '^\.|\.$', ''
return $cleanName
}
#endregion
#region Основной процесс
try {
# Проверка подключений
if (-not (Test-NetBoxConnection)) { exit 1 }
if (-not (Test-DnsServerConnection)) { exit 1 }
Write-Host "Получение DNS записей из зоны $dnsZone..."
$dnsRecords = Get-DnsServerResourceRecord -ZoneName $dnsZone -ComputerName $dnsServer -ErrorAction Stop |
Where-Object { $_.RecordType -eq "A" }
$totalRecords = $dnsRecords.Count
$processed = 0
$updated = 0
foreach ($record in $dnsRecords) {
$processed++
$ip = $record.RecordData.IPv4Address.IPAddressToString
$name = $record.HostName
$cleanName = Clean-DnsName -name $name
Write-Progress -Activity "Синхронизация с NetBox" -Status "Обработка $processed из $totalRecords" -PercentComplete ($processed/$totalRecords*100)
$nbRecord = Get-NetBoxIpRecord -ipAddress $ip
if (-not $nbRecord) {
Write-Warning "IP $ip ($cleanName) не найден в NetBox"
continue
}
if ([string]::IsNullOrWhiteSpace($cleanName)) {
Write-Warning "Не удалось получить корректное DNS имя для IP $ip"
continue
}
if ($nbRecord.dns_name -ne $cleanName) {
Write-Host "Обновление: $ip ($(if ($nbRecord.dns_name) { $nbRecord.dns_name } else { 'нет имени' }) → $cleanName)"
$result = Invoke-NetBoxRequest "ipam/ip-addresses/$($nbRecord.id)/" -Method PATCH -Body @{dns_name = $cleanName}
if ($result) {
$updated++
Write-Host "Успешно обновлено" -ForegroundColor Green
}
}
}
Write-Host "Синхронизация завершена. Обработано записей: $processed, обновлено: $updated" -ForegroundColor Cyan
}
catch {
Write-Error "Критическая ошибка: $_"
exit 1
}
#endregion
Конфигурационный файл в формате json (должен находиться в одном каталоге со скриптом при запуске через планировщик).
"netboxUrl": "https://netbox.example.com",
"netboxToken": "1234546789qaweasdzxc456789qwe456",
"dnsServer":example.com"
}
Данный скрипт можно закинуть в планировщик задач и запускать его по расписанию.
$trigger = New-ScheduledTaskTrigger -Daily -At 3am
$settings = New-ScheduledTaskSettingsSet -StartWhenAvailable -DontStopOnIdleEnd -ExecutionTimeLimit (New-TimeSpan -Hours 1)
Register-ScheduledTask -TaskName "Sync NetBox DNS" -Action $action -Trigger $trigger -Settings $settings -RunLevel Highest -Description "Синхронизация A-записей DNS с NetBox"
сент. 24 2024
Настройка уведомлений о результатах выполнения планов обслуживания MSSQL
Входе настройки процедур резервного копирования баз данных в СУБД MS SQL Server присутствует необходимость отслеживания результатов выполнения планов обслуживания.
Рассмотрим два возможных варианта по уведомлению администраторов резервного копирования.
Настройка почтовых уведомлений
ВНИМАНИЕ!!! Для работы Database Mail требуется установка компонента Net Framework 3.5!!!
В MS SQL Server уже есть встроенный компонент, отвечающий за отправку почты который называется DatabaseMail, который мы можем найти в Object Explorer в каталоге Managment.

Тыкнув на него нам откроется мастер конфигурации:

Тыкаем на далее и выбираем первый пункт, в появившемся окошке жмем "YES"

Жмем указываем имя профиля, жмем Add и добавляем новый Mail Account, где заполняем имя аккаунта, почтовый адрес и настройки подключения к SMTP серверу.

Нажимаем Ок, Next и в следующем шаге назначаем нашего пользователя профилю.

Прощёлкиваем далее до конца и жмем закрыть.
Мы настроили компонент Database Mail, теперь необходимо добавить операторов, которым он будет слать уведомления по почте, для этого в Object Explorer переходим во вкладку SQL Server Agent и находим папку Operators, на которой щелкаем правой кнопкой и выпираем New Operator.

В открывшемся окне заполняем поля Name и E-mail name этого будет достаточно.

Теперь открываем наш Maintance Plan в котором необходимо настроить уведомления и добавляем элемент "Notify Operator Task", перетаскивая его на наш Maintace Plan

Теперь нам надо соединить задачу резервного копирования с задачей уведомления оператора и нажать на соединяющую их стрелку. В открывшемся окне выбрать в качестве Evaluation operation - Constraint, в качестве Value - Fail, для того что бы уведомление оператора происходило только при ошибке выполнения задания.

Сохраняем план обслуживания и ждем уведомлений на почту.
Настройка уведомлений через Telegram
MS SQL Server поддерживаем выполнение скриптов PowerShell через задания SQL Agent.
Отравлять уведомления в телегу будем как раз через PowerShell.
Скрипт:
$chat_id = "-88541191" # Тут указываем id чата
$name=[System.Net.Dns]::GetHostName() | Select
$text1 = "Ошибка задания резервного копирования MSSQL "
$URI = "https://api.telegram.org/bot" + $token + "/sendMessage?chat_id=" + $chat_id + "&text=" + $text1 + "`n" + $name
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-WebRequest -URI ($URI) –UseBasicParsing
Создаем задание SQL Agent:

Добавляем шаг, вводим Step Name, выбираем тип задания PowerShell и вставляем наш скрипт и жмем ОК

Добавляем в наш план обслуживание выполнения задания


Два раза тыкаем на задачи выполнения агента и выбираем наше задание.

Жмем ОК и сохраняем план обслуживания.
сент. 23 2024
Установка NetBox
Требования
Устанавливать будем на FreeBSD 14.1, для Linux дистрибутивов шаги особо ничем не будут отличаться.
Установка PostgreSQL
Смотрим какие версии у нас есть в репозитории, нам нужна версия 10 или выше.
Ставим последнюю доступную версию:
Включаем службу и инициализируем СУБД:
postgresql_enable: -> YES
# service postgresql initdb
Настраиваем pg_hba.conf
Где ADDRESS - IP адрес или сеть откуда мы сможем соединиться с нашей СУБД.
METHOD - метод авторизации, в данном случае это шифрованный пароль. (md5 - хешированный пароль).
Редактируем postgresql.conf:
Запускаем службу:
Подключаемся к СУБД
И создаем базу, пользователя netbox и даем пользователю права на базу:
CREATE USER netbox WITH PASSWORD 'P@ssw0rd!';
ALTER DATABASE netbox OWNER TO netbox;
GRANT CREATE ON SCHEMA public TO netbox;
Выходим, набирая \q.
Далее можно проверить соединение с БД для пользователя netbox
Установка Redis
Устанавливаем пакет Redis (в разных дистрибутивах он может назваться по разному, например: redis-server) и проверяем версию, она должна быть не ниже 4.0.
# redis-server -v
Redis server v=7.2.5 sha=00000000:0 malloc=libc bits=64 build=a673021ce8a50e10
Далее включаем службу и проверяем работоспособность сервиса.
redis_enable: -> YES
# service redis start
# redis-cli ping
PONG
Установка NetBox
Перед установкой нам нужно доставить все зависимости, для разных дистрибутивов пакеты будут называться по разному, лучше обратиться к официальной документации
Качаем последнюю стабильную версию с Github Releases netbox-community/netbox (github.com) , распаковываем архив и ставим, возможно нас попросят доставить зависимости, например django.
# wget https://github.com/netbox-community/netbox/archive/v4.1.1.tar.gz
# tar -xzf v4.1.1.tar.gz -C /usr/local/share/
# mv /usr/local/share/netbox-4.1.1 /usr/local/share/netbox
Или
# pkg install git
# git clone -b master --depth 1 https://github.com/netbox-community/netbox.git
Создаем пользователя netbox и выдаем ему права на каталоги:
# chown -R netbox /usr/local/share/netbox/netbox/media/
# chown -R netbox /usr/local/share/netbox/netbox/reports/
# chown -R netbox /usr/local/share/netbox/netbox/scripts/
Доставляем зависимости (увидим какие при выполнении скрипта):
$ cd /usr/local/share/netbox/
$ pip install venv
$ python3.11 -m venv venv
$ . venv/bin/activate
(venv)$ pkg install py311-django50
(venv)$ pkg install py311-pip
(venv)$ pkg install rust
(venv)$ pkg install openjpeg
(venv)$ pkg install zlib-ng
(venv)$ pip install --upgrade pip setuptools wheel
(venv)$ pip install --upgrade pillow
(venv)$ cd /usr/local/share/netbox/
(venv)$ pip install -r requirements.txt
Проваливаемся в каталог с конфигами NetBox и переименовываем пример файла конфигурации, который называется configuration.py.
(venv)$ cp configuration_example.py configuration.py
В файле конфигурации вводим настройки соединения с базой Postgresql и Redis:
'NAME': 'netbox', # Database name
'USER': 'netbox', # PostgreSQL username
'PASSWORD': 'P@ssw0rd!', # PostgreSQL password
'HOST': 'localhost', # Database server
'PORT': '', # Database port (leave blank for default)
'CONN_MAX_AGE': 300, # Max database connection age (seconds)
}
'tasks': {
'HOST': 'localhost', # Redis server
'PORT': 6379, # Redis port
'PASSWORD': '', # Redis password (optional)
'DATABASE': 0, # Database ID
'SSL': False, # Use SSL (optional)
},
'caching': {
'HOST': 'localhost',
'PORT': 6379,
'PASSWORD': '',
'DATABASE': 1, # Unique ID for second database
'SSL': False,
}
}
Указываем список имен FQDN или IP адресов с которых мы будем иметь доступ к сервису NetBox ('*' звездочка означает все доступные адреса), обычно эта запись дублирует имя и адрес хоста на котором стоит Netbox.
Устанавливаем SECRET_KEY, который является секретной, псевдослучайная строкой, используемой для помощи в создании новых криптографических хэшей для паролей и файлов cookie HTTP. Ключ, определенный здесь, не должен распространяться за пределами файла конфигурации. может быть изменен в любое время без влияния на сохраненные данные, однако имейте в виду, что это приведет к аннулированию всех существующих пользовательских сессий. Развертывания NetBox, состоящие из нескольких узлов, должны иметь один и тот же секретный ключ, настроенный на всех узлах.SECRET_KEY.
(venv)$ python3.11 netbox/generate_secret_key.py
После выполнения скрипта, копируем секретный ключ в файл конфигурации configuration.py
Далее создаем структуру базы данных и суперпользователя:
(venv)$ cd /usr/local/share/netbox/netbox
(venv)$ python3.11 manage.py migrate
(venv)$ python3.11 manage.py createsuperuser
(venv)$ python3.11 manage.py collectstatic --no-input
Для проверки того, что мы все сделали правильно пробуем запустить NetBox в тестовой режиме:
(venv)$ python3.11 manage.py runserver 0.0.0.0:8000 --insecure
Теперь мы можем зайти по адресу netbox.example.com:8000 под пользователем которого мы создали в предыдущем шаге.

Настройка запуска в качестве службы
Для запуска сервиса будем использовать WSGI-сервер Gunicorn.
Ставим Gunicorn:
Если для дистрибутивов Linux примеры конфигурационных файлов сервисов лежать в каталоге /netbox-4.1.1/contrib/, то для freebsd скопируем текст скрипта сервиса в файл /usr/local/etc/rc.d/netbox
# This sample rc script eliminate the need to use sysutils/py-supervisor to
# run NetBox as a system service. Only www/py-gunicorn is needed as a WSGI.
#
# Of course a working HTTP server like Apache/nginx is still required to make
# use of the gunicorn WSGI.
#
# PROVIDE: netbox
# REQUIRE: DAEMON
# KEYWORD: shutdown
# netbox_enable (bool): Set to NO by default.
# Set it to YES to enable netbox.
# netbox_config (str): Default to "/usr/local/etc/${name}.conf}"
# Config file for gunicorn's netbox config file
# netbox_command (str): Default to "/usr/local/share/netbox/venv/bin/gunicorn"
# Path to gunicorn to run netbox
# netbox_bind (str): Default to "localhost:8001"
# Interface and port to bind to
# netbox_workers (int): Default to "3"
# Number of gunicorn works
# netbox_timeout (int): Default to "120"
# Worker timeout for gunicorn
. /etc/rc.subr
name="netbox"
rcvar=netbox_enable
netbox_path=/usr/local/share/netbox/netbox/
load_rc_config $name
start_precmd="netbox_precmd"
command=${netbox_program:-/usr/local/share/netbox/venv/bin/gunicorn}
procname=${netbox_procname:-/usr/local/share/netbox/venv/bin/python3.11}
netbox_chdir=${netbox_path}
pidfile=${netbox_pidfile:-/var/run/${name}/${name}.pid}
netbox_user=${netbox_user:-netbox}
netbox_bind=${netbox_bind:-localhost:8001}
netbox_workers=${netbox_workers:-3}
netbox_timeout=${netbox_timeout:-120}
command_args="${netbox_args} -D \
--log-syslog --log-syslog-prefix ${name} \
--log-syslog-to unix:///var/run/log#dgram \
--disable-redirect-access-to-syslog \
-p ${pidfile} --pythonpath ${netbox_chdir} \
-b ${netbox_bind} -w ${netbox_workers} -t ${netbox_timeout} \
netbox.wsgi"
netbox_precmd()
{
install -d -o ${netbox_user} 'dirname ${pidfile}'
}
run_rc_command "$1"
Добавляем записи в rc.conf и разрешаем выполнение rc-скрипта
# chmod +x /usr/local/etc/rc.d/netbox
Теперь можно запускать службу.
P.S. После запуска службы лично она у меня сразу грохалась с ошибкой создания .pid файла, для этого я создал заранее каталог для pid файла netbox и сделал пользователя netbox его владельцем
# chown netbox /var/run/netbox
Создание SSL сертификата
Для работы через протокол https нам потребуется сертификат, мы может сгенерировать самоподписанный сертификат на 10 лет командой:
-keyout /etc/ssl/private/netbox.key \
-out /etc/ssl/certs/netbox.crt
Но в моем случае, при наличии доменного центра сертификации я сгенерирую запрос на выдачу сертификата.
Для этого необходимо создать конфигурационный файл, например netbox_openssl.cnf:
distinguished_name=req_distinguished_name
promt = no
[ req_distinguished_name ]
commonName = FQDN of server
commonName_default = APACHE-SERVER.mydom.com
countryName = Country Name (2 letter code)
countryName_default = RU
0.organizationName = Organization Name (eg, company)
0.organizationName_default = MyCompany
localityName = Locality Name (eg, city)
localityName_default = Moscow
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = MOSCOW
subjectAltName = domain name
subjectAltName_default = example.com
[req_ext]
subjectAltName = @alt_names
[alt_names]
DNS.1 = netbox.example.com
IP.1 = 172.16.1.100
Создаем закрытый ключ и запрос на сертификат:
# openssl req -new -key netbox.example.com.key -config netbox_openssl.cnf -reqexts req_ext -out netbox.csr
По запросу выдаем сертификат и кидаем к нам на сервер.
Установка NGINX в качестве обратного прокси
Перед тем как ставить nginx нам надо создать каталог static если мы его еще не создали.
И запускаем скрипт:
$ sh /usr/local/share/netbox-4.1.1/upgrade.sh
Ставим nginx и включаем службу:
# sysrc nginx_enable="YES"
Редактируем конфиг nginx где указываем location и пути до наших сертиков:
Запускаем службу и пробуем войти в netbox https://netbox.example.com
Настройка housekeeping
Для очистки старых заданий и очередей необходимо настроить housekeeping
открываем cron и вставляем туда команду:
Или создаем скрипт
Настройка Netbox RQ
Данная служба отвечает за выполнение заданий запускаемых из NetBox и является по сути обычным планировщиком, через который мы можем выполнять скрипты по расписанию.
Например мы сначала цепляем скрипт, а потом создаем задачу на его выполнение:


Для запуска службы нам по аналогии со службой netbox нужно создать файл скрипта службы:
# This sample rc script starts the RQ worker background service which is
# required for Webhooks and various automation tasks.
#
# PROVIDE: netbox_rq
# REQUIRE: DAEMON
# KEYWORD: shutdown
#
# Add the following line to /etc/rc.conf.local or /etc/rc.conf
# to enable netbox-rq:
#
# netbox_rq_enable (bool): Set to NO by default.
# Set it to YES to enable netbox_rq.
. /etc/rc.subr
name=netbox_rq
rcvar=netbox_rq_enable
load_rc_config $name
start_cmd="netbox_rq_start"
start_precmd="netbox_rq_precmd"
command="/usr/local/share/netbox/venv/bin/python3.11"
command_args="/usr/local/share/netbox/netbox/manage.py rqworker"
pidfile=${netbox_rq_pidfile:-/var/run/${name}/${name}.pid}
netbox_rq_user=${netbox_rq_user:-netbox}
netbox_rq_precmd()
{
install -d -o ${netbox_rq_user} `dirname ${pidfile}`
}
netbox_rq_start()
{
echo "Starting netbox_rq."
/usr/sbin/daemon -cf -p ${pidfile} -u ${netbox_rq_user} ${command} ${command_args}
}
run_rc_command "$1"
Дать разрешение на выполнения файла скрипта и добавить его rc.conf:
# sysrc netbox_rq_enable="YES"
# service netbox_rq start
сент. 16 2024
Установка FTP сервера ProFTP на Feebsd 14.1
- Установка proftpd
- Настройка базовой аутентификации по пользователи и паролю
- Настройка анонимного доступа
Установка proftpd
# sysrc proftpd_enable="YES"
Далее создаем пользователя
Указываем в мастере группу ftp.
Настройка базовой аутентификации по пользователи и паролю
Узнаем идентификатор пользователя и группы ftp:
Далее нам необходимо сгенерировать файл ftp.passwd и ftp.group для виртуального пользователя, для этого необходимо использовать утилиту ftpasswd, поскольку это perl-скрипт, нам надо установить среду perl:
# ftpasswd --group --name=ftp --file=/usr/local/etc/proftpd/ftpd.group --gid=14 --member ftp
открываем конфигурационный файл /usr/loca/proftpd/etc/proftpd.conf
Запускаем сервис:
Если при запуске службы будет вылазить ошибка: unable to use world-readable AuthUserFile ‘/use/local/etc/proftpd/ftpd.passwd’: Операция не позволена,
То раздадим права доступа:
chmod 640 /use/local/etc/proftpd/ftpd.passwd
chown proftpd:root /use/local/etc/proftpd/ftpd.passwd
Настройка анонимного доступа
Тут все тоже самое только конфигурационный файл будет отличаться.
авг. 10 2024
Настройка сервера NPS на базе Windows Server 2012R2
Установка и настройка роли сервера сетевых политик.
1. Включение роли
Нажмите кнопку Пуск, выберите пункт Выполнить и введите CompMgmtLauncher, после чего нажмите клавишу ВВОД.
В окне Диспетчер сервера в разделе Сводка по ролям выберите Добавить роли и нажмите кнопку Далее.
Установите флажок службы политики сети и службы доступа и дважды нажмите кнопку Далее.
Установите флаг Сервер политики сети нажмите кнопку Далее, а затем нажмите кнопку Установить.
Если установка завершена успешно, нажмите кнопку Закрыть.
В окне Диспетчер сервера нажмите кнопку Закрыть.
2. Настройка сервера политики сети
Запустить консоль сервера NAP можно через диспетчер сервера.
Либо через консоль mmc путем добавление оснастки «Сервер политики сети».
Далее необходимо зарегистрировать сервер в Active Directory.
Для регистрации сервера необходим доступ администратора домена либо сервер уже должен быть членом группы «RAS and IAS Servers»
3. Создание RADIUS– клиента
Для создание нового клиента нужно щелкнуть правой клавише мыши на представлении RADIUS—клиенты, выбрать Новый документ и ввести понятное имя клиента, ip—адрес и общий секрет.
Изначально количество символов составляет 64, но не все устройства поддерживают такой длинный секрет.
Так же для удобства можно, создать шаблон с общим секретом во вкладке Управление шаблонами.
При создании клиента можно выбрать шаблон секрета из списка

4. Создание сетевых политик
Первым шагом необходимо зайти в представление «Политики запросов на подключение» и в политике создан-ной по умолчанию с именем «Использовать проверку подлинности Windows для всей пользователей» изменить значение на ежедневно с 00:00—24:00.
В представлении «Сетевые политики» нам необходимо создать новую политику.
Вводим имя политики и жмем Далее.

На следующей вкладке добавляем новое условие. В данном случае указываем имя группы, которой хотим предо-ставить доступ, жмем Добавить группы, выбираем группу пользователей и нажимаем ОК.
Поскольку настройки политик для каждого вендора существенно различаются добавляем еще одно условие Понятное имя клиента , куда вводим часть имени RADIUS-клиента.
Знак ? подразумевает, что наше условие будет обрабатывать запросы на подключение от всех клиентов в имени которых присутствует Arlan.
На следующей вкладке выставляем флаг Доступ разрешен и жмем Далее
Поскольку протокол PPP не поддерживает других методов проверки подлинности во вкладке Настройка методов про-верки подлинности ставим флаг «Проверка подлинности открытым текстом (PAP, SPAP)», остальные флажки можно снять.
Нажимаем Далее и у нас появляется следующее сообщение:
Нажимаем НЕТ и Далее.
Убираем флаг «Без шифрования» и жмем ОК.

Настройка RADIUS на клиенте.
Настройка для каждого вендора выполняется зачастую по своему, по этому постараюсь привести немногие варианты.
1. Настройка коммутаторов Allied Telesis AT8000s
Настраиваем политику сети
Полный доступ:


Доступ только на чтение:


2. Настройка коммутаторов Brocade ICX
Настраиваем политику сети
Полный доступ:
Добавляем новый параметр во вкладке «Параметры зависящие от поставщика», вводим код поставщика 1991, настраиваем атрибут с номером атрибута 1 и значением атрибута 0.

Доступ только чтение
Добавляем новый параметр во вкладке «Параметры зависящие от поставщика», вводим код поставщика 1991, настраиваем атрибут с номером атрибута 1 и значением атрибута 5.

3 Настройка коммутаторов QTECH
Настройка политики сети
Полный доступ:

Доступ только чтение:

4. Настройка коммутаторов Cisco
Только чтение:

5. Настройка коммутаторов Arlan
авг. 10 2024
Настройка MPIO на Windows Server
Данная инструкция подходит для Windows Server 2012 и выше...
Включение компонента MPIO
Через PowerShell выполняем команду :
Что бы проверить установлен ли модуль, выполняем:
После установки компонента MPIO, Microsoft добавляет свой DSM (Vendor 8Product), но нам его может оказаться недостаточно, по этому добавляем дополнительный девайс MPIO на примере IBM STORWIZE V7000 следующей командой:
Мы можем проверить добавилось ли устройство командой:
Вывод команды:
VendorId ProductId
-------- ---------
Vendor 8 Product 16
IBM 2145
Мы видим, что наше устройство было добавлено.
В моем случае у меня установлен всего один хостовый FC адаптер, по этому настройку завершить, но если у вас подключено несколько адаптеров или имеется несколько портов на одном адаптере и все они подключены к СХД, то в итоге мы увидим один и тот же LUN в нескольких экземпляров. Что бы такого не произошло нам необходимо настроить балансировщик MSDSM.
Для проверки можем выполнить команду:
Настроить его можно через утилиту mpclaim.exe:
В нашем случае просто выполним: mpclaim.exe -r -i -a ""
Параметр
| Значение
| Описание
|
-r
| Restart_option
| Автоматическая перезагрузка без запроса
|
-n
|
| Подавление запроса на перезагрузку.
|
-i
| Install_switch
| Установка MPIO и добавления поддержки нескольких путей для устройства хранения
|
-u
|
| Удаление MPIO и отмена поддержки устройства хранения
|
-d
| <device_hwid>
| Задает устройство, для которого нужна поддержка MPIO. Идентификаторы устройств должны быть разделены пробелом.
|
-a
|
| Применение поддержки MPIO ко всем совместимым устройствам.
|
-c
|
| Применение поддержки MPIO только к устройствам, совместимым с SPC-3. Этот параметр применим только при установке. При удалении MPIO (с помощью параметра -u для install_switch) переключатель -c будет восприниматься командой как переключатель -a.
|
| <device_hwid>
| Коды устройств, которые будут поддерживаться MPIO, в формате VendorProduct, где Vendor - это имя производителя или поставщика, а Product - это название продукта или модели. Несколько кодов должны отделяться друг от друга пробелами. Этот параметр используется только с переключателем устройства -d.
|
Примечание
После выполнения всех действий нам необходимо узнать WWN нашего адаптера, сделать это можно утилитой и если сервер подключен через FC коммутатор, необходимо настроить zones (что бы понять как лучше сделать, необходимо читать документацию производителя оборудования, у всех рекомендации разные) или просто удалить зоны с коммутатора.
Только после этого мы можем заходить на полку и отдавать LUN хосту.