てくなべ (tekunabe)

ansible / network / automation / StackStorm

[Batfish] 単体の Docker イメージと pybatfish の環境構築方法

■ Batfish 公式の 2つの Docker イメージ

Batfish には公式 Docker イメージが2つあります。

  • イメージ1: batfish/batfish
    • batfish 本体の イメージ
  • イメージ2: batfish/allinone
    • batfish 本体と かんたんにお試しできる Jupyter Notebook とサンプルコンフィグ入りイメージ

以前の Batfish 概要をお伝えした記事では、簡単に試すの目的だったため、batfish/allinone を利用しましたが、イメージサイズが少々大きめです。 Batfish 本体だけで良ければ、イメージサイズが小さめの batfish/batfish のほうが適しています。

この記事では、以下の点についてまとめます。

  • Docker イメージ batfish/batfish を利用したコンテナの起動
  • ホスト側に pybatfish をインストールして、コンテナ内の batfish にアクセスする

概要図

f:id:akira6592:20181026185106p:plain


■ コンテナの起動

手順は docker/batfish.md at master · batfish/docker Batfish service docker container に記載されています。

mkdir -p data
docker run -v $(pwd)/data:/data -p 9997:9997 -p 9996:9996 batfish/batfish

コンテナから見た /data には、機器構成情報をまとめたスナップショットなどのデータが保存されます。 これらのデータを、ホスト側のデータとして永続的に保持するために、-v オプションでマウントを指定しています。 権限の都合上 --privileged が必要な場合もあります。


■ ホストへの pybatfish のインストール

主な手順は batfish/pybatfish: Python client for Batfish に記載されています。

# pybatfish リポジトリの clone
git clone https://github.com/batfish/pybatfish.git
cd pybatfish

# pybatfish のインストール
pip install .

現状は直接 pip install pybatfish でインストールできませんが、いずれできるようになるかもしれません。


■ 動作確認

手順は pybatfish のドキュメントの Getting started に記載されているコードを参考にします。

あらかじめ python インタープリタを起動しておきます。

各種 import

from pybatfish.client.commands import *
from pybatfish.question.question import load_questions, list_questions
from pybatfish.question import bfq

エスチョンのロード

load_questions()

スナップショットの初期化

bf_init_snapshot('jupyter_notebooks/networks/example') 

jupyter_notebooks/networks/example は、pybatfish リポジトリを clone した中に含まれる、サンプルのネットワーク機器のコンフィグなどが含まれています。 単なる動作確認目的のため、こちらを利用しています。

ログ

status: TRYINGTOASSIGN
.... no task information
status: ASSIGNED
.... Fri Oct 26 08:51:18 2018 UTC Parse configurations 0 / 13
status: ASSIGNED
.... Fri Oct 26 08:51:18 2018 UTC Parse configurations 0 / 13
status: ASSIGNED
.... Fri Oct 26 08:51:18 2018 UTC Parse configurations 0 / 13
status: ASSIGNED
.... Fri Oct 26 08:51:18 2018 UTC Parse configurations 0 / 13
status: ASSIGNED
.... Fri Oct 26 08:51:18 2018 UTC Parse configurations 2 / 13
status: ASSIGNED
.... Fri Oct 26 08:51:18 2018 UTC Parse configurations 8 / 13 Elapsed 00:00:05
status: ASSIGNED
.... Fri Oct 26 08:51:18 2018 UTC Reading, unpacking, and deserializing files containing 'org.batfish.datamodel.GenericConfigObject' instances 10 / 15
status: TERMINATEDNORMALLY
.... Fri Oct 26 08:51:18 2018 UTC Deserializing objects of type 'org.batfish.datamodel.Configuration' from files 15 / 15
Default snapshot is now set to ss_b10132b4-75db-4544-a2ba-8dc82f1706d2
'ss_b10132b4-75db-4544-a2ba-8dc82f1706d2'

IPアドレスの取得

ip_owners_ans = bfq.ipOwners().answer()

取得したIPアドレスの表示

ip_owners_ans.frame().head()

ログ

         Node      VRF           Interface          IP  Mask  Active
0    as2dist2  default           Loopback0     2.1.3.2    32    True
1    as2dist1  default           Loopback0     2.1.3.1    32    True
2    as2dept1  default  GigabitEthernet1/0  2.34.201.4    24    True
3    as2dept1  default           Loopback0     2.1.1.2    32    True
4  as3border2  default  GigabitEthernet1/0     3.0.2.1    24    True

as1border1 の GigabitEthernet0/0 の情報を取得、表示

iface_ans = bfq.interfaceProperties(nodes='as1border1', interfaces='GigabitEthernet0/0', properties='all-prefixes').answer()
iface_ans

ログ

                       Interface
0  as1border1:GigabitEthernet0/0


■ まとめ

Batfish 単体のコンテナの起動と pybatfish の環境構築方法をご紹介しました。 このあとは、Python でコードを書いたり、Junypter Notebook を準備するなどして、実現したいことを実装していくことになります。

https://www.batfish.org/