13
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Graphvizでサーバー構成図を作成

Last updated at Posted at 2015-04-13

概要

DOT言語で記述したコードからグラフを生成できます。
グラフではなくコードを編集して生成する形をとることにより、
修正作業が容易になったり、差分が明確になったりといった恩恵を受けることができます。

以下、Macでの導入を記述していきます。

導入

Homebrew 経由で入ります。

brew install graphviz

HelloWorld

dotファイルを作成します。

hello.dot
digraph "hello world" {
  Hoge -> Huga;
}

graphviz の導入により、 dot コマンドが使用できるようになります。
このコマンドにより、作成したdotファイルから画像を生成します。

以下の例では png を指定しています。
サポートするフォーマットの一覧はドキュメントから確認できます。

dot -T png hello.dot -o hello.png 

生成された画像を確認します。

open hello.png

hello.png

逆引き

形状の変更

shape を指定することで変更可能です。
形状の一覧はドキュメントから確認できます。

hello.dot
digraph "hello world" {
  node [shape = box];

  Hoge -> Huga;
  Foo -> Huga;
  Bar -> Huga;

  Bar [shape = box3d];
}

hello.png

矢印の変更

arrowheadarrowtail を指定することで変更可能です。
形状の一覧はドキュメントから確認できます。

hello.dot
digraph "hello world" {
  Hoge -> Huga;
  Foo -> Huga [arrowhead = vee];
  Bar01 -> Huga [dir = both];
  Bar02 -> Huga [dir = both, arrowhead = crow, arrowtail = dot];
}

hello.png

色の変更

colorfontcolor を指定することで変更可能です。
色の一覧はドキュメントから確認できます。

hello.dot
digraph "hello world" {
  Hoge -> Huga;
  Foo -> Huga;
  Bar -> Huga [color = red];

  Foo [color = green];
  Huga [style = filled, color = blue, fontcolor = white];
}

hello.png

グループ分け

subgraph を指定することでグループ分けが可能です。
prefix として cluster を付与する必要があります。

digraph "hello world" {
  {Hoge, Foo, Bar} -> Huga;
  Huga -> {Piyo01, Piyo02, Piyo03};

  subgraph cluster01 {
    {Hoge, Foo, Bar};

    style = filled;
    label = "hogehoge";
  }

  subgraph cluster02 {
    Huga;

    label = "hugahuga";
  }

  subgraph cluster_piyo {
    {Piyo01, Piyo02, Piyo03};
  }
}

hello.png

横方向に展開

rank_dirLR を指定することで横方向に構造が進む形になります。

digraph "hello world" {
  rank_dir = LR;

  {Hoge, Foo, Bar} -> Huga;
  Huga -> {Piyo01, Piyo02, Piyo03};

  subgraph cluster01 {
    {Hoge, Foo, Bar};

    style = filled;
    label = "hogehoge";
  }

  subgraph cluster02 {
    Huga;

    label = "hugahuga";
  }

  subgraph cluster_piyo {
    {Piyo01, Piyo02, Piyo03};
  }
}

hello.png

グループに対して矢印

compound = truelheadltail を指定します。

digraph "hello world" {
  compound = true;

  {Hoge, Foo, Bar} -> Huga [lhead = cluster02];
  Huga -> {Piyo01, Piyo02, Piyo03} [lhead = cluster_piyo, ltail = cluster02];

  subgraph cluster01 {
    {Hoge, Foo, Bar};

    style = filled;
    label = "hogehoge";
  }

  subgraph cluster02 {
    Huga;

    label = "hugahuga";
  }

  subgraph cluster_piyo {
    {Piyo01, Piyo02, Piyo03};
  }
}

hello.png

作成例

サーバー構成図のサンプルを作ってみました。

sample.dot
digraph "server" {
  compound = true;

  Internet -> FrontLoadBalancer;
  FrontLoadBalancer -> Front01 [lhead = cluster_front];
  Front01 -> DB_Master [lhead = cluster_db_master, ltail = cluster_front];
  Front01 -> DBLoadBalancer [lhead = cluster_db_slave, ltail = cluster_front];
  DBLoadBalancer -> {DB_Slave01, DB_Slave02, DB_Slave03};

  subgraph "cluster_front" {
    label = "Front Servers";

    {Front01, Front02, Front03};
  }

  subgraph "cluster_db" {
    subgraph "cluster_db_master" {
      label = "DB Master";

      DB_Master;
    }

    subgraph "cluster_db_slave" {
      label = "DB Slave";

      DBLoadBalancer;
      {DB_Slave01, DB_Slave02, DB_Slave03};
    }
  }
}

sample.png

他にも、オフィシャルサイトにGalleryがあり、
グラフとコードのサンプルが載っていますので、
作りたい図に近いものを探して参考にすると作成しやすくなります。

参考

13
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?