LoginSignup
14
14

More than 5 years have passed since last update.

nwdiag × Ansible plugin × Jupyter でNWトポ図の生成

Last updated at Posted at 2018-04-19

はじめに

前回の記事にて、
最新のJupyter notebook上でPythonのNWトポロジー図描画ライブラリであるnwdiagを動作させる記事を書きました。https://qiita.com/t-tkgh/items/16ee383f8aa11d2fcfe9
その時にAnsibleのfilter pluginでnwdiagのテンプレート形式に出力できる様になると、
より便利になるなと思い立ちまして、今回AnsibleのPluginを独自に作ってJupyter Notebook上で動作させるデモを作りました。(現状はIPv4のみ対応です…)
思ったよりもシンプルに出来たので、今回の記事にします。

使い方

動作環境
Ansible 2.5.0
Python 3.6

1. nwdiagのAnsible Filter Pluginを配置する

・git cloneする
独自に作成したnwdiagのansible filter pluginsをgit cloneします

shell
git clone https://github.com/t-tkgh/nwdiag_filter.git

・ansible.cfgの変更
(/etc/ansible/ansible.cfg or 実行ディレクトリ/ansible.cfgでも可能)

ansible.cfg
filter_plugins = <git cloneしたディレクトリパス>/nwdiag_filter

の項目を追記する。

2. NWトポロジー図の情報を定義する

・nwdiag_filterのNWトポロジー情報の定義規則

  • data[node]:
    この配下にNW機器の各インターフェイス情報を格納する
    以下、各インターフェイスの情報の項目となる。

    • name : NW機器名を定義する
    • ifname : NW機器の対象のインターフェイスの名称を定義する
    • address : NW機器の対象のインターフェイスのIPv4アドレスを定義する
    • vrf : 対象のインターフェイスが所属するvrf名を定義する(任意)
    • vlan : 対象のインターフェイスのvlan idを定義する(任意)
  • data[network]:
    この配下にネットワークアドレスの名称とサブネットを定義した情報を格納する

    • name : ネットワークアドレスの名称を定義する(任意)
    • address : ネットワークアドレスを定義する※マスク値は二桁で(任意)
  • data[defaultmask] :二桁のマスク値
    ここでは自動生成するネットワークアドレスのマスク値を定義する。(二桁で)
    data[network]で定義されてないが、data[node]のaddressに存在するネットワークアドレスを
    data[node]のaddressとここで定義されるマスク値から自動生成する

定義例
今回はyamlファイル形式のextra-varsでNWトポロジー図の作図情報を定義する。

extar-vars.yml
data:
  node:
  - ifname: ge-0/0/0
    vlan: 1000
    name: router01
    address: 192.168.0.1
    vrf: vrf01
  - ifname: ge-0/0/1
    vlan: 2000
    name: router01
    address: 192.168.1.10
    vrf: vrf01
  - ifname: ge-0/0/1
    vlan: '1000'
    name: router02
    address: 192.168.0.2
    vrf: vrf02
  - ifname: ge-0/0/1
    vlan: '2000'
    name: router02
    address: 192.168.2.2
    vrf: vrf02
  - ifname: "gigabitethernet 0/1"
    name: cpe01
    address: 192.168.1.11
  - ifname: "gigabitethernet 0/1"
    name: cpe02
    address: 192.168.2.1
  network: 
  - name: test
    address: "192.168.0.0/24"
  defaultmask: 29

この例で作図されるトポロジー図は以下となる。

スクリーンショット 2018-04-20 3.04.52.png

test以外のネットワークアドレスがdefaultmaskで指定された値の/29で自動生成されています。

3. Playbookを作成する

・extra-vars.ymlのデータをnwdiag_filterで変換する

demo.yml
- hosts: all
  gather_facts: no
  connection: local
  tasks:
  - debug:
      msg: "{{ data | nwdiag_filter }}"

connectionはlocalを指定、dataはextra-varsにて定義された情報がansible.cfgで参照されるnwdiag_filterにてnwdiag形式の情報に変換されて出力される。

デモ

デモを実行したJupyter Notebookにて、デモ内容を記載。
https://github.com/t-tkgh/nwdiag_filter/blob/master/Demo.ipynb

デモを行う前の前提

・Jupyter Notebookでnwdiagを実行する環境は前回記事を参考に構築。
https://qiita.com/t-tkgh/items/16ee383f8aa11d2fcfe9

・Jupyter Notebookのコンテナ内でansibleをインストールしてあること。

shell
pip install ansible

デモのポイント

  1. In [3]でansible.cfgでansible-playbookの出力結果をjson形式にしている。
  2. In [7]でansible-playbookをshellとして実行して、その結果を格納。
  3. In [8]でget_ipython().run_cell_magicを使うことで、nwdiagモジュールへ ansible-playbookで生成したnwdiagのテンプレート情報をInputさせている。
14
14
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
14
14