More Related Content
Similar to JSNAPyとPyEZで作る次世代ネットワークオペレーションの可能性 (20)
More from Taiji Tsuchiya (9)
JSNAPyとPyEZで作る次世代ネットワークオペレーションの可能性
- 1. © BIGLOBE Inc. 20161
JSNAPyとPyEZで作る
次世代ネットワークオペレーション
の可能性
BIGLOBE Inc.
Taiji Tsuchiya
- 2. © BIGLOBE Inc. 20162
自己紹介
l 土屋 太二(30)
l BIGLOBEバックボーンネットワーク担当
p ASネットワーク(AS2518)の
設計/開発/検証/運用/顧客サポート/営業支援
p ネットワーク運用の自動化システム開発
0% 20% 40% 60% 80% 100%
NW設計/検証
30%
NW運用
40%
サポート
15%
自動化
15%
仕事の割合
- 3. © BIGLOBE Inc. 20163
一般的なネットワーク作業フロー
1. 手順書/コンフィグ 作成
2. 手順書/コンフィグ 査閲/承認(2-3名が査閲)
3. 作業実施
1. ルータログイン
2. ルータ状態確認
3. ルータ設定
4. ルータ状態確認
5. ネットワーク正常性確認
6. コンフィグ保存
4. 作業完了報告
- 4. © BIGLOBE Inc. 20164
ネットワーク作業自動化のための要件
l 全工程において極力、自動化/省力化
できること
p ただしルータ設定投入可否は
作業者の判断に委ねるかは議論の余地あり
l ネットワーク技術者による
事前レビューが可能であること
l 作業時のログを残せること
- 5. © BIGLOBE Inc. 20165
Juniper公式ツールで実現
l PyEZ
p JUNOSルータを設定するPythonライブラリ
Ø ルータへ設定投入および状態取得が可能
Ø JUNOS version11.4以降の利用可能
l JSNAPy
p JUNOSルータの状態管理ツール
Ø 「あるべき状態」を定義し、合否 を判定
Ø スナップショットの取得 / 比較 / チェック を実施
Ø コマンドラインツールとPythonライブラリを保有
https://github.com/Juniper/jsnapy/wiki
https://github.com/Juniper/py-junos-eznc
※JSNAPy最新版v1.0.0は不具合があったので、未リリースのv1.0.1を利用。
pip install git+https://github.com/Juniper/jsnapy.git でダウンロード
※PyEZ最新版v2.0.1を利用。 pip install junos-eznc でダウンロード
- 6. © BIGLOBE Inc. 20166
PyEZ: ルータ設定ライブラリ
l 主な機能
l ルータ設定の投入、読み込み
l load / commit / commit check / diff / rollback / lock
など手動設定とほぼ同じ機能が利用可能
l 本体情報やARP/ルーティングテーブル情報などの取得
l OSインストール/シャットダウン/再起動
Router
PyEZ
Server
NETCONF over SSH
open
load config_file
(overload | merge | replace )
diff / commit check
commit / rollback
- 7. © BIGLOBE Inc. 20167
set_firefly1_change_hostname.py
from jnpr.junos import Device
from jnpr.junos.utils.config import Config
# ルータとのSSH/NETCONFセッションを確立
dev1 = Device( host=’192.168.0.1’, user=’user1’, password=’password1')
dev1.open()
dev1.bind(cu=Config)
dev1.cu.lock() # 他セッションから設定されないようにロックをかける
# ルータ設定ファイルを読み込み (この時点では未コミット)
conf_filename = "./change_hostname.conf”
dev1.cu.load(path=conf_filename, format="text", merge=True)
print dev1.cu.diff() # 設定差分を確認(show | compare 相当)
print dev1.cu.commit_check() # コミットチェックを実施
dev1.cu.commit() # コミットを実施
dev1.cu.unlock() # ロックを解除
dev1.close() # セッションを切断
PyEZ: サンプルコード(PyEZ関連部分を抜粋)
change_hostname.conf
system {
host-name firefly1_changed_by_PyEZ;
}
- 8. © BIGLOBE Inc. 20168
PyEZ: 実行結果
前ページのコードに加えて、
デモ用に進捗状況を表示実装
を追加しています。
- 9. © BIGLOBE Inc. 20169
JSNAPy: ルータ状態管理ツール/ライブラリ
p 主な機能
- スナップショットを取得
jsnapy --snap <スナップショット名> -f <定義ファイル>
- 2つのスナップショットの差分状態を比較してチェック
jsnapy --check <スナップショット名1> <スナップショット名2> -f <定義ファイル>
- 取得した時点のスナップショットが、定義した条件を満たすかチェック
jsnapy --snapcheck <スナップショット名> -f <定義ファイル>
Router2 Router1
Routr2 Router1
JSNAPy
Server
JSNAPy
Server
状態1
状態2
状態1のshow interface結果を保存
jsnapy --snap snap01
状態2のshow interface結果を保存
jsnapy --snap snap02
状態1と状態2の差分をチェック
jsnapy --check snap01 snap02
インタフェースがupになっているかチェック
jsnapy --shnapcheck snap01
- 10. © BIGLOBE Inc. 201610
JSNAPy: 定義ファイルの例
l ホスト名が「router1_changed_by_PyEZ」か否か確認
test_hostname:
- command: show version
- item:
xpath: /software-information
tests:
- is-equal: host-name, router1_changed_by_PyEZ
info: "Test : OK"
err: "Test : NG"
test_hostname.yml
hosts:
- device: 192.168.0.1
username : user1
passwd: password1
tests:
- ./tests/test_hostname.yml
config_router1.yml
- 11. © BIGLOBE Inc. 201611
JSNAPy: コマンドライン実行結果
1 9 2 . 1 6 8 . 0 . 1
1 9 2 . 1 6 8 . 0 . 1
- 12. © BIGLOBE Inc. 201612
PyEZ と JSNAPy を使って
ISPネットワーク設定作業を
自動化してみました。
(ご利用の注意)
現時点で、社内で正式に展開しているツールではありません。
社内で頻繁に発生する実作業を想定したシミュレーションです。
「うちで使ってみたけど障害出たぞ!」と申されましても
責任は一切負いかねますので、予めご承知ください。
- 13. © BIGLOBE Inc. 201613
ISPの設定作業例: Private Peering
l ASを所有する組織同士が同一DC内で
eBGPによる経路交換を実施する作業
l 手順
p 組織間での交渉/構内配線の手配
p ケーブル配線
p インタフェースの設定
p 疎通確認
p eBGP設定の投入
p 経路広報の確認
p トラフィック変移状態の確認
自動化対象
Router1
(AS65001)
Router2
(AS65000)
経路情報
経路情報
- 14. © BIGLOBE Inc. 201614
システム構成
Firefly1Firefly2
PyEZ
ライブラリ
インタフェース設定
eBGP設定
完了済
物理接続 完了済
JSNAPy
ライブラリ
シナリオファイル
シナリオ
実行プログラム
査閲/承認
ネットワーク技術者
(査閲者)
ネットワーク技術者
(作業者)
作成 実行
インタフェース設定 未設定
eBGP設定 未完了
システムとの疎通設定 完了済
• シナリオファイルを作成
• 作業実施/中止を判断
• ルータ設定のコミット可否を判断
• 作業手順を記述
• 対象ルータ情報を記述
• ルータ設定、テストの手順を記述
ルータの設定投入
• インタフェース設定
• eBGP設定
ルータ状態の正常性テスト
• インタフェース状態テスト
• BGP 状態テスト
• 経路送信テスト
• 経路広告テスト
コミット可否は
作業者が判断
• シナリオファイルから情報抽出
• ルータコンフィグの生成
• テストファイルの生成
• ルータ設定投入(PyEZ)を実行
• ルータ状態テスト(JSNAPy)を実行
- 15. © BIGLOBE Inc. 201615
シナリオファイル 記述例
purpus: |
本作業は、abc株式会社(AS65002)が
運用するルータと、拠点Xでプライベート
ピアを構築することを目的としている。
operator: Taiji Tsuchiya
operation_date: 20161115
hosts:
management_ipaddress:192.168.34.16
hostname: firefly1
model: firefly-perimeter
username: user1
password: password1
scenario:
- test_hostname
- test_model
- test_interface:
interface_name: ge-0/0/2
interface_status: down
- set_add_interface:
interface_name: ge-0/0/2
interface_address_ipv4: 192.168.35.1
interface_subnet_ipv4: 30
interface_description: AS65002_peer
- test_interface:
interface_name: ge-0/0/2
interface_status: up
- set_add_bgp_neighbor:
interface_name: ge-0/0/2
neighbor_asnum: 65002
local_asnum: 65001
neighbor_address_ipv4: 192.168.35.2
neighbor_description: AS65002_peer
- test_bgp_neighbor:
neighbor_address_ipv4: 192.168.35.2
neighbor_status: Established
青文字: ルータ状態確認手順
赤文字: ルータ設定変更手順
- 16. © BIGLOBE Inc. 201616
コンフィグファイル一例
protocols {
bgp {
family inet {
unicast;
}
group {{ interface_name }} {
type external;
neighbor {{ neighbor_address_ipv4 }} {
description {{ neighbor_description }};
peer-as {{ neighbor_asnum }};
}
}
}
}
- set_add_bgp_neighbor:
interface_name: ge-0/0/2
neighbor_asnum: 65002
local_asnum: 65001
neighbor_address_ipv4: 192.168.35.2
neighbor_description: AS65002_peer
JUNOSルータ
設定変更を実施
テンプレートファイル
テンプレート用パラメータ
(前述のシナリオファイルより抽出)
- 17. © BIGLOBE Inc. 201617
実行結果 一部抜粋
緑文字: 正常が確認できている部分
赤文字: 異常が確認できている部分
黄文字: 作業者に判断を委ねている部分
- 19. © BIGLOBE Inc. 201619
所感 自動化システムについて
l うまくいったポイント
p 2-3時間程度かかる作業が、10分で完了!
p 作業者の負担軽減、手順書作成/査閲を時間短縮
p (Juniperツール充実のおかげで)
実働二週間でここまでできましたJ
l 悩ましいポイント
p YAML形式の手順書を、運用現場に
受け入れてもらえるか。理解と協力が必要。
p マルチベンダー対応も見据えた設計開発が必要。
Juniperツールと同じことが他社APIで実現できるか。
- 20. © BIGLOBE Inc. 201620
所感 Juniperツールについて
l PyEZ : ルータ設定ライブラリ
p 手動設定と同様の機能が実現でき、非常に強力
p ドキュメントやサンプルコードも充実
p JUNOS 11.4以降で動作するので導入の敷居が低い
l JSNAPy : ルータ状態管理ツール
p テストを人が読める記述方法で定義できるのは優秀
p プログラムから実行する機能はやや物足りない
Ø 設定ファイルをテンプレート化できない(PyEZは可能)
Ø xpath指定や条件文の記述、テスト結果取得にやや苦労
p ドキュメントが少なく、ノウハウを貯める必要あり
- 21. © BIGLOBE Inc. 201621
(Juniperさんに限らず)メーカーさんにお願いしたいこと
l ネットワーク作業を自動化するための
API/便利ツールを提供してください!
p PyEZ、JSNAPyの存在、本当に助かります。
p ネットワーク装置の自動化のしやすさは、
将来的に機器選定基準の一つに十分なりえます。
l 自動化導入のハードルを下げてください!
p ドキュメントの充実
p ユースケースごとのサンプル、Tips公開
p 自動化の導入ケースの紹介
Ø 成功パターン、失敗パターンなど
- 22. © BIGLOBE Inc. 201622
コミュニティの皆さんにお願いしたいこと
l 業務自動化にぜひトライしてみてください!
p 小さいことでもOK! 下手くそでもOK!
p オープンソースソフトウェアに貢献できることは
ソフトウェアが書けなくても、たくさんあります。
Ø 使ってみる / バグを知らせる / 利用事例の共有 etc.
l ネットワーク運用自動化の要求/知見/利用事例を
メーカーさんやコミュニティにフィードバックしましょう
- 23. © BIGLOBE Inc. 201623
まとめ
l PyEZ: ルータ設定ライブラリ
l JSNAPy: ルータ状態管理ツール/ライブラリ
を使って
ISPネットワーク設定作業を自動化してみました。
本発表をきっかけに、みなさまの職場で
自動化への挑戦がたくさん出てくることを
心から楽しみにしています。
- 24. © BIGLOBE Inc. 201624
ご参考
l 本日の詳細内容をブログで紹介しています。
http://qiita.com/items/065eef08f7b673cb7bb6
l 発表で使ったすべてのプログラムを公開しています。
p PyEZ利用例: https://github.com/taijiji/sample_pyez
p JSNAPy利用例: https://github.com/taijiji/sample_jsnapy
p ISP作業自動化デモ: https://github.com/taijiji/scenarioJUNOS
l ネットワーク運用自動化勉強会 NetOpsCoding
で紹介した自動化事例もご参照ください
p まとめページ https://github.com/netops-coding/netops-tips/wiki
p NetOpsCoding AdventCalendar2016
http://qiita.com/advent-calendar/2016/netopscoding