Perl
netdisco

【ツール紹介】netdisco

More than 1 year has passed since last update.

netdisco

スイッチ/ルータのポート管理ツール。
SNMPを利用してスイッチのポート一覧を出してくれるツール。
VLANやポートの状態も取得してくれる。

CPAN: https://metacpan.org/pod/App::Netdisco
github: https://github.com/netdisco/netdisco
デモサイト https://netdisco2-demo.herokuapp.com/

日本語ドキュメントというかドキュメントがCPANにしかない気がする。
必要な情報はすべてCPANのページに書いてある。優秀。

試験的に入れてみた

データセンターの集約SWの情報を取得。
catalyst 6500/6800 を10台程度取得した。
EX4200/4300も5台ほど取得できた。

  • ポート一覧は1台ずつの表示なのでこの程度ならサクサク
  • VLAN一覧は取れるものの、VLANのアドレスは一覧では分からないので残念

環境(Env)

  • CentOS6
  • postgresql
  • perl

install

  • パッケージ
# yum install perl-core perl-DBD-Pg net-snmp-perl net-snmp-devel openssl-devel make automake gcc
  • postgres
# yum install https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-6-x86_64/pgdg-centos96-9.6-3.noarch.rpm
# yum install postgresql96 postgresql96-devel 
# yum install postgresql96-server

# vi /var/lib/pgsql/9.6/data/pg_hba.conf

# service postgresql-9.6 initdb
# chkconfig postgresql-9.6 on
# service postgresql-9.6 start
pg_hba.confの差分
[localhost:root/509]# diff .backup/pg_hba.conf.org pg_hba.conf
80c80
< local   all             all                                     peer
---
> local   all             all                                     trust
82c82
< host    all             all             127.0.0.1/32            ident
---
> host    all             all             127.0.0.1/32            md5
[localhost:root/510]#
  • netdisco実行用system/postgres user作成
# useradd -m -s /bin/bash netdisco
# passwd netdisco  ## systemのnetdiscoユーザのパスワード設定

# su - postgres
$ createuser -DRSP netdisco
$ createdb -O netdisco netdisco
$ exit

# su - netdisco

$ echo 'export PATH=$PATH:/usr/pgsql-9.6/bin/' >> ~/.bashrc
$ source ~/.bashrc
  • netdisco install
    cpanmを実行するだけ
# su - netdisco

$ curl -L https://cpanmin.us/ | perl - --notest --local-lib ~/perl5 App::Netdisco

$ mkdir ~/bin/
$ ln -s ~/perl5/bin/{localenv,netdisco-*} ~/bin/
$ ~/bin/netdisco-backend status    ### 動くか確認のみ
  • config修正
$ mkdir ~/environments
$ cp -ip ~/perl5/lib/perl5/auto/share/dist/App-Netdisco/environments/deployment.yml ~/environments
$ chmod 600 ~/environments/deployment.yml
$ vi ~/environments/deployment.yml

postgresのユーザとパス、取得装置のsnmpCommunityを変更

deployment.ymlのdiff
[netdisco@localhost ~]$ diff ~/perl5/lib/perl5/auto/share/dist/App-Netdisco/environments/deployment.yml ~/environments/deployment.yml
13,15c13,15
<   user: 'changeme'
<   pass: 'changeme'
<   #host: 'localhost'
---
>   user: 'netdisco'
>   pass: 'netdisco'
>   host: '127.0.0.1'
34,35c34,35
<   - tag: 'default_v2_readonly'
<     community: 'public'
---
>   - tag: 'Community'
>     community: 'hogefuga'
[netdisco@localhost ~]$
  • 起動
$ netdisco-backend start
$ netdisco-web start

あとはweb-UIからでも見れる、CLIでも叩けるのでお好きな方で。

ポーリング

デフォルトでの自動ポーリングはなし
cron形式で登録する
https://metacpan.org/pod/distribution/App-Netdisco/lib/App/Netdisco/Manual/Configuration.pod#schedule

またはweb-UIからdiscoverってボタンを押せば更新してくれる

機器毎に取得時間をずらしたいなどの場合は
cronに netdisco-do discover -d [host] を登録しておけば頑張れそうな予感。

余談1 Postgresが壊れた時用

  • データ領域削除
# service postgresql-9.6 stop
# rm -rf /var/lib/pgsql/9.6/data/
  • データ領域再構築
# su - postgres
$ whoami
$ /usr/pgsql-9.6/bin/initdb -D /var/lib/pgsql/9.6/data
$ ls -l /var/lib/pgsql/9.6/data
$ exit

バックアップをとってなければ上記の通り修正すればいい。
# cp -ip /var/lib/pgsql/backups/pg_hba.conf /var/lib/pgsql/9.6/data/
# service postgresql-9.6 start
  • netdiscoの再起動
# su - netdisco
$ whoami

$ netdisco-web stop
$ netdisco-backend stop

$ netdisco-backend start
$ netdisco-web start

snmpで最新の状態を再取得すればいいだけなので、特にdumpしない運用でもよさげなので素敵。
あまりにも管理機器数が多い場合はrestoreした方がいいとかケースバイケースかしら。
DB上のWEB-UIからのnetdisco操作ログが吹っ飛ぶとかその程度の被害だと思います。

バックアップをとるならbasebackupが楽(pg_hba.conf的な意味で)

その他

SNMPがリードオンリーでない場合、AdminアカウントならWEB-UI上からポートの起動/停止ができるので、
Admin権限のないアカウントを作った方がよさそう。
Admin権限がないとdiscoverも実行不可だけど、悪戯や操作ミスは防げる。

LLDPを有効にしてないので全機能が使えてるわけではないけど、
それでもポート管理表としては問題なさそうでした。