Типичная ситуация которая возникает при запуске в эксплуатацию NOC - добавление новых объектов МО в SA когда объектов в нём нет и автоматическое добавление замонтированного оборудования в процессе эксплуатации сети.
Я не умею программировать, поэтому задачу решал "в лоб" с использованием подручных инструментов:
- nmap
- bash
- команды ./noc csv-import sa.managedobject .....
у NOC есть возможность из консоли импорта специально сформированного csv файла с информацией о объектах МО. Основная цель скрипта - сформировать этот файл и передать его на импорт в систему.
Алгоритм действий такой:
- считать из параметров скрипта сканируемый диапазон IP
- передать их nmap и вывести результат сканирования в файл.
- построчно прочитать данный файл и провести проверку через psql , есть ли такой IP в объектах МО
- если объекта нет - вывести в текстовый файл специально сформированную строку
- сформированный .cvs файл передать на импорт в NOC и отправить на почту для информирования
Обратите внимание на пути:
- нок установлен в /opt/noc
в переменной BASEDIR - путь где выполняется скрипт
NMAPBIN путь к nmap
В качестве параметра скрипту передются ДВА диапазона для сканирования и параметр scan. При наличии параметра scan удаляются результаты предыдущей работы скрипта, если параметра нет - то скрипт работает с уже полученными данными. В директорию складывается архив хостов которые были добавлены.
запуск
$ mkdir data
$ ./cron.sh scan
........
# ls -1
cron.sh
hostsscan.txt
networkscan.txt
out.hostsadd.txt
out.hostsbd.txt
out.hostsscan.txt
result.hostsadd.csv
После работы скрипта получаются файлы:
- hostsscan.txt - файл с результатами сканирования сети NMAP
- networkscan.txt - список подсетей для сканирования в формате который понимаем nmap
- out.hostsadd.txt - файл со списком хостов которых нет в МО
- out.hostsbd.txt - файл со списком хостов которые ЕСТЬ в МО
- out.hostsscan.txt - файл с результатами сканирования сети NMAP
- result.hostsadd.csv - результат работы скрипта готовый для импорта через ./noc csv-import sa.managedobject .....
#!/bin/bash
# set -e ?
# todo
# 1. сделать работу скрипта без сканированияя сети. только генерацию по файлу от предыдущего скана. при этом не удалять файл скана
# 2. отправка результата по почте для оценки админом.
# 3. переделка на сканирование telnet\ssh а не пропинговкой.
# 4. добавление найденных устройств в бд.
# nmap -sP -iL networkscan.txt
export LANG="ru_RU.UTF-8"
export LOCALE="ru_RU"
BASEDIR=/opt/scripts/discoverynet
# проверяем или по телнету или по пингу.
# по пингу должно быть быстрее /16
NMAPBIN="/usr/bin/nmap -sP -n -iL $BASEDIR/networkscan.txt -oG $BASEDIR/out.hostsscan.txt"
# NMAPBIN="/usr/bin/nmap -sP -oG \"$BASEDIR/out.hostsscan.txt\""
echo $NMAPBIN
# заносим параметры по default для формирования csv файла
#name=address
is_managed="True"
administrative_domain="default"
segment="ALL"
activator="activatormain"
collector=""
profile_name="Generic.Host"
object_profile="default"
description=""
auth_profile=""
scheme="0"
address=""
port=""
user="admin"
password="admin"
super_password="admin"
remote_path=""
trap_source_ip=""
trap_community=""
snmp_ro="public"
snmp_rw="public"
vc_domain=""
vrf=""
termination_group=""
service_terminator=""
shape="Cisco/router"
config_filter_rule=""
config_diff_filter_rule=""
config_validation_rule=""
max_scripts="5"
tags="autoadd"
headcvs="name,is_managed,administrative_domain,segment,activator,collector,profile_name,object_profile,description,auth_profile,scheme,address,port,user,password,super_password,remote_path,trap_source_ip,trap_community,snmp_ro,snmp_rw,vc_domain,vrf,termination_group,service_terminator,shape,config_filter_rule,config_diff_filter_rule,config_validation_rule,max_scripts,tags"
# выполняем сканирование сети.
# в качестве параметра берём диапазон переданный из консоли.
if [ "$1" = "scan" ]
then
# очищаем вывод от предыдущего запуска
cd $BASEDIR && rm result* out*
# сканируем сеть
$NMAPBIN
fi
# читаем построчно получившийся файл и начинаем формировать файл для загрузки в бд.
while read -r line
do
profile_name="Generic.Host"
object_profile="default"
trap_source_ip=""
snmpcheckresult=""
name=$line
# echo $name
address=`echo $line | grep Host | grep "Status: Up" | awk '{print $2}'`
# проверяем что вывод ненулевой и проверяем есть ли оно в бд
if [ -n "$address" ]
then
$BASEDIR/sql.sh $address &
fi
echo -e "\n\n"
done < $BASEDIR/out.hostsscan.txt
# проверяем есть ли новые хосты. если есть то отправляем почту и добавляем в бд
# склеиваем CVS из "шапки" и "тела"
sleep 60
if [ -a $BASEDIR/out.hostsadd.txt ]
then
echo $headcvs > $BASEDIR/result.hostsadd.csv
cat out.hostsadd.txt >> $BASEDIR/result.hostsadd.csv
# удаляем из БД дубликаты
/opt/scripts/maintenance.fix/cron.sh
# добавление хостов.
cd /opt/noc && ./noc csv-import sa.managedobject -r skip -v 3 $BASEDIR/result.hostsadd.csv
RETVAL=$?
if [ $RETVAL -ne 0 ]
then
echo "error import"
/bin/mail -S sendcharsets=utf-8 -s "Ошибка импорта данных" -a $BASEDIR/result.hostsadd.csv root@example.com < $BASEDIR/result.hostsadd.csv
fi
# отправка почты
/bin/mail -S sendcharsets=utf-8 -s "Найденный новые хосты СПД" -a $BASEDIR/result.hostsadd.csv root@example.com < $BASEDIR/result.hostsadd.csv
fi
# переносим файл в архив.
mv $BASEDIR/result.hostsadd.csv $BASEDIR/data/`/bin/date +\%Y\%m\%d`.csv
sql.sh
#!/bin/bash
export LANG="ru_RU.UTF-8"
export LOCALE="ru_RU"
BASEDIR=/opt/scripts/discoverynet
# заносим параметры по default для формирования csv файла
#name=address
is_managed="True"
administrative_domain="default"
activator="activatormain"
collector=""
profile_name="Generic.Host"
object_profile="default"
description=""
auth_profile=""
scheme="0"
address=""
port=""
user="admin"
password="admin"
super_password="admin"
remote_path=""
trap_source_ip=""
trap_community=""
snmp_ro="public"
snmp_rw="public"
vc_domain=""
vrf=""
termination_group=""
service_terminator=""
shape="Cisco/router"
config_filter_rule=""
config_diff_filter_rule=""
config_validation_rule=""
max_scripts="5"
tags="autoadd"
headcvs="name,is_managed,administrative_domain,segment,activator,collector,profile_name,object_profile,description,auth_profile,scheme,address,port,user,password,super_password,remote_path,trap_source_ip,trap_community,snmp_ro,snmp_rw,vc_domain,vrf,termination_group,service_terminator,shape,config_filter_rule,config_diff_filter_rule,config_validation_rule,max_scripts,tags"
address=$1
SQLQUERY="SELECT address FROM sa_managedobject where address = '$address' and name not like 'wiping-%' limit 1 ;"
SQLRESULT=`echo $SQLQUERY | psql -U noc --dbname noc -X -A -t -q --no-align`
# Проверяем БД доступна
RETVAL=$?
if [ $RETVAL -eq 1 ]
then
echo "Postgress DOWN"
exit
fi
if [ -n "$SQLRESULT" -a $RETVAL -eq 0 ]
then
# хост присутствует в БД и надо проверять для него SNMP для обновления данных
echo -e $SQLRESULT "есть в БД"
# выводим адресс в файл
echo -e $address >> $BASEDIR/out.hostsbd.txt
else
echo -e $SQLRESULT "нет в БД"
# по параметрам default заполняет строку нужными значениями
# выводим в файл out.hostsadd.txt так как данного хоста нету в БД
# ADDROW="$address,True,default,activatormain,,Huawei.VRP,huawei.fttb,с.Алгай_ул.Новобозарная_13_Ал.Гай ЦАТС,,0,$address,0,admin,admin,admin,,$address,,,,,,,,Cisco/router,,,,5,"
# необходимо чтобы нормально работал пинг.
# $trap_source_ip = "$address"
ADDROW="$address,$is_managed,$administrative_domain,$segment,$activator,$collector,$profile_name,$object_profile,$description,$auth_profile,$scheme,$address,$port,$user,$password,$super_password,$remote_path,$address,$trap_community,$snmp_ro,$snmp_rw,$vc_domain,$vrf,$termination_group,$service_terminator,$shape,$config_filter_rule,$config_diff_filter_rule,$config_validation_rule,$max_scripts,$tags"
echo -e $ADDROW >> $BASEDIR/out.hostsadd.txt
fi
у меня скрипт запускается каждую ночь по расписанию в cron:
0 21 * * * /opt/scripts/discoverynet/cron.sh scan >/dev/null 2>&1