OSSを使用したNWリソース管理高度化への
取り組み

【技業LOG】技術者が紹介するNTTPCのテクノロジー

2021.05.18
その他
水口 直哉

ネットワークエンジニア
水口 直哉

技業LOG

はじめに

NWリソース管理の高度化に向けて

NTTPCのネットワークサービスのInfoSphere®、Master's ONE®の運用にあたり、ルーターやスイッチなどの機器やIPアドレス / VLANをはじめとした、数多くの物理/論理リソースを管理しております。
このようなネットワークを構成する様々なリソース(以下NWリソース)の管理のため、NTTPCでは先日、オープンソースソフトウェアのNetbox(https://github.com/netbox-community/netbox)を試験的に導入しました。

本記事では、NWリソースの一つであるIPアドレスの管理を例に取り、Netboxの動作の紹介と、弊社でのNWリソース管理の効率化・高度化への取り組みについて紹介いたします。

次が目次となります。

Netboxとは?

Netboxはネットワークの管理を支援するシステムであり、OSSで開発されています。
Netboxでは、IPアドレス管理(IPAM)、データセンタインフラストラクチャ管理(DCIM)の機能を持っており、以下のNWリソースの管理が可能です。

  • IPアドレス(IPv4/IPv6)、VRF、VLAN
  • ラック
  • 機器(ルーター、スイッチ等)
  • ケーブル、ケーブル接続
  • 電源
  • 仮想マシンとクラスター
  • パスワード、秘密鍵などの暗号情報

動作例:環境説明

公式のgithubを参考に、Dockerで環境構築します。

次のコマンドでDockerを立ち上げます。ポートの設定は各自の環境に合わせてください。

> git clone -b 1.0.2 https://github.com/netbox-community/netbox-docker.git
> cd netbox-docker
> export VERSION=v2.10.5
> tee docker-compose.override.yml <<EOF version: '3.4' services: netbox: ports: - 8000:8080 EOF
> docker-compose pull > docker-compose up

環境作成に成功した後にブラウザでアクセスすると、次のようなGUIが見られます。
上記のコマンドで構築した場合のURLはhttp://localhost:8000、デフォルトのユーザー名 / PWはadmin / adminです。

GUIキャプチャ

画面上にはOrganization、DCIM、Power、IPAM、Circuits、etc...とさまざまな要素が表示されておりますが、これら全てをNetbox上で一元的に管理することができます。
このうちIPAMのPrefix / IP Addressの使い方を次章より紹介いたします。

動作例:Prefix / IP Address登録

Netboxでは、CIDRで表されるネットワークアドレスを「Prefix」、機器に設定するホストアドレスを「IP Address」として管理することができます。

実際にアドレスを一部登録してみましょう。
NetboxはGUIによる登録とCSVによる一括登録が可能です。
今回はCSVによる一括登録で、次のPrefix / IP Addressを登録してみます。

・Prefix
10.0.0.0/24
10.0.0.0/25
10.0.0.128/25
・IPAddress
10.0.0.1
10.0.0.2
10.0.0.129

まず、Prefixの登録をします。GUIの上部のバーより、IPAM > Prefixes > Importをクリックしてください。
表示されたボックスの中に、次のCSVをコピー&ペーストします。その後Submitをクリックしてください。

prefix,status
10.0.0.0/24, container
10.0.0.0/25, active
10.0.0.128/25, active

また、IPアドレスの登録は、GUIの上部のバーより、IPAM > Prefixes > Importを
クリックしてください。
表示されたボックスの中に、次のCSVをコピー&ペーストします。その後Submitをクリックしてください。

address
10.0.0.1/25
10.0.0.2/25
10.0.0.129/25

アドレスを取り込みに成功すると、次のように一覧で表示されます。

Prefix

「Prefix」キャプチャ

IP Address

「IP Address」キャプチャ

また、PrefixとIP Addressの関係を自動で判別し、Prefixに含まれるIPAddressを一覧で表示させることができます。

「Prefixに含まれるIPAddress一覧」キャプチャ

動作例:スクリプトによるアドレスの自動払い出し

Netboxを使用することでビジュアルにアドレス管理を行うことができそうです。
一方で、個々のアドレスの割り当て/払い出しをGUIで行うのは数が多いと大変な作業です。
そこで、NetboxのCustom Scriptsという機能を利用し、スクリプトを組んでこの作業を自動化してみます。

netbox-docer / scripts以下に「assign_demo.py」というファイルを作成し、以下のスクリプトを転記します。
以下のスクリプトは、10.0.0.0/25のPrefixから、空いているアドレスを一つ検索して払い出すスクリプトです。

from extras.scripts import *
from ipam.models import Prefix, IPAddress
import netaddr
class Assign_Address(Script):
class Meta: name = "Assign Addresses" description = "10.0.0.0/25から空いているアドレスを順に割り当てる"

def run(self, data, commit): self.log_info("アドレスの自動払い出しをスタートします")
# 使用するアドレス帯を指定 my_prefix = Prefix( prefix=netaddr.IPNetwork("10.0.0.0/25") )
# 利用可能なIPアドレスを検索する assigned_ip = my_prefix.get_first_available_ip()
# 検索したアドレスを払い出す my_ip = IPAddress( address = assigned_ip, description = "auto assigned" ) my_ip.save()
self.log_debug("払い出したIPアドレス: " + str(assigned_ip)) self.log_success("自動払い出しが終了しました!")
output = {"assigned_ip": assigned_ip} return output

ファイルを保存後、GUIの上記のタブのOthers > Scriptsより、配置したスクリプトが確認できます。

「Scripts」キャプチャ

このスクリプトを実行してみます。
Assign Addressesをクリックし、Commit Changeにチェックが入っていることを確認してから、Run Scriptをクリックします。

「Assign Addresses」キャプチャ

以上のような実行結果が表示されれば払い出し完了です。
今回は10.0.0.3/25が払い出されました。
GUIからIP Addressを確認すると、正しく払い出されていることが確認できます。

「IP Addresses」キャプチャ

動作例:APIによるアドレスの自動払い出し

NetboxはAPIによる実行にも対応しており、監視システムや自動設定システム等と連携し、アドレスの使用状況の調査やアドレス払い出しの自動化を行うことができます。

次に、実際にAPIによるアドレスの払い出しを行ってみます。
アドレスを直接API経由で払い出すことも可能ですが、本記事では前章で作成したスクリプトをAPI経由で実行することでアドレスの払い出しを行います。

API KeyはGUIの右上のユーザー名が表示されているところをクリックし、Profile > API Tokensから確認できます。

まず、現在のアドレスの払い出し状況を確認します。
以下のAPIでは、Netboxに登録されているIPアドレス全ての情報を取得します。

> export Token={API Token}
Netboxに登録されているIPアドレス一覧を取得する > curl -H "Authorization: Token $Token" -s http://{netbox_url}/api/ipam/ip-addresses/
出力からIPアドレスの部分のみを抽出する > curl -H "Authorization: Token $Token" -s http://{netbox_url}/api/ipam/ip-addresses/ | jq ".results[].address"
(出力) "10.0.0.1/25" "10.0.0.2/25" "10.0.0.3/25" "10.0.0.129/25"

{API Token}はAPI Tokeyで確認した文字列を、{netbox_url}はnetboxを動かしているURL(本記事の通り作成したならlocalhost:8000)と読み替えてください。

NetboxのAPIを介して、初期登録した"10.0.0.1/25","10.0.0.2/25","10.0.0.129/25"と、前章で払い出したアドレス"10.0.0.3/25"がNetboxに登録されていることが分かります。

続いて、自動払い出しスクリプトを、APIを介して実行します。

スクリプトを実行する
> curl -H "Authorization: Token $Token" -H "Content-Type: application/json" -s http:// {netbox_url}/api/extras/scripts/assign_demo.Assign_Address/ --data '{"data":{}, "commit": true}' | jq ".result | {id: .id, url: .url}"
(出力) { "id": {id}, "url": http://{netbox_url}/api/extras/job-results/{id}/ ← こちらのURLに結果が格納される }
スクリプトの実行結果を確認する > curl -H "Authorization: Token $Token" http://{netbox_url}/api/extras/job-results/{id}/ | jq ".data.output"
(出力) "{'assigned_ip': '10.0.0.4/25'}" ← 払い出されたIPアドレス
現在Netboxで格納されているアドレスを確認する > curl -H "Authorization: Token $Token" -s http:// {netbox_url}/api/ipam/ip-addresses/ | jq ".results[].address"
(出力) "10.0.0.1/25" "10.0.0.2/25" "10.0.0.3/25" "10.0.0.4/25" ← 追加されている "10.0.0.129/25"

NetboxのAPIを介してスクリプトが実行され、新たに"10.0.0.4/25"が払い出されました。
GUIからも10.0.0.4/25が新たに払い出されていることが確認できます。

「IP Addresses」キャプチャ

NTTPCのNWリソース管理高度化への取り組み

NTTPCでは、Netboxが上記で紹介したようにUIや操作性が良く、またスクリプトの実行やAPIなど自動化のための機能も充実している点に着目し、Master's ONE®やInfoSphere®のNWリソースの管理に使用できないか検討しておりました。
IPアドレス管理については、上記で紹介した機能の他に、アドレスにラベリングやグルーピングを行うことや他のNWリソースと紐づけて管理することも可能であり、社内で行なったPoCの結果、Netboxでアドレス管理ができそうだと分かりました。
そこで現在では、Master's ONE®やInfoSphere®のアドレスの管理の一部をNetboxで行うよう、試験的に導入を進めております。

また、装置やラック、VLANやVRF等の管理もNetboxで一元的に管理できないか検討を進めております。

今後もNetboxを始めとして、NWリソースの管理の集約やシステム化を進めてネットワーク運用のDX化を推進し、ネットワーク開通の迅速化や故障の早期検知/対処など、皆様がより気持ちよく使用できるサービスを提供できるよう取り組んでまいります。

終わりに

本記事ではオープンソースソフトウェアのNetboxによるNWリソースの管理方法とその動作例、またNTTPCでのリソース管理への取り組みについて紹介いたしました。
NWリソースの管理は皆様にとって共通の課題かと思いますが、リソース管理の方法の一例として本記事が皆様の助けになれば幸いです。

技業LOG

この記事で紹介しているサービスは
こちら

Infosphere®

障害に強い安定稼働の法人向けインターネットサービス

Master'sONE®ネットワーク

設計 / 構築~保守 / 運用まで一元サポート。クラウド接続から社内ネットワークまで柔軟に"つながる"、
拡張性と可用性に優れたネットワークサービス

おすすめ記事

    お気軽にご相談ください

    • 「Infosphere」「Master'sONE」は、NTTPCコミュニケーションズの登録商標です。