このページで
例:Salt を使用して Junos OS を実行するデバイスを設定する
ジュニパーネットワークスは、Salt を使用して Junos OS を実行するデバイスを管理するためのサポートを提供します。この例では、Salt を使用して Junos OS を実行する複数のデバイスを設定します。
要件
この例では、以下のハードウェアとソフトウェアのコンポーネントを使用しています。
NETCONF を有効にした Junos OS を実行する 3 台の MX シリーズ ルーター
次の要件を持つ塩マスター:
Salt バージョン 3001 以降
Junos OS を実行しているデバイスで ping と操作を実行できます。
概要
この例では、Junos OS を実行するターゲット デバイスで BGP ピアリング セッションを設定する Salt 状態を定義します。 表 1 では、デバイス ホスト名、プロキシ ID、デバイス固有のファイルの概要を示します。
ホスト |
プロキシー ID |
プロキシ設定ファイル (/srv/pillar) |
BGP データ ファイル (/srv/pillar/bgp) |
---|---|---|---|
r1 |
r1 |
r1-proxy.sls |
r1.sls |
R2 |
R2 |
r2-proxy.sls |
r2.sls |
r3 |
r3 |
r3-proxy.sls |
r3.sls |
この例では、以下のコンポーネントを使用しています。
Jinja2 設定テンプレート - コマンド形式を使用して
set
BGP 設定を Jinja テンプレートとして定義します。テンプレートは、形式を示すために .set ファイル拡張子を使用します。ピラー ファイル — Jinja2 テンプレートで必要なデバイス固有の設定データを定義します。各デバイスのデータは、Salt マスターの /srv/pillar/bgp ディレクトリの下の別のファイルに保存されます。
ピラートップファイル — 各ピラーファイルを適切なプロキシミニオンにマッピングします。
状態ファイル — ターゲット デバイスに適用する状態を定義します。この場合、ステートファイルは、BGP設定を
junos.install_config
デバイスに適用する機能を使用します。状態トップ ファイル — 状態ファイルを、状態を適用する必要があるデバイスにマッピングします。
この例では、Jinja2 テンプレートを作成して、デバイスにロードされ、コミットされる BGP 設定を生成します。このテンプレートは、必要に応じて再利用できるように、デバイス固有の設定データの変数に置き換えます。テンプレート ファイルは Salt マスターの /srv/salt/configs ディレクトリの下に置かれます。
その後、各デバイスに個別の柱ファイルを作成し、ファイル内のデバイス固有の設定データを定義します。各ピラー ファイルは、 BGP_data
設定テンプレートで参照されるすべての変数パラメータを含むキーを定義します。ピラートップファイルは、各ピラーファイルをそれぞれのプロキシミニオンにマッピングします。柱にデータを格納することで、各プロキシ ミニオンがそのデバイスのデータにのみアクセスできるようになります。
junos_bgp_config.slsステートファイルは、テンプレートにBGP設定を適用する機能をjunos.install_config
使用する状態を定義します。呼び出されると、この関数は設定データベースをロックし、ターゲット デバイスに固有の設定を読み込み、設定をコミットしてから、データベースのロックを解除します。この関数には、diffs_file
プロキシ ミニオン サーバー上のファイルに構成の違いを格納するためのパラメーターが含まれています。ファイル名は、グレインをid
使用して、出力ファイルのデバイス固有のファイル名を生成します。
状態トップ ファイルは、ピラー キーと任意の junos_bgp_config
値を持つ任意の BGP_data
ミニオンに状態を適用します。ハイステートを実行するか、デバイスにその状態を適用すると、Salt はテンプレートとピラー データを使用してターゲットに固有の設定を生成し、デバイス上の設定を読み込んでコミットする関数を呼び出します junos.install_config
。設定が既に適用されている場合、この junos.install_config
機能は設定を再適用しません。
デバイスを設定した後、状態をjunos_bgp_verify_peers
適用します。この状態は、デバイスのget-bgp-neighbor-information
ピラーデータで定義された各ピアの値をEstablished
返すpeer-state
まで、各デバイスでRPCを実行します。この状態は、デバイスで BGP が実行されていることを前提としています。
構成
Salt を使用してデバイスを設定するには、このセクションに含まれるタスクを実行します。
柱データを定義する
手順
Jinja2 テンプレートで使用される柱データを定義して BGP 設定を生成するには、
Salt マスターで、 /srv/pillar/bgp/hostname.sls という名前の個別のファイルを管理対象デバイスごとに作成します。
r1.sls ファイルでホスト r1 のデータを定義します。
BGP_data: loopback: 192.168.0.1 local_asn: 64521 neighbors: - interface: ge-0/0/0 name: to-r2 asn: 64522 peer_ip: 198.51.100.2 local_ip: 198.51.100.1 peer_loopback: 192.168.0.2 - interface: ge-0/0/1 name: to-r3 asn: 64523 peer_ip: 198.51.100.6 local_ip: 198.51.100.5 peer_loopback: 192.168.0.3
r2.sls ファイルでホスト r2 のデータを定義します。
BGP_data: loopback: 192.168.0.2 local_asn: 64522 neighbors: - interface: ge-0/0/0 name: to-r1 asn: 64521 peer_ip: 198.51.100.1 local_ip: 198.51.100.2 peer_loopback: 192.168.0.1 - interface: ge-0/0/1 name: to-r3 asn: 64523 peer_ip: 198.51.100.10 local_ip: 198.51.100.9 peer_loopback: 192.168.0.3
r3.sls ファイルでホスト r3 のデータを定義します。
BGP_data: loopback: 192.168.0.3 local_asn: 64523 neighbors: - interface: ge-0/0/0 name: to-r1 asn: 64521 peer_ip: 198.51.100.5 local_ip: 198.51.100.6 peer_loopback: 192.168.0.1 - interface: ge-0/0/1 name: to-r2 asn: 64522 peer_ip: 198.51.100.9 local_ip: 198.51.100.10 peer_loopback: 192.168.0.2
ピラートップファイルで、ピラーファイルを適切なデバイスIDの下にあるBGPデータにマッピングし、デバイスがデータにアクセスできるようにします。
saltuser@salt-master:~$ cat /srv/pillar/top.sls base: 'r1': - r1-proxy - bgp/r1 'r2': - r2-proxy - bgp/r2 'r3': - r3-proxy - bgp/r3
柱データを更新します。
saltuser@salt-master:~$ sudo salt '*' saltutil.refresh_pillar r3: True r1: True r2: True
Jinja2 テンプレートを定義する
手順
BGP 設定の生成に使用する Jinja2 テンプレートを作成するには、
Salt マスターで /srv/salt/configs/junos-config-bgp-template.set という名前のファイルを作成します。
BGP 設定テンプレートをファイルに追加して保存します。
saltuser@salt-master:~$ cat /srv/salt/configs/junos-config-bgp-template.set {% if pillar.BGP_data %} set interfaces lo0 unit 0 family inet address {{ pillar.BGP_data.loopback }}/32 set policy-options policy-statement bgp-ecmp then load-balance per-packet set policy-options policy-statement bgp-in then accept set policy-options policy-statement bgp-out then next-hop self set policy-options policy-statement bgp-out then accept set protocols bgp group underlay type external set protocols bgp group underlay import bgp-in set protocols bgp group underlay export bgp-out set protocols bgp group underlay local-as {{ pillar.BGP_data.local_asn }} set protocols bgp group underlay multipath multiple-as set routing-options router-id {{ pillar.BGP_data.loopback }} set routing-options forwarding-table export bgp-ecmp {% for neighbor in pillar.BGP_data.neighbors %} set interfaces {{ neighbor.interface }} unit 0 description {{ neighbor.name }} set interfaces {{ neighbor.interface }} unit 0 family inet address {{ neighbor.local_ip }}/30 set protocols bgp group underlay neighbor {{ neighbor.peer_ip }} peer-as {{ neighbor.asn }} set protocols lldp interface {{ neighbor.interface }} {% endfor %} {% endif %}
状態の定義
設定状態ファイルを定義する
設定を適用する状態ファイルを定義するには:
Salt マスター上で /srv/salt/junos_bgp_config.sls という名前のファイルを作成します。
機能を使用してテンプレートに
junos.install_config
BGP設定を適用する状態を定義します。saltuser@salt-master:~$ cat /srv/salt/junos_bgp_config.sls Apply BGP configuration: junos.install_config: - name: salt://configs/junos-config-bgp-template.set - comment: Configuring BGP using Salt - diffs_file: /var/log/salt/output/{{ grains['id'] }}_junos_bgp_config_diff - template_vars: True
メモ:テンプレートに、ピラー データ、グレイン データ、関数などの Salt 内部変数のみが含まれている場合、テンプレートを
junos.install_config
レンダリングするために関数を定義template_vars: True
する必要がある場合があります。一番上のファイルで、 junos_bgp_config 状態が適用されるターゲットを定義します。ターゲットは、柱項目が
BGP_data
定義されているすべてのデバイスで構成されています。saltuser@salt-master:~$ cat /srv/salt/top.sls base: BGP_data:*: - match: pillar - junos_bgp_config
BGP検証状態ファイルを定義する
BPGピアが 次の値を持っていることを確認する状態をpeer-state
Established
定義するには:
Salt マスター上で /srv/salt/junos_bgp_verify_peers.sls という名前のファイルを作成します。
関数を使用して RPC を
junos.rpc
実行する状態をget-bgp-neighbor-information
定義し、 の RPC 応答をpeer-state
Established
チェックします。saltuser@salt-master:~$ cat /srv/salt/junos_bgp_verify_peers.sls {% for peer in pillar['BGP_data']['neighbors'] %} validate_bgp_session_state_with_{{ peer['peer_ip'] }}: loop.until: - name: junos.rpc - condition: m_ret['rpc_reply']['bgp-information']['bgp-peer']['peer-state'] == 'Established' - period: 5 - timeout: 20 - m_args: - get-bgp-neighbor-information - m_kwargs: neighbor-address: {{ peer['peer_ip'] }} {% endfor %}
結果
ハイステートを実行すると、ファイル内の top.sls
状態が適切なターゲット デバイスに適用されます。
saltuser@salt-master:~$ sudo salt '*' state.apply r1: ---------- ID: Apply BGP configuration Function: junos.install_config Name: salt://configs/junos-config-bgp-template.set Result: True Comment: Started: 07:07:14.449582 Duration: 3379.914 ms Changes: ---------- message: Successfully loaded and committed! out: True Summary for r1 ------------ Succeeded: 1 (changed=1) Failed: 0 ------------ Total states run: 1 Total run time: 3.380 s r2: ---------- ID: Apply BGP configuration Function: junos.install_config Name: salt://configs/junos-config-bgp-template.set Result: True Comment: Started: 07:07:14.485640 Duration: 3132.677 ms Changes: ---------- message: Successfully loaded and committed! out: True Summary for r2 ------------ Succeeded: 1 (changed=1) Failed: 0 ------------ Total states run: 1 Total run time: 3.133 s r3: ---------- ID: Apply BGP configuration Function: junos.install_config Name: salt://configs/junos-config-bgp-template.set Result: True Comment: Started: 07:07:14.388629 Duration: 3431.723 ms Changes: ---------- message: Successfully loaded and committed! out: True Summary for r3 ------------ Succeeded: 1 (changed=1) Failed: 0 ------------ Total states run: 1 Total run time: 3.432 s
検証
BGP 設定の検証
目的
各ネイバーアドレスに対してBGPセッションが確立されていることを確認します。
アクション
ターゲットデバイスに junos_bgp_verify_peers
状態を適用し、出力を確認します。
saltuser@salt-master:~$ sudo salt '*' state.apply junos_bgp_verify_peers r1: ---------- ID: validate_bgp_session_state_with_198.51.100.2 Function: loop.until Name: junos.rpc Result: True Comment: Condition m_ret['rpc_reply']['bgp-information']['bgp-peer']['peer-state'] == 'Established' was met Started: 07:17:01.825414 Duration: 125.241 ms Changes: ---------- ID: validate_bgp_session_state_with_198.51.100.6 Function: loop.until Name: junos.rpc Result: True Comment: Condition m_ret['rpc_reply']['bgp-information']['bgp-peer']['peer-state'] == 'Established' was met Started: 07:17:01.950786 Duration: 148.944 ms Changes: Summary for r1 ------------ Succeeded: 2 Failed: 0 ------------ Total states run: 2 Total run time: 274.185 ms r3: ---------- ID: validate_bgp_session_state_with_198.51.100.5 Function: loop.until Name: junos.rpc Result: True Comment: Condition m_ret['rpc_reply']['bgp-information']['bgp-peer']['peer-state'] == 'Established' was met Started: 07:17:02.849612 Duration: 99.527 ms Changes: ---------- ID: validate_bgp_session_state_with_198.51.100.9 Function: loop.until Name: junos.rpc Result: True Comment: Condition m_ret['rpc_reply']['bgp-information']['bgp-peer']['peer-state'] == 'Established' was met Started: 07:17:02.949265 Duration: 165.041 ms Changes: Summary for r3 ------------ Succeeded: 2 Failed: 0 ------------ Total states run: 2 Total run time: 264.568 ms r2: ---------- ID: validate_bgp_session_state_with_198.51.100.1 Function: loop.until Name: junos.rpc Result: True Comment: Condition m_ret['rpc_reply']['bgp-information']['bgp-peer']['peer-state'] == 'Established' was met Started: 07:17:02.811094 Duration: 143.335 ms Changes: ---------- ID: validate_bgp_session_state_with_198.51.100.10 Function: loop.until Name: junos.rpc Result: True Comment: Condition m_ret['rpc_reply']['bgp-information']['bgp-peer']['peer-state'] == 'Established' was met Started: 07:17:02.954551 Duration: 170.651 ms Changes: Summary for r2 ------------ Succeeded: 2 Failed: 0 ------------ Total states run: 2 Total run time: 313.986 ms
意味
状態ファイルでは、 が各ピアに peer-state
対して と Established
等しい必要があります。出力は、この条件が各デバイス上のすべてのピアで満たされていることを示しています。または、この機能を junos.cli
使用してデバイスで コマンドを show bgp summary
実行し、出力を確認して、各ネイバーアドレスに対してBGPセッションが確立されていることを確認できます。
トラブルシューティング
設定負荷エラーのトラブルシューティング
問題
Salt マスターは、 ConfigLoadError
構文エラーによりデバイス上の設定の読み込みに失敗したことを示すエラーを生成します。
message: Could not load configuration due to : "ConfigLoadError(severity: error, bad_element: interface1, message: error: syntax error)"
ソリューション
Salt は、Jinja2 テンプレートとそのデバイスに定義されたピラー データを使用して Junos OS 設定をレンダリングします。Jinja2 テンプレートが無効な設定を生成すると、Salt は構文エラーを生成します。このエラーを修正するには、エラー メッセージ内のキーによって bad_element
識別される要素を修正するように Jinja2 テンプレートを更新します。