この製品のマニュアルセットは、偏向のない言語を使用するように配慮されています。このマニュアルセットでの偏向のない言語とは、年齢、障害、性別、人種的アイデンティティ、民族的アイデンティティ、性的指向、社会経済的地位、およびインターセクショナリティに基づく差別を意味しない言語として定義されています。製品ソフトウェアのユーザーインターフェイスにハードコードされている言語、RFP のドキュメントに基づいて使用されている言語、または参照されているサードパーティ製品で使用されている言語によりドキュメントに例外が存在する場合があります。シスコのインクルーシブランゲージに対する取り組みの詳細は、こちらをご覧ください。
このドキュメントは、米国シスコ発行ドキュメントの参考和訳です。リンク情報につきましては、日本語版掲載時点で、英語版にアップデートがあり、リンク先のページが移動/変更されている場合がありますことをご了承ください。あくまでも参考和訳となりますので、正式な内容については米国サイトのドキュメントを参照ください。
データ モデルはネットワーク デバイス内の設定データと運用データをモデル化する標準ベースのアプローチです。データ モデルを使用すると、ネットワーク全体の可視化と設定を自動化および簡略化できます。
Cisco IOS XR ソフトウェアでは、データ モデルを使用してネットワーク上の複数のルータを自動的に設定できます。データ モデルを使用したルータ設定では、従来のルータの管理テクニックがもたらす欠点が解消されます。
CLI は、ルータの設定やルータの統計情報の取得に幅広く使用されています。スイッチオーバー、リロード、プロセスの再起動などのルータ上の他のアクションも CLI ベースです。頻繁に使用されている CLI ですが、これには数多くの制約事項があります。
お客様のニーズは、刻々と進化しています。通常、ネットワーク センターには、ネットワークの複数のレイヤに多種多様なデバイスが存在しています。一括設定や自動設定を実現する必要があります。CLI スクレイピングには柔軟性がなく、最適でもありません。わずかな設定変更の場合でも、スクリプトを何度も書き直すには手間がかかります。CLI を使用して設定を一括で変更するとエラーが発生しやすく、システムに関わる問題を引き起こす場合があります。これをデータ モデルで解決します。つまり、手作業で設定作業を行うのではなく、プログラムを使用したり、各種の標準規格に準拠してネットワークの設定を記述します。データ モデルは、業界で定義された標準的な言語で記述されます。CLI を使用した設定のほうが簡単ですが(人間にわかりやすい)、データ モデルを使用して設定を自動化すると拡張性が得られます。
Cisco IOS XR は YANG データ モデリング言語をサポートしています。YANG をネットワーク設定プロトコル(NETCONF)で使用すると、自動化されたプログラミング可能なネットワーク操作の望ましいソリューションが実現します。
YANG はネットワーク デバイスのコンフィギュレーション データと運用データ、リモート プロシージャ コール、および通知を記述するために使用されるデータ モデリング言語です。次に、YANG の優れた機能を示します。
人間が判読できる形式であるため、習得や表現が簡単
動作の定義をサポート
再利用可能なタイプおよびグループ
モジュールとサブモジュールによるデータのモジュール性
動作の定義(RPC)をサポート
十分に定義付けられたバージョン管理ルール
拡大に伴う拡張性
YANG の詳細については、RFC 6020 および 6087を参照してください。
NETCONF は コンフィギュレーション データおよび運用データをクライアント アプリケーションとルータ間で交換するためのメカニズムをし、YANG モデルは交換されるデータに有効な構造を定義します。
プロトコル |
トランスポート |
符号化/復号化 |
---|---|---|
NETCONF |
SSH |
XML |
モジュールでは、単一のデータ モデルを定義します。ただし、モジュールは import ステートメントを使用して外部モジュールをインポートするか、または include ステートメントを使用して 1 つ以上のサブモジュールを組み込むことで、他のモジュールおよびサブモジュールの定義を参照できます。モジュールは augment ステートメントを使用してデータ モデル階層内の新しいノードの配置を定義し、when ステートメントを使用して新しいノードが有効になる条件を定義することで、別のモジュールへの拡張を実現できます。インポートしたモジュール内の定義を参照する場合は Prefix を使用します。
YANG モデルを使用して、機能を設定したり、(show コマンドと同様の)動作状態を取得したりできます。
次に AAA のコンフィギュレーション YANG モデル(- cfg で表示)を示します。
(snippet) module Cisco-IOS-XR-aaa-locald-cfg { /*** NAMESPACE / PREFIX DEFINITION ***/ namespace "http://cisco.com/ns/yang/Cisco-IOS-XR-aaa-locald-cfg"; prefix "aaa-locald-cfg"; /*** LINKAGE (IMPORTS / INCLUDES) ***/ import Cisco-IOS-XR-types { prefix "xr"; } import Cisco-IOS-XR-aaa-lib-cfg { prefix "a1"; } /*** META INFORMATION ***/ organization "Cisco Systems, Inc."; ......................... ......................... (truncated)
次に AAA の運用 YANG モデル(-oper で表示)を示します。
(snippet) module Cisco-IOS-XR-aaa-locald-oper { /*** NAMESPACE / PREFIX DEFINITION ***/ namespace "http://cisco.com/ns/yang/Cisco-IOS-XR-aaa-locald-oper"; prefix "aaa-locald-oper"; /*** LINKAGE (IMPORTS / INCLUDES) ***/ import Cisco-IOS-XR-types { prefix "xr"; } include Cisco-IOS-XR-aaa-locald-oper-sub1 { revision-date 2015-01-07; } /*** META INFORMATION ***/ organization "Cisco Systems, Inc."; ........................ ........................ (truncated)
(注) |
サブモジュールはいくつでも組み込むことができますが、各サブモジュールが属すことができるのは 1 つのモジュールのみです。すべての標準モジュールおよびサブモジュールの名前は一意である必要があります。 |
YANG データ モデルはノードのある階層型のツリーベース構造で表現できるため、簡単に理解できます。YANG は 4 つのノード タイプを定義します。各ノードに名前があり、ノードではノード タイプに応じて値を定義するか、または一連の子ノードを含めることができます。次のノード タイプがあります(データ モデリングの場合)。
YANG はリーフ値のデータ型を定義します。これらのデータ型はユーザがリーフに関連する入力を理解するために役立ちます。
名前 |
説明 |
---|---|
binary |
バイナリ データ |
bits |
一連のビットまたはフラグ |
boolean |
「true」または「false」 |
decimal64 |
64 ビットの符号付き 10 進数 |
empty |
値がないリーフ |
enumeration |
列挙文字列 |
identityref |
抽象的なアイデンティティへの参照 |
instance-identifier |
データ ツリー ノードの参照 |
int(整数定義値) |
8 ビット、16 ビット、32 ビット、64 ビットの符号付き整数 |
leafref |
リーフ インスタンスへの参照 |
uint |
8 ビット、16 ビット、32 ビット、64 ビットの符号なし整数 |
string |
人間が判読できる文字列 |
union |
メンバ タイプの選択 |
各機能には、スキーマから合成された定義済みの YANG モデルがあります。ツリー形式のモデルは次のとおりです。
CLI |
データ モデル |
---|---|
router:ios(config)#cdp ? advertise Specify the version of CDP advertisements holdtime Specify the holdtime (in sec) to be sent in packets log Configure CDP to log Events timer Specify the rate at which CDP packets are sent (in sec) |
module: Cisco-IOS-XR-cdp-cfg +--rw cdp +--rw timer? uint32 +--rw advertise-v1-only? empty +--rw enable? boolean +--rw hold-time? uint32 +--rw log-adjacency? empty augment /a1:interface-configurations/a1:interface-configuration: +--rw cdp +--rw enable? Empty |
CLI を使用して利用可能なオプションは、データ モデル内でリーフ ノードとして定義されます。各リーフ ノードに対応して表示される定義済みのデータ タイプは、ユーザが必須入力を理解するのに役立ちます。
module: Cisco-IOS-XR-ifmgr-cfg +--rw global-interface-configuration | +--rw link-status? Link-status-enum +--rw interface-configurations +--rw interface-configuration* [active interface-name] +--rw dampening | +--rw args? enumeration | +--rw half-life? uint32 | +--rw reuse-threshold? uint32 | +--rw suppress-threshold? uint32 | +--rw suppress-time? uint32 | +--rw restart-penalty? uint32 +--rw mtus | +--rw mtu* [owner] | +--rw owner xr:Cisco-ios-xr-string | +--rw mtu uint32 +--rw encapsulation | +--rw encapsulation? string | +--rw capsulation-options? int32 +--rw shutdown? empty +--rw interface-virtual? empty +--rw secondary-admin-state? Secondary-admin-state-enum +--rw interface-mode-non-physical? Interface-mode-enum +--rw bandwidth? int32 +--rw link-status? empty +--rw description? string +--rw active Interface-active +--rw interface-name xr:Interface-name
module: Cisco-IOS-XR-cdp-oper +--ro cdp +--ro nodes +--ro node* [node-name] +--ro neighbors | +--ro details | | +--ro detail* | | +--ro interface-name? xr:Interface-name | | +--ro device-id? string | | +--ro cdp-neighbor* | | +--ro detail | | | +--ro network-addresses | | | | +--ro cdp-addr-entry* | | | | +--ro address | | | | +--ro address-type? Cdp-l3-addr-protocol | | | | +--ro ipv4-address? inet:ipv4-address | | | | +--ro ipv6-address? In6-addr | | | +--ro protocol-hello-list | | | | +--ro cdp-prot-hello-entry* | | | | +--ro hello-message? yang:hex-string | | | +--ro version? string | | | +--ro vtp-domain? string | | | +--ro native-vlan? uint32 | | | +--ro duplex? Cdp-duplex | | | +--ro system-name? string | | +--ro receiving-interface-name? xr:Interface-name | | +--ro device-id? string | | +--ro port-id? string | | +--ro header-version? uint8 | | +--ro hold-time? uint16 | | +--ro capabilities? string | | +--ro platform? string ............................................... (truncated)
各機能には定義された YANG モデルがあります。シスコ固有の YANG モデルは、合成モデルと呼ばれます。IETF、IEEE、Open Config などの一部の標準化団体は、共通モデルとして参照される業界全体の標準的な YANG モデルの提供に取り組んでいます。
シスコは現在、2 つの OC(オープン コンフィギュレーション)YANG モデルをサポートしています。これらは、共通データ モデルとも呼ばれています。
https://github.com/openconfig/public/tree/master/release/models/bgp
https://github.com/YangModels/yang/tree/master/vendor/cisco/xr
NETCONF は、ネットワーク デバイスの設定をインストール、操作、削除するためのメカニズムです。コンフィギュレーション データとプロトコル メッセージに Extensible Markup Language(XML)ベースのデータ符号化を使用します。NETCONF は、シンプルな RPC(リモート プロシージャ コール)ベースのメカニズムを使用してクライアントとサーバ間の通信を促進します。通常、クライアントはネットワーク マネージャの一部として実行されているスクリプトやアプリケーションです。通常、サーバはネットワーク デバイス(ルータ)です。
NETCONF の詳細については、RFC 6241 を参照してください。
NETCONF セッション
NETCONF セッションは、ネットワーク管理者またはネットワーク コンフィギュレーション アプリケーションとネットワーク デバイスの間の論理接続です。グローバル コンフィギュレーションの属性は承認されたセッション時に変更でき、その影響はすべてのセッションに反映されます。NETCONF はコネクション型で、基盤となる転送に SSH を使用しています。NETCONF セッションは、機能が公開されている場合は hello メッセージで確立され、close メッセージまたは kill メッセージを使用して終了します。
NETCONF レイヤ
NETCONF は 4 つのレイヤに分割できます。
コンテンツ レイヤ:設定および通知データが含まれます。
動作レイヤ:XML で符号化されたパラメータによる RPC メソッドとして起動される一連の基本プロトコル動作を定義します。
メッセージ レイヤ:RPC と通知を符号化するためのシンプルな、トランスポート非依存のフレーミング メカニズムを提供します。
セキュア トランスポート レイヤ:クライアントとサーバ間の通信パスを提供します。
NETCONF の操作
NETCONF は 1 つ以上のコンフィギュレーション データストアの存在を定義し、それらでの設定操作を可能にします。コンフィギュレーション データストアは、初期のデフォルト状態から必要な動作状態にデバイスを移行するために必要な一連の完全なコンフィギュレーション データとして定義されます。コンフィギュレーション データストアには状態データやエグゼクティブ コマンドは含まれません。
IOS XR NETCONF は次の操作をサポートします。
<get-config>:指定した設定の全部または一部を名前付きのデータストアから取得します。
<get>:実行コンフィギュレーションとデータ状態情報を取得します。
<edit-config>:指定したコンフィギュレーションの全部または一部を指定したターゲット設定にロードします。
<get-schema>:必要なスキーマをルータから取得します。
NETCONF の操作:例
次に、NETCONF <get-config> 要求の操作の例を示します。
送信要求メッセージでルータ上で実行している CDP の現在の設定を取得します。リターン メッセージには現在の CDP の設定が含まれています。
NETCONF 要求(クライアントからサーバへ) |
NETCONF 応答(サーバからサクライアントへ) |
---|---|
<rpc message-id="101" xmlns="urn:ietf:params:xml:ns:NETCONF:base:1.0"> <get-config> <source><running/></source> <filter> <cdp xmlns="http://cisco.com/ns/yang/Cisco-IOS-XR-cdp-cfg"/> </filter> </get-config> </rpc> |
<?xml version="1.0"?> <rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:NETCONF:base:1.0"> <data> <cdp xmlns="http://cisco.com/ns/yang/Cisco-IOS-XR-cdp-cfg"> <timer>10</timer> <enable>true</enable> <log-adjacency></log-adjacency> <hold-time>200</hold-time> <advertise-v1-only></advertise-v1-only> </cdp> </data> </rpc-reply> |
RPC 要素を使用して、クライアントからサーバに送信される NETCONF 要求を囲みます。<rpc> 要素の必須属性として message-id があります。これは、RPC の送信者によって選択された文字列で、通常、単調に増加する整数を符号化します。RPC の受信者はこの文字列を復号化したり解釈したりしせず、結果の <rpc-reply> メッセージに message-id 属性として使用するために保存のみを行います。送信者は message-id 値が正規化されていることを確認する必要があります。RPC 応答メッセージには、クライアントがサーバから情報を受信したときと同じメッセージ ID が含まれています。
XML サブツリー フィルタリングは、<get> 操作または <get-config> 操作の <rpc-reply> に含める特定の XML サブツリーをアプリケーションが選択できるようにするメカニズムです。
サブツリー フィルタは XML 要素と XML 属性で構成されます。サブツリー フィルタに存在できる要素は次のとおりです。
Example: <filter type="subtree"> <top xmlns="http://example.com/schema/1.2/config"/> </filter>
属性照合式:指定した属性値と照合することによってフィルタリングが実行されます。テーブル クラスのみが expressions 属性を使用したこのフィルタリングを指定できます。
Example: ifName is the attribute match expression <filter type="subtree"> <t:top xmlns:t="http://example.com/schema/1.2/config"> <t:interfaces> <t:interface t:ifName="eth0"/> </t:interfaces> </t:top> </filter>
抑制ノード:子ノード(クラス)があるノード(クラス)を指定することによってフィルタリングが実行されます。このフィルタリングでは、コンテナ クラスを指定します。
Example: top is a containment node <filter type="subtree"> <top xmlns="http://example.com/schema/1.2/config"> <users/> </top> </filter>
ノード選択:フィルタリングはリーフ ノードを指定することによって実行されます。このフィルタリングではリーフ クラスを指定します。
Example: users is a selection node (in the containment node - top) <filter type="subtree"> <top xmlns="http://example.com/schema/1.2/config"> <users/> </top> </filter>
コンテンツ照合ノード:リーフ ノードの内容を正確に照合することによってフィルタリングが実行されます。このフィルタリングは、テーブル クラスのクラス値の命名を指定して実行されます。
Example: name is the content match node (in the containment node - top and the selection node - user) <filter type="subtree"> <top xmlns="http://example.com/schema/1.2/config"> <users> <user> <name>fred</name> </user> </users> </top> </filter>