Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

概要

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があり、
グラフとコードのサンプルが載っていますので、
作りたい図に近いものを探して参考にすると作成しやすくなります。

参考

iri
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした