graphvizでシステム構成図を作ってみる。
インフラエンジニアをやっていて、これまでパワーポイントやエクセルで構成図を
作っていたが、一度作成した図を変更するたびに、
位置関係の微調整を行うのにめんどくささを感じていた。
なんとか簡単に、使えるものができないかと検討した。
そこで検討したのがgraphviz
- install graphviz
インストールは簡単。
wget http://www.graphviz.org/graphviz-rhel.repo
mv graphviz-rhel.repo /etc/yum.repos.d/
yum install 'graphviz*' -y
- create graph
グラフの作成も簡単
confを用意し、以下のコマンド実行でファイルが生成される。
$ dot -Tjpeg -o sample.jpeg sample.dot
- sample
以下が非常にシンプルな例。
confもシンプル。
digraph G {
label="sysmtem component"
user;
web;
app;
mysql;
user -> web;
web -> app;
app -> mysql;
}
これだけ。
これに色々な要素を加えてみる・・・・。
digraph G {
label="sysmtem component"
user;
administrator;
web;
app;
mail;
mysql;
zabbix;
gw;
user -> web;
administrator -> zabbix;
administrator -> gw;
web -> app;
app -> mail;
app -> mysql;
zabbix -> mail;
postfix -> user;
postfix -> administrator;
}
どうなるか・・・・・
見れなくはないが、ちょっときつい。
このドキュメントが使われることはないだろう。
ここからが色々と工夫したもの。
大きなポイントとしては以下の2点
・サーバーごとにサブグラフを使う
・ラベルを上手に使う
・色を使い分ける
それを意識して書いたconf
非常に長く、複雑そうに見えるが、大きく2つに分かれる。
・上のnode部分がサーバーとその中にあるプロセス
・下のdependency部分がサーバー間のプロセスの依存関係
digraph G {
label="sysmtem component"
graph [ fontsize=8,fontname="MS Gothic" ];
node [ fontsize=8,fontname="MS Gothic",fontcoler=blue ];
edge [ fontsize=8,color="blue",fontcolor="blue",labefloat=flase ];
graph [ compound=true,overlap=prism ];
node [ shape=ellipse ];
// external node
user [ shape=egg, fillcolor=yellow, style="rounded,filled" ];
administrator [ shape=egg, fillcolor=yellow, style="rounded,filled" ];
// internal node
subgraph cluster_web {
fontcolor=red;
label="web";
web_httpd [ label="httpd" ];
web_php [ label="php" ];
}
subgraph cluster_app {
fontcolor=red;
label="app";
app_app [ label="app" ];
}
subgraph cluster_mail {
fontcolor=red;
label="mail";
mail_postfix [ label="postfix" ];
}
subgraph cluster_db {
fontcolor=red;
label="db";
db_mysql [ label="mysql"];
}
subgraph cluster_monitor {
fontcolor=red;
label="monitor";
monitor_httpd [ label="httpd"];
monitor_zabbix [ label="zabbix"];
monitor_mysql [ label="mysql" ];
}
subgraph cluster_gw{
fontcolor=red;
label="gw";
gw_sshd [ label="sshd" ];
}
// dependency
user -> web_httpd [ label="https" ];
user -> monitor_httpd [ label="https" ];
administrator -> gw_sshd [ label="ssh" ];
web_php -> app_app [ label="socket" ];
app_app -> mail_postfix [ label="smtp" ];
app_app -> db_mysql [ label="mysql" ];
monitor_zabbix -> mail_postfix [ label="smtp" ];
mail_postfix -> user [ label="mail" ];
mail_postfix -> administrator [ label="mail" ];
}
これでできる図がこちら。
なかなか使えそうです。
何かサーバで障害があったときの影響、アプリ改修時の関連ノードなど。
コードで管理できるので、微妙な位置関係は基本的に不要。
過去に文字が重なって見にくく、パワポやエクセルの位置を調整するのに費やしていた時間は不要。
ただ、色々とまだまだ制約や入れなかった要素がある。
・図は2重まで、3重以上は難しい(例えば、ここに物理の要素をいれるなど)
・位置関係は自動で変わるため、confを変更するたびに各サーバの位置が変わる。
したがって、過去との比較という意味では見にくい。
・サーバー内のプロセス間通信はいれなかった。
これを入れると、見れたものじゃなくなる。サイズを調整すればいけなくもないが、今後の変更に耐えられない可能性があるので、サーバ内の通信については別ファイルで用意することにした。
- sample script
作成スクリプトを用意
$ git init
$ git clone https://gist.github.com/shinya-tada/d99f0b3d9da56461f6d9
$ chmod +x grapviz.sh
confを準備
$ vi sample.dot
実行
$ ./grapviz.sh sample.dot
created sample.dot_20140901-1114.jpeg