すべてを統合
以下のユースケースは、前述のApstraフリーフォーム機能のさまざまな方法と技術を使用するさまざまなネットワーク設計の例です。これらの例は、Apstraとフリーフォームの機能を使用してネットワークのさまざまなユースケースに対処する方法を理解するのに役立ちます。
ユース ケース 1 - 小規模バージョンのロンドンチューブ - CloudLabs トポロジー
このユースケースでは、小規模バージョンのロンドンの地下システムをマップとして使用し、任意のスイッチからネットワーク トポロジーを設計します。ここでのコンセプトは、Jinjaテンプレートとプロパティセットを使用して非常にシンプルなネットワーク設計を作成することです。このユース ケースでは、複雑でない Jinja テンプレート作成とプロパティ セットを使用して、完全なネットワーク設計を作成する方法を示します。
このユースケースは、Juniper Apstra Cloudlabsを使用した実践的なラボとしてご利用いただけます。また、参照、投稿、フォークができるJinjaファイルとJSONプロパティセットを含むGitHubリポジトリもあります。
-
環境のトポロジー。
設計図の設計
トポロジ エディター/API を介して割り当てられたタグと IP アドレスを示すシステム リンクすべて。
-
エンドステートレンダリングされた設定。ここでの Bond-Street デバイスは、レンダリングされた設定の例です。
インターフェイス ポリシーのブロック オプション プロトコルのブロック interfaces { replace: xe-0/0/0 { unit 0 { interfaces { replace: xe-0/0/0 { unit 0 { description "facing_oxford-circus:xe-0/0/1"; family inet { address 192.168.0.2/31; } } } replace: xe-0/0/1 { unit 0 { description "facing_green-park:xe-0/0/1"; family inet { address 192.168.0.8/31; } } } replace: lo0 { unit 0 { family inet { address 10.0.0.2/32; }
protocols { lldp { port-id-subtype interface-name; port-description-type interface-description; neighbour-port-info-display port-id; interface all; } replace: rstp { bridge-priority 0; bpdu-block-on-edge; } bgp { group external-peers { type external; export send-direct; neighbor 192.168.0.3 { peer-as 22; export add-med-110; } neighbor 192.168.0.9 { peer-as 86; export add-med-177; } } } } routing-options { autonomous-system 47; }
protocols { lldp { port-id-subtype interface-name; port-description-type interface-description; neighbour-port-info-display port-id; interface all; } replace: rstp { bridge-priority 0; bpdu-block-on-edge; } bgp { group external-peers { type external; export send-direct; neighbor 192.168.0.3 { peer-as 22; export add-med-110; } neighbor 192.168.0.9 { peer-as 86; export add-med-177; } } } } routing-options { autonomous-system 47; }
-
設定テンプレートを表示
設定テンプレートシステム.jinja の説明 system { host-name {{hostname}}; }
このテンプレートでは、デバイスコンテキストの組み込みの「ホスト名」変数を使用して、システムホスト名をこれに設定します。 構成テンプレートインターフェイス.jinja の説明 {% set this_router=hostname %} interfaces { {% for interface_name, iface in interfaces.iteritems() %} replace: {{ interface_name }} { unit 0 { description "{{iface['description']}}"; family inet { address {{iface['ipv4_address']}}/{{iface['ipv4_prefixlen']}}; } } } {% endfor %} replace: lo0 { unit 0 { family inet { address {{ property_sets.data[this_router]['loopback'] }}/32; } } } }
変数this_router=ホスト名を設定する
インターフェイスを通って記述され、junosの適切なインターフェイススタンザ構文を挿入するループの場合は、デバイスコンテキストからのインターフェイスとファミリーinetアドレスとプレフィックス長の説明が含まれます。これらの値は、トポロジ エディターのリンクを使用して入力できます。
これにより、このルーターのループバックアドレスのproperty_setデータがループバックスタンザに挿入されます。
構成テンプレート プロトコル.jinja の説明 {% set this_router=hostname %} policy-options { policy-statement send-direct { term 1 { from protocol direct; then accept; } } {% for interface_name, iface in interfaces.iteritems() %} {% set link_med = iface.link_tags[0] %} {# this may create multiple identical policy-statements, but JunOS is smart enough to squash them. #} policy-statement add-med-{{ link_med }} { from { route-filter 0.0.0.0/0 longer; } then { metric add {{ link_med }}; } then { accept } } {% endfor %} } protocols { lldp { port-id-subtype interface-name; port-description-type interface-description; neighbour-port-info-display port-id; interface all; } replace: rstp { bridge-priority 0; bpdu-block-on-edge; } bgp { group external-peers { type external; export send-direct; {% for interface_name, iface in interfaces.iteritems() %} neighbor {{ iface.neighbor_interface.ipv4_address }} { {% set peer_hostname=iface.neighbor_interface.system_hostname %} peer-as {{ property_sets.data[peer_hostname]['asn'] }}; export add-med-{{ iface.link_tags[0] }}; } {% endfor %} } } } routing-options { autonomous-system {{ property_sets.data[this_router]['asn'] }}; }
デバイスコンテキストから変数this_router = ホスト名を設定します。
すべての直接接続ルートを送信するポリシー オプション スタンザを設定します。
インターフェイス ツリーをウォークします。
トポロジを介してインターフェイス上で設定されたタグに変数link_medを設定します。
LLDP パラメータを設定する
RSTP パラメーターの設定
bgp スタンザの作成
グループ外部ピア
外部のタイプ(ebgp)
send-direct のエクスポート ポリシー
インターフェイスツリーをウォークし、ipv4アドレスを持つネイバーのネイバーを挿入します。peer_hostname変数を近隣インターフェースのホスト名に設定します。
property_setsデータ「asn」からピアを取得する
ピアasスタンザは、add-med-tagsのエクスポートポリシーで設定される
プロパティセットasn値から自律システムでルーティングオプションスタンザを設定します。
-
プロパティ セット
プロパティ セット 「データ」の 説明 { "bond-street": { "asn": 47, "loopback": "10.0.0.2" }, "green-park": { "asn": 86, "loopback": "10.0.0.4" }, "tottenham-court-road": { "asn": 48, "loopback": "10.0.0.3" }, "leicester-square": { "asn": 137, "loopback": "10.0.0.5" }, "piccadilly-circus": { "asn": 23, "loopback": "10.0.0.1" }, "oxford-circus": { "asn": 22, "loopback": "10.0.0.0" } }
プロパティセットは、次のような辞書のリストとして表されます。
-
システムまたはステーションの名前がキーであり、そのキー内には2つのパラメータがあります
-
BGPピアリングの自律システム番号であるAsn
-
ピアリングするシステム/ステーションのループバックアドレスであるループバック。
-
ユース ケース 2 - Day 2 の構成を促進するためのタグとプロパティ セット
以下に示す小規模なトポロジは、フリーフォーム トポロジ エディターで構築されています。3 つのスイッチと ESXi-1 & ESXi-2 という名前の 2 つの外部システムを備えています。2 つのホストに面したリンクには、それぞれ esxBlueTrunk と esxRedTrunk がタグ付けされています。このユース ケースの目的は、フリーフォーム機能を使用して、ESXi ホストに面したスイッチ トランクを動的に構築する方法を示すことで、プロパティ セット内のエントリーとトポロジで割り当てられたタグによって決定されます。
このインスタンスのタグの役割は、トランクを構成/作成する場所を示すものです。
このインスタンスのプロパティ セットの役割は、トランク メンバー、VLAN、および IRB を構成するために必要な関連データを保持することです。
この例では、設定テンプレートを再作成する必要なく、慎重に作成された設定テンプレート(Jinja2)、タグ、およびプロパティセットを使用して設定を構築する機能について説明します。トポロジに新しいタグが割り当てられるか、新しい VPN がプロパティ セットに割り当てられると、関連する構成がこれらのトランク用に動的に構築されます。
最終状態の設定
esxBlueTrunk でタグ付けされたインターフェイスでは、最後の Junos 構成には以下が含まれます。
インターフェイス ブロック | IRB ブロック | VLAN ブロック |
---|---|---|
interfaces { ae2 { description esxBlueTrunk unit 0 { family ethernet-switching { interface-mode trunk vlan { members [ vn99 vn100 vn101 ] } } } } |
irb { unit 99 { family inet { mtu 9000; address 1.1.99.1/24; } } unit 100 { family inet { mtu 9000; address 1.1.100.1/24; } } unit 101 { family inet { mtu 9000; address 1.1.101.1/24; } } } } |
vlans { vn99 { vlan-id 99; description vMotionVN-99; l3-interface irb.99; } vn100 { vlan-id 100; description storageVN-100; l3-interface irb.100; } vn101 { vlan-id 101; description mgmtVN-101; l3-interface irb.101; } } |
esxTrunk プロパティ セット
プロパティ セットには、Junos トランク 構成の構築に必要な詳細情報が含まれています。
esxTrunk プロパティ セット | の説明 |
---|---|
esxTrunkプロパティセット(左側)は、再帰的検索を有効にするために、辞書の辞書として構築されました。esxBlueTrunk辞書は拡張され、値99、100、101が表示され、このインスタンスでは両方のVLAN IDとして使用され、その下の辞書のキーとして使用されます。以下の辞書は、サブネット、ゲートウェイ、および説明のキー : 値ペアを提供します。この例では、サブネットは必須ではなく、純粋に参照用に存在します。 このように整理されたデータにより、Config Templateは2つのデータ構造を繰り返し、一致するタグを検索するように設計されています。
両方のデータセットのタグが一致すると、設定テンプレートから目的の設定が生成されます。上記の Junos 構成出力で左側のプロパティ セットを参照すると、次のようになります。
両方のesx(赤/ピンク)トランクは、esxBlueTrunkと同様の情報を保持しています 左側の Property Set とトポロジ内のリンクに割り当てられたタグの両方の効率的な再帰的歩行を有効にするには、タグに同じ値を割り当てます。
|
Jinja2ベース構成テンプレートステートマシン
構成テンプレートesxTrunks.jinjaフローについては、以下に説明します。
Jinja2基本構成テンプレート
構成テンプレートの | 説明 |
---|---|
{% set Rendered_VNs = {} %} {% for ps_tag in property_sets.esxTrunk %} {% for interface_name, iface in interfaces.iteritems() %} {% if ((iface.link_tags) and (ps_tag in iface.link_tags)) %} interfaces { {{interface_name}} { description {{ ps_tag }} unit 0 { family ethernet-switching { interface-mode trunk vlan { members [ {% for vlan_id in property_sets.esxTrunk[ps_tag] %} {% set _ = Rendered_VNs.update({vlan_id: ps_tag}) %} vn{{ vlan_id }} {% endfor %} ] } } } } {% endif %} {% endfor %} {% endfor %} irb { {% for vn in Rendered_VNs %} {% set tag = Rendered_VNs[vn] %} unit {{ vn }} { family inet { mtu 9000; address {{ property_sets.esxTrunk[tag][vn]['gateway'] }}; } } {% endfor %} } } vlans { {% for vn in Rendered_VNs|unique %} {% set tag = Rendered_VNs[vn] %} vn{{ vn }} { vlan-id {{ vn }}; description {{ property_sets.esxTrunk[tag][vn]['description'] }}-{{ vn }}; l3-interface irb.{{ vn }}; } {% endfor %} } |
レンダリングするVNを保存するためのグローバル辞書 まず、上記の esxTrunk プロパティ セットをトラバースします。取得され、変数ps_tagに格納された最初の値 (プロパティ セット タグ) は、文字列のいずれかです。
トポロジ内のインターフェイスをトラバースまたは「反復」します インターフェイスlink_tagが存在し、ps_tagがインターフェイスリンクタグのリストにある場合、トランク設定がレンダリングされる場所で 条件が満たされています。 インターフェイス ブロックの出力を開始します。ps_tagがインターフェイスリンクタグと等しいinterface_nameを出力します。オプションで説明を割り当てますが、フリーフォームはすでにトポロジからこの説明を割り当てますが、 トランクを記述するユニット番号と関連する設定を設定する トランク メンバーを設定する VLAN ID を取得するps_tagを使用して esxTrunk プロパティ セットをトラバースします。 後で使用する1行目で宣言されている辞書に各VLAN IDを入力します。 esxTrunk プロパティ セットに詳細な vn VLAN ID を出力します。 esxTrunk プロパティ セットにエントリがこれ以上ない場合は、ループを終了します。 上記の if ステートメントを終了します。 上記のステートメントの for を終了します。 上記のステートメントの for を終了します。 irb ブロックの出力を開始する Rendered_VNs辞書をトラバースする 可読性を高めるために、変数タグを辞書に格納されたタグに設定します。 vlan_idを使用してユニット番号を設定します。 タグ、vn、およびキー 'ゲートウェイ' を使用して、esxTrunk PropertySet に格納されているゲートウェイ アドレスを設定して、格納された文字列にアクセスします。 上記のステートメントの for を終了します。 vlans ブロックの出力をスターター 上記のirbブロックに従って、Rendered_VNs辞書をトラバースし、 可読性を高めるために、変数タグを辞書に格納されたタグに設定します。 vn 番号を設定する vlan_id ID を設定する 説明を必要に応じて設定する レイヤー 3 irb 番号を設定します。 上記のステートメントの for を終了します。 |
以下に示すJinja2ベースの設定テンプレートは、割り当てられたタグとプロパティセットの両方を使用して、必要な設定を構築します。
ユース ケース 3 - CRB を使用した高度な例 - CloudLabs トポロジー
この最後のユースケースは、Apstra Engineeringが作成した完全なCRBの例です。この例は静的なJinjaテンプレートで完全に構築されており、すべてのデータはネットワーク/デバイスのプロパティセットにあります。これにより、このCRBの例では、プロパティセットを編集するだけでネットワークの運用/拡張/変更が可能になり、基盤となるJinjaテンプレートに触れなくなっています。このユースケースの目的は、可能な技術の例を紹介し、フリーフォーム機能の柔軟性と能力を実証することです。すべての設定テンプレート、プロパティセット、Jinjaテンプレートと関数には、使用と機能を理解するのに役立つドキュメントが埋め込まれています。
このユースケースは、Juniper Apstra Cloudlabsを使用して、完全に導入された実践的なサンドボックスとしてご利用いただけます。同じファイルすべてを含むGitHubリポジトリもあります。これを特定の機能を実行する方法の例として使用して、ユースケースに合わせて独自の高度な構成テンプレートを作成 https://www.juniper.net/us/en/forms/apstra-free-trial.html