インフラエンジニアの井上です。
これは TECHSCORE Advent Calendar 2015 の19日目の記事です。
今回はふとしたアイデアから「種を探す」を目的とした記事です。
運用は枯れた技術も新しい技術も活きる分野ですが、今回は枯れた技術を利用します。
私は「情報管理の難しさ」を日々感じています。
インフラエンジニアという立場では、「今のインフラはどうなっているの?」というところを整理できているかが運用負担を小さくできる要素だと考えます。
文字列で書き起こしても沢山説明しても読まれない為、図を描き起こすのですが、図も描いた人のセンスで使えるものになるのか否かが変わってきますし、図の作成時間も馬鹿になりません。
このあたりの問題をどのように和らげるかということをテーマとして、一般化された図の描き方を採用した上で何とか自動で図を作れないかという模索が今回ご紹介する内容です。
ここで私が着目したのがnwdiagです。nwdiagはブロック図生成ツールblockdiagのネットワーク図生成ツールの派生です。テキストフォーマットで記載し、このツールを通すことで、PNG/SVG/PDFといった形式で図を作成できるというもので、イメージ的にはTeXが近いと思います。
環境の用意と動作テスト
今回の環境は、CentOS7のインストーラで選択できる開発パッケージをすべて選んで構築しました。
次にnwdiag周りの環境整備ですが、以下の様に nwdiag とその周辺のパッケージをインストールしました。。
1 2 3 4 5 6 |
[root@localhost ]# yum install libjpeg-devel freetype-devel python-lcms lcms-devel tkinter tcl-devel tk-devel [root@localhost ]# yum install python-devel gcc [root@localhost ]# yum install ipa-gothic-fonts ipa-mincho-fonts ipa-pgothic-fonts ipa-pmincho-fonts [root@localhost ]# easy_install nwdiag [root@localhost ]# easy_install reportlab [root@localhost ]# easy_install blockdiagcontrib-cisco |
そしてサンプル定義として次のようなもので動作テストを実施しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
nwdiag { shape_namespace = "cisco"; Internet [shape = cloud] FireWall [shape = firewall] Internet -- FireWall; network dmz { address = "aaa.bbb.ccc.0/24" FireWall; web01 [address = "aaa.bbb.ccc.1",shape=www_server]; web02 [address = "aaa.bbb.ccc.2",shape=www_server]; } network internal { address = "ddd.eee.fff.0/24"; web01 [address = "ddd.eee.fff.1"]; web02 [address = "ddd.eee.fff.2"]; db01(アクティブ); db02(スタンバイ); } } |
サンプル定義をnwdiagコマンドに通すとサンプル画像のような図を生成することができます。使えるアイコン画像(blockdiagcontrib-ciscoの内容はこちら)は配布元などでご確認下さい。
サンプル定義を見ると、サーバ名、IPアドレスとネットワークセグメントの情報だけそろえば、最低限の図を自動で作成できるのではと考えたのが、今回の取り組みのきっかけです。
最初の一歩の取り組みについて
本音を言えば、管理サーバへ各サーバから定期的に最新の設定情報が集約されてきて、集約された情報を自動で組み立てることにより図ができれば助かるのですが、最初の一歩の取り組みでは、欲を出さず基本運用を思い返してみることにしました。最初に戦う相手として定めたのはスプレッドシート方式のデータです。先程のサンプル定義の内容を書き起こすと次の表のようになります。
この表をDBで管理できればデータは容易に扱え、示した表もWebアプリケーション上で表現することも、ここからnwdiagのデータファイル書き起こしも自動でできるのではないかと考えています。
例えば、DBのテーブル構成はシンプルに次のようにできるのではないかと考えました。構成は誰でも思いつくようなものです。シンプルにしておくことで、今回の取り組みが終わりDBだけ残っても、再利用性は残しておける上、自動化の内容を拡張しても対応できるというものです。簡素なアドレス表程度のものなら書き戻すのも楽なものです。
ということで、DBにデータを入れた後、抽出と、画像作成を行うだけのシェルスクリプトを書きます。スクリプトの内容が非常に雑ですが、今回は可能性さえ見つけられればよいので、このスクリプトで動作確認を実施します。
※今回の動作確認では、上記アドレス表の日本語部分を省く形で、DBへデータを事前投入しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#!/bin/bash echo "select * from network_group" > base.sql mysql -u${DBUSER} -p${DBPASSWORD} -Dnwdiag < base.sql > group_id.txt grep -v group_id group_id.txt > group_id_tmp.txt echo "nwdiag{" > file.diag while read line do NETWORK_NUM=`echo ${line}|awk '{print $1}'` NETWORK_GROUP=`echo ${line}|awk '{print $2}'` NETWORK_BLOCK=`echo ${line}|awk '{print $3}'` echo "network ${NETWORK_GROUP}{" >> file.diag echo "address=\"${NETWORK_BLOCK}\"" >> file.diag echo "select * from host_info where network_group_id='${NETWORK_NUM}'" > data_tmp.sql mysql -u${DBUSER} -p${DBPASSWORD} -Dnwdiag < data_tmp.sql > data_tmp.txt grep -v regid data_tmp.txt > base_data.txt while read host do echo ${host} HOSTNAME=`echo $host|awk '{print $3}'` ADDR=`echo $host|awk '{print $4}'` if test "${ADDR}" != "NULL" then echo "${HOSTNAME} [ address=\"${ADDR}\"];" >> file.diag else echo "${HOSTNAME}" >> file.diag fi done < base_data.txt echo "}" >> file.diag done < group_id_tmp.txt rm group_id.txt group_id_tmp.txt data_tmp.sql data_tmp.txt base_data.txt base.sql echo "}" >> file.diag nwdiag file.diag |
実行した結果、下図のような想定通りのネットワーク図が出来上がりました。
これでDBに情報を登録し、スクリプトをcronなどでまわせば、とりあえず欲しいネットワーク図はできる状態になりました。
一歩を踏み出せば
今回はさわりしか着手できていないのですが、発展形として、DBへのデータ自動登録、更新検知時のネットワーク図自動更新、その他管理ツールを含めた統合開発など、やればやるほど運用は楽になるのかもしれません。さらに、運用性・機能性ともに、より良くするためには、運用・開発両面での知識と経験が必要だと感じたので、精進していきたいと思います。日々の運用を愚直に行うだけでなく、それを改善し、効率的に行うための検討材料の1つとして知見を得られたという意味では「種を探す」という最初の狙いには到達できたのではないかと思います。