Upload
akira-iwamoto
View
605
Download
1
Embed Size (px)
Citation preview
ConfD で Linux にNetconf を喋らせてみた
Akira Iwamoto
自己紹介• 名前:岩本 彰• 所属 : このビルにある、通信機器会社• IOS-XR 製品のサポートを5年ほど• 今は SDN 関連製品のサポートをやっています
お題目• NETCONF って何?• ConfD って何?• アプリケーションを作ってみよう• やりたい事• 設計 /Yang モデル
• 出来たアプリを Netconf で操作
一応聞いてみますが・・・• ConfD を聞いたことがある人?• ConfD を使ったことがある人?• ConfD を使った製品に関わってる人?
NETCONF って何?
Netconf• 自動化に向かない CLI を置き換える
• OSS/BSS 等からのクエリーを正しく処理• トランザクション処理が可能
• 排他的ロック• 設定変更後の Abort 等
• サブセットに、 RESTCONF の存在も。 ( 現時点で、 draft 18)
• TCP を使う• SNMP ? なにそれ? という状態に!?
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.
ちょっとだけやってみます• サーバ : 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
ConfD って何?
Tail-F ConfD• Linux 機器を NETCONF 対応に!• North-bound に、各種プロトコルサーバ• NETCONF, REST, CLI, SNMP, Web• 実現のためのフレームワーク
• YANG データモデルドリブン• RFC 6020
• Basic 版は無償Download - Cisco DevNethttps://developer.cisco.com/site/confD/
アプリ開発環境 C のみ C, Python, Java
よくある実装例データNETCONF
CLI
SNMP
REST
サーバアプリ 1
サーバアプリ 2
サーバアプリ 3
MIB
各種 north-bound インターフェースで使用するデータモデルは、それぞれで定義
C 社ルータ I○S-XR ではこんな感じデータNETCONF
CLI
SNMP
REST
bgp
ospf
interface
MIB
SysDB
CLI で使用するデータモデルと、 SNMP で使用するデータモデルは、それぞれで定義
ConfD では、データを集中管理
CDBYANGで定義
NETCONF
CLI
SNMP
REST
サーバアプリ 1
サーバアプリ 2
サーバアプリ 3
ConfD
各種 north-bound インターフェースで使用するデータモデルは一つ
アプリケーションを作ってみよう
やりたい事• 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
モデルの設計<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
モデルの設計データモデル ( スキーマ )• どのようにデータを保持 ( 表現 ) するか• 許されるデータ形式を規定
• 文字列 / 数値 /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 なら >> のような感じ
Yang モデル• RFC 6020• Config の構造を定義
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
データ (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>
CDB Subscriber
ConfD/npstudy/samba/npstudy/host
/router
Subscriber (APP)
Subscriber (APP)
Subscriber (APP)bgp
• 各サブスクライバは、 ConfD の特定のノードを” subscribe” する• ConfD がノードの変更を検知すると、それを” subscribe” しているアプリに通知する• 必要であれば、 CDB のデータを参照して、各アプリケーション内で必要な処理を行う。• 設定内容に問題がある場合は、その Transaction を Abort させる
RIB TCAM
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
大まかな流れ• ライブラリの初期化 (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 ( ノードが削除された )
ソースファイルのコンパイル• .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
ConfD の起動• confd –c ./confd.conf --addloadpath ~/confd-basic-6.1/etc/confd
• confd.conf• Confd の設定ファイル。デフォルトでは (CONFD_DIR)/etc/confd/confd.conf
• --addloadpath• Yang 内で、他のファイルを参照する場合に使用するサーチパス
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
Samba の共有追加・削除/etc/samba/smb.conf にエントリの追加、又は削除• 追加• python share.py add share1 /share/share1
• 削除• python share.py del share1 ””
出来たアプリを 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>##
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)
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.
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>
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 を消してしまう可能性があるので注意
netconf-consoleインタラクティブモード (半自動 )• netconf-console –i• これらは自動で付加• <hello>,<rpc>• EOM(]]>]]>) for Netconf1.0• Chunk-size/End-of-chunks (#xxx, ##) for Netconf1.1
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>
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"/>
Rollback<copy-config>
<target>
<running/>
</target>
<source>
<url>file:///rollback0</url>
</source>
</copy-config>