てくなべ (tekunabe)

ansible / network / automation / StackStorm

[Batfish] ネットワーク名とスナップショット名の関係



これは Batfish Advent Calendar 2018 の2日目の記事です。



■ はじめに

ネットワークコンフィグ解析ツール Batfish は、ネットワーク機器のコンフィグファイルなどを読み込んで、 ACL や経路などの妥当性をチェックできます。

読み込みの際に、ネットワーク名とスナップショット名という単位が利用されます。1つのネットワークに対して、複数のスナップショットを作成できるという関係です。

f:id:akira6592:20181124150050p:plain

一つのネットワーク、一つのスナップショットだけを解析する場合は、あまり意識しなくても良いかもしれませんが、2つのスナップショット間の差分を検出したい等の場合は意識する必要があります。(例:ACLを変更する前後のスナップショットで差分を検出するsearchFilters

この記事では、ネットワーク名のスナップショット名の関係についてもう少し詳しくご紹介します。

なお、Batfish の概要については以下の記事を参照してください。 https://tekunabe.hatenablog.jp/entry/2018/10/25/batfish

※ docker イメージ batfish/allinone のイメージID 1aa82919f0ae を利用して動作確認しています。


■ 「ネットワーク」は論理的なグループ名

ネットワークとは、ルーターやリンク情報をまとめた論理的なグループです。

Batfish の Python クライアントである pybatfish では、bf_set_network にネットワーク名(任意)を指定します。


■ 「スナップショット」は一次的な状態の保存

スナップショットとは、以下の情報を読み込んで、一次的な状態として保存したものです。

pybatfish では、bf_init_snapshotに、上記の3情報をとまとめたディレクトリ(または ZIP ファイル)、スナップショット名(任意)を指定します。


■ 「ネットワーク」と「スナップショット」の関係をディレクトリ構造から探る

前述したように「ネットワーク」と「スナップショット」は、1つのネットワークに対して、複数のスナップショットを作成できるという関係です。

この関係は、pybatfish で、bf_set_network や、bf_init_snapshotを実行した時に Batfish 本体のコンテナ側に作成されるディレクトリやファイルから、詳細を探ることができます。

なお、コンテナ側に作成される各ディレクトリは、以下のようにホストにマウントしておくと、永続的に扱うことができます。

 docker run -it --privileged -v $(pwd)/data:/data -p 8888:8888 batfish/allinone

ネットワーク単位のディレクト

bf_set_network を実行すると、コンテナ側の /data/containers ディレクトリ配下に、ネットワーク単位のディレクトリが作成されます。 このネットワーク単位のディレクトリ名(ネットワークID)は、/data/containers/network_ids ディレクトリ配下の、 <ネットワーク名>.id というファイル名のテキストファイルの中に記載されています。

たとえば、ネットワーク名が example_network であれば、以下のようになります。

  • /data/containers/network_ids/example_network.id ファイル内に、ネットワークIDが記載される
  • /data/containers/<ネットワークID> ディレクトリがネットワーク単位のディレクト

スナップショット単位のディレクト

スナップショット単位のディレクトリは、ネットワーク単位のディレクトリの下に作成されます。

このスナップショット単位のディレクトリ名(スナップショットID)は、/data/containers/<ネットットワークID>/snapshot_ids ディレクトリ配下の、<スナップショット名>.id というファイル名のテキストファイルの中に記載されています。

たとえば、スナップショット名が example_spapshot1 であれば、以下のようになります。

  • /data/containers/<ネットワークID>/snapshot_ids/example_spapshot1.id ファイル内に、スナップショットIDが記載される
  • /data/containers/<ネットワークID>/snapshots/<スナップショットID> ディレクトリがスナップショット単位のディレクト

それぞれの関係まとめ

ネットワーク単位、スナップショット単位のディレクトリの関係をまとめると、以下のようになります。

f:id:akira6592:20181124150714p:plain

※以下の条件でスナップショットをとった例です。

  • ネットワーク名: example_network
  • スナップショット名: example_snapshot1、example_snapshot2


■ 名前を省略すると自動で名前がつけられる

リファレンスを見ると分かるように、bf_set_network のパラメーター name や、bf_init_snapshot のパラメーター name は必須ではありません。つまり、ネットワーク名やスナップショット名の指定は任意です。

たとえば、ネットワーク名の指定を省略して bf_set_network() のように実行すると、実行するたびに pcp5d5578e1-8289-4089-95ae-3ead1de3581epcp358f3dd4-e5db-452a-84f7-7d60ce62ad68 のようなネットワーク名が自動で付けられ、ネットワーク単位のディレクトリが作成されます。

スナップショット名も、省略して bf_init_snapshot("networks/example") のように実行すると、実行するたびに ss_d30ce36c-7829-4884-a7a3-575ccf0db272ss_22f03c3f-0cf3-41ff-90ef-8504baa445a4 のようなスナップショット名が自動で付けられ、スナップショット単位のディレクトリが作成されます。


■ まとめ

ネットワーク名とスナップショット名の関係を、ディレクトリ視点で確認してみました。 ディレクトリの構造を知っておくと、デバッグに役に立つかもしれませんので、何かのときに思い出していただければと思います。


参考

入門的なチュートリアル Notebook https://github.com/batfish/pybatfish/blob/master/jupyter_notebooks/Getting%20started%20with%20Batfish.ipynb