38
ConfD で Linux で Netconf ででででででで Akira Iwamoto

ConfD で Linux にNetconfを喋らせてみた

Embed Size (px)

Citation preview

Page 1: ConfD で Linux にNetconfを喋らせてみた

ConfD で Linux にNetconf を喋らせてみた

Akira Iwamoto

Page 2: ConfD で Linux にNetconfを喋らせてみた

自己紹介• 名前:岩本 彰• 所属 : このビルにある、通信機器会社• IOS-XR 製品のサポートを5年ほど• 今は SDN 関連製品のサポートをやっています

Microsoft Office User
Page 3: ConfD で Linux にNetconfを喋らせてみた

お題目• NETCONF って何?• ConfD って何?• アプリケーションを作ってみよう• やりたい事• 設計 /Yang モデル

• 出来たアプリを Netconf で操作

Page 4: ConfD で Linux にNetconfを喋らせてみた

一応聞いてみますが・・・• ConfD を聞いたことがある人?• ConfD を使ったことがある人?• ConfD を使った製品に関わってる人?

Page 5: ConfD で Linux にNetconfを喋らせてみた

NETCONF って何?

Page 6: ConfD で Linux にNetconfを喋らせてみた

Netconf• 自動化に向かない CLI を置き換える

• OSS/BSS 等からのクエリーを正しく処理• トランザクション処理が可能

• 排他的ロック• 設定変更後の Abort 等

• サブセットに、 RESTCONF の存在も。 ( 現時点で、 draft 18)

• TCP を使う• SNMP ? なにそれ? という状態に!?

Page 7: ConfD で Linux にNetconfを喋らせてみた

Netconf RFC• プロトコル詳細

• RFC 4741 (2006 年 )• 改訂 -> RFC 6241 (2011 年 )

• Underlay• RFC 4742 (ssh)

• 改訂 -> RFC 6242 (2011 年 )• RFC 4743 (SOAP)• RFC 4744 (BEEP)

• その他拡張• Event Notification (RFC 5277), Monitoring(RFC 6022)• Etc.

Page 8: ConfD で Linux にNetconfを喋らせてみた

ちょっとだけやってみます• サーバ : XRv 5.3.2 (IOS-XR)• 設定 :

• クライアント : netconf-console (confD についてくる )• netconf-console --get-config --port 830 --host 172.16.128.4

ssh server v2ssh server netconfnetconf-yang agent ssh

Github にもありますhttps://github.com/tail-f-systems/JNC/blob/master/examples/2-junos/netconf-console

Page 9: ConfD で Linux にNetconfを喋らせてみた

ConfD って何?

Page 10: ConfD で Linux にNetconfを喋らせてみた

Tail-F ConfD• Linux 機器を NETCONF 対応に!• North-bound に、各種プロトコルサーバ• NETCONF, REST, CLI, SNMP, Web• 実現のためのフレームワーク

• YANG データモデルドリブン• RFC 6020

• Basic 版は無償Download - Cisco DevNethttps://developer.cisco.com/site/confD/

Page 11: ConfD で Linux にNetconfを喋らせてみた

アプリ開発環境 C のみ C, Python, Java

Page 12: ConfD で Linux にNetconfを喋らせてみた

よくある実装例データNETCONF

CLI

SNMP

REST

サーバアプリ 1

サーバアプリ 2

サーバアプリ 3

MIB

各種 north-bound インターフェースで使用するデータモデルは、それぞれで定義

Page 13: ConfD で Linux にNetconfを喋らせてみた

C 社ルータ I○S-XR ではこんな感じデータNETCONF

CLI

SNMP

REST

bgp

ospf

interface

MIB

SysDB

CLI で使用するデータモデルと、 SNMP で使用するデータモデルは、それぞれで定義

Page 14: ConfD で Linux にNetconfを喋らせてみた

ConfD では、データを集中管理

CDBYANGで定義

NETCONF

CLI

SNMP

REST

サーバアプリ 1

サーバアプリ 2

サーバアプリ 3

ConfD

各種 north-bound インターフェースで使用するデータモデルは一つ

Page 15: ConfD で Linux にNetconfを喋らせてみた

アプリケーションを作ってみよう

Page 16: ConfD で Linux にNetconfを喋らせてみた

やりたい事• Samba の共有を追加• ホスト名を Host1 に変更• Loopback インターフェースの ip アドレスを追加

#echo ‘[public] path = /var/public[private] path = /var/private‘ >> smb.conf#hostname Host1#ip addr add 192.168.1.1/255.255.255.255 dev confdloop

Page 17: ConfD で Linux にNetconfを喋らせてみた

モデルの設計<edit-config><npstudy> <samba> <share> <name>dept1</name> <path>/var/dept1</path> </share> <share> <name>dept2</name> <path>/var/dept2</path> </share> </samba> <host> <hostname>Host1</hostname> <ip> <address>192.168.1.1/32</address> <netmask>255.255.255.255</address> </ip> </host></npstudy></edit-config>

#configure(config)#npstudy host hostname Host1(config)#npstudy host ip 192.168.1.1 255.255.255.0(config)#npstudy samba share dept1(config-share-dept1)#path /var/dept1(config)#npstudy samba share dept2(config-share-dept2)#path /var/dept2

NETCONF CLI

Page 18: ConfD で Linux にNetconfを喋らせてみた

モデルの設計データモデル ( スキーマ )• どのようにデータを保持 ( 表現 ) するか• 許されるデータ形式を規定

• 文字列 / 数値 /IP アドレス / 文字長 etc.

#configure(config)#?hostname Set hostnamesamba Configure samba(config)#samba% Incomplete command.(config)#samba ? WORD Name for this samba share(config)#samba public(config-samba)#

CLI

YANG で定義

NETCONF なら、当該トランザクション内でエラーを返却CLI なら >> のような感じ

Page 19: ConfD で Linux にNetconfを喋らせてみた

Yang モデル• RFC 6020• Config の構造を定義

Page 20: ConfD で Linux にNetconfを喋らせてみた

Yang モデルcontainer npstudy { container samba { list share { key name; leaf name { type string { pattern “[0-9a-zA-Z]{10}”; } leaf path { type string; } } } container host { leaf hostname { type string; } list ip { key "address netmask"; leaf address { type ietf:ipv4-address; } leaf netmask { type ietf:ipv4-address; } leaf description { type string; } } }}

npstudy samba share public path /public!npstudy samba share public2 path /public2

npstudy host hostname hostname1npstudy host ip 192.168.50.1 255.255.255.255!npstudy host ip 192.168.50.2 255.255.255.255 description test123456!

CLI

Page 21: ConfD で Linux にNetconfを喋らせてみた

データ (XML)<config xmlns="http://tail-f.com/ns/config/1.0"> <npstudy xmlns="http://tail-f.com/ns/example/npstudy"> <samba> <share> <name>public</name> <path>/public</path> </share> <share> <name>public2</name> <path>/public2</path> </share> </samba> <host> <hostname>hostname1</hostname> <ip> <address>192.168.50.1</address> <netmask>255.255.255.255</netmask> </ip> <ip> <address>192.168.50.2</address> <netmask>255.255.255.255</netmask> <description>For APP 1</description> </ip> </host> </npstudy></config>

Page 22: ConfD で Linux にNetconfを喋らせてみた

CDB Subscriber

ConfD/npstudy/samba/npstudy/host

/router

Subscriber (APP)

Subscriber (APP)

Subscriber (APP)bgp

• 各サブスクライバは、 ConfD の特定のノードを” subscribe” する• ConfD がノードの変更を検知すると、それを” subscribe” しているアプリに通知する• 必要であれば、 CDB のデータを参照して、各アプリケーション内で必要な処理を行う。• 設定内容に問題がある場合は、その Transaction を Abort させる

RIB TCAM

Page 23: ConfD で Linux にNetconfを喋らせてみた

Xpath と keypath• CDB は XML データベース• ノードの選択には Xpath と Keypath を使う• Xpath 1.0 のみ対応( tail-f 独自拡張により、 2.0 相当の機能もある)• 例 : /npstudy/samba/share[“name” = “dept1”]/path

• Keypath• 例 : /npstudy/samba/share{dept1}/path

Page 24: ConfD で Linux にNetconfを喋らせてみた

大まかな流れ• ライブラリの初期化 (confd_init)• ソケット作成 (fd = socket)• CDB へ接続 (cdb_connect(fd))• Subscription 作成 (cdb_subscribe(fd))

• subscribe(fd, "/path1”)• subscribe(fd, "/path2")

• 無限ループ• ファイルディスクリプタ監視 (poll(fd))• CDB Subscription からイベント読み出し (cdb_read_subscription_socket)

• If created (list にインスタンスが作成された )• If modified (leaf のデータが変更された )• If set (leaf にデータがセットされた )• If deleted ( ノードが削除された )

Page 25: ConfD で Linux にNetconfを喋らせてみた

ソースファイルのコンパイル• .yang のコンパイル• confdc -c npstudy.yang

• .h の作成

• confdc --emit-h npstudy.h npstudy.fxs

• アプリケーションのコンパイル

• gcc –o npstudy \

• npstudy.c \

• ../confd-basic-6.1/lib/libconfd.a \

• -lpthread -lm \

• -L../confd-basic-6.1/lib \

• -I../confd-basic-6.1/include

Page 26: ConfD で Linux にNetconfを喋らせてみた

ConfD の起動• confd –c ./confd.conf --addloadpath ~/confd-basic-6.1/etc/confd

• confd.conf• Confd の設定ファイル。デフォルトでは (CONFD_DIR)/etc/confd/confd.conf

• --addloadpath• Yang 内で、他のファイルを参照する場合に使用するサーチパス

Page 27: ConfD で Linux にNetconfを喋らせてみた

Loopback IP 追加 / 削除• インターフェース作成(初回のみ、手動で準備 )

• ip link add confdloop type dummy

• 追加• ip addr add 192.168.50.1/255.255.255.255 dev confdloop

• 削除• ip addr del 192.168.50.1/255.255.255.255 dev confdloop

Page 28: ConfD で Linux にNetconfを喋らせてみた

Samba の共有追加・削除/etc/samba/smb.conf にエントリの追加、又は削除• 追加• python share.py add share1 /share/share1

• 削除• python share.py del share1 ””

Page 29: ConfD で Linux にNetconfを喋らせてみた

出来たアプリを Netconf で操作

Page 30: ConfD で Linux にNetconfを喋らせてみた

Talk to server in NETCONF ( 手動 )

$ssh –s admin@localhost -p 2022 netconf<?xml version="1.0" encoding="UTF-8"?><hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> <capabilities> <capability>urn:ietf:params:netconf:base:1.0</capability> <capability>urn:ietf:params:netconf:base:1.1</capability></capabilities></hello>]]>]]>#169<?xml version="1.0" encoding="UTF-8"?><rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1"> <get-config><source><running/></source></get-config></rpc>##

Page 31: ConfD で Linux にNetconfを喋らせてみた

Python ncclient• https://github.com/ncclient/ncclient

from ncclient import manager

with manager.connect(host=host, port=830, username=user, hostkey_verify=False) as m: c = m.get_config(source='running').data_xml with open("%s.xml" % host, 'w') as f: f.write(c)

Page 32: ConfD で Linux にNetconfを喋らせてみた

netconf-console コマンドakiwamot@akiwamot_confd:~/npstudy$ netconf-console --get-config -x "/npstudy"<?xml version="1.0" encoding="UTF-8"?><rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1"> <data> <npstudy xmlns="http://tail-f.com/ns/example/npstudy"> <host> <ip> <address>192.168.1.1</address> <netmask>255.255.255.255</netmask> </ip> <ip> <address>192.168.1.2</address> <netmask>255.255.255.255</netmask> </ip> </host> </npstudy> </data></rpc-reply>akiwamot@akiwamot_confd:~/npstudy$https://github.com/tail-f-systems/JNC/blob/master/examples/2-junos/netconf-console

オプション--get-config--edit-config--get--hello--copy-config--get-schemaEtc.

Page 33: ConfD で Linux にNetconfを喋らせてみた

netconf-console (edit-config)編集$ netconf-console --edit-config=-<config> <npstudy xmlns="http://tail-f.com/ns/example/npstudy"> <host> <ip> <address>192.168.1.3</address> <netmask>255.255.255.255</netmask> </ip> <ip> <address>192.168.1.4</address> <netmask>255.255.255.255</netmask> </ip> </host> </npstudy></config>

Page 34: ConfD で Linux にNetconfを喋らせてみた

netconf-console (copy-config)上書き$ netconf-console --copy-config=-<npstudy xmlns="http://tail-f.com/ns/example/npstudy"> <host> <ip> <address>192.168.1.1</address> <netmask>255.255.255.255</netmask> </ip> <ip> <address>192.168.1.2</address> <netmask>255.255.255.255</netmask> </ip> </host></npstudy> 他の config を消してしまう可能性があるので注意

Page 35: ConfD で Linux にNetconfを喋らせてみた

netconf-consoleインタラクティブモード (半自動 )• netconf-console –i• これらは自動で付加• <hello>,<rpc>• EOM(]]>]]>) for Netconf1.0• Chunk-size/End-of-chunks (#xxx, ##) for Netconf1.1

Page 36: ConfD で Linux にNetconfを喋らせてみた

Netconf メソッド<start-transaction xmlns="http://tail-f.com/ns/netconf/transactions/1.0"> <target> <running/> </target></start-transaction>

<edit-config> <target> <running/> </target> <config xmlns="http://tail-f.com/ns/config/1.0"> <npstudy xmlns="http://tail-f.com/ns/example/npstudy"> <samba> <share> <name>abcde</name> <path>/path</path> </share> </samba> </npstudy> </config></edit-config>

Page 37: ConfD で Linux にNetconfを喋らせてみた

Netconf メソッド<prepare-transaction xmlns="http://tail-f.com/ns/netconf/transactions/1.0"/>

<commit-transaction xmlns="http://tail-f.com/ns/netconf/transactions/1.0"/>

Page 38: ConfD で Linux にNetconfを喋らせてみた

Rollback<copy-config>

<target>

<running/>

</target>

<source>

<url>file:///rollback0</url>

</source>

</copy-config>