項目一覧
例:ソルトを使用してJunos OSを実行するデバイスを設定する
ジュニパーネットワークスは、Salt を使用した Junos OS 対応デバイスの管理をサポートしています。この例では、Salt を使用して Junos OS を実行する複数のデバイスを設定します。
必要条件
この例では、以下のハードウェアとソフトウェアのコンポーネントを使用しています。
Junos OSを実行し、NETCONFを有効にした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 ディレクトリの下にある個別のファイルに保存されます。
[ピラー トップ ファイル(Pillar top file)]:各ピラー ファイルを適切なプロキシ ミニオンにマッピングします。
状態ファイル—ターゲット・デバイスに適用する状態を定義します。この場合、状態ファイルは
junos.install_config
関数を使用して BGP 設定をデバイスに適用します。状態トップファイル—状態ファイルを適用するデバイスに状態ファイルをマッピングします。
この例では、Jinja2 テンプレートを作成して、デバイスに読み込まれてコミットされる BGP 設定を生成します。テンプレートは、デバイス固有の設定データを変数に置き換え、必要に応じて再利用できるようにします。テンプレート ファイルは、Salt マスターの /srv/salt/configs ディレクトリに配置されます。
その後、デバイスごとに個別のピラーファイルを作成し、そのファイルでデバイス固有の設定データを定義します。各ピラー ファイルは、構成テンプレートで参照されるすべての変数パラメーターを含む BGP_data
キーを定義します。ピラー トップ ファイルは、各ピラー ファイルをそれぞれのプロキシ ミニオンにマップします。データをピラーに格納することで、各プロキシ ミニオンがそのデバイスのデータにのみアクセスできるようになります。
junos_bgp_config.sls 状態ファイルは、junos.install_config
関数を使用して BGP 構成をテンプレートに適用する状態を定義します。呼び出されると、この関数は構成データベースをロックし、ターゲット デバイスに固有の構成を読み込み、構成をコミットしてから、データベースのロックを解除します。この関数には、構成の違いをプロキシ ミニオン サーバー上のファイルに格納するための diffs_file
パラメーターが含まれています。ファイル名は、id
グレインを使用して、出力ファイルのデバイス固有のファイル名を生成します。
状態トップ ファイルは、任意の値を持つBGP_data
ピラー キーを持つ任意のミニオンにjunos_bgp_config
状態を適用します。highstateを実行するか、その状態をデバイスに適用すると、Salt はテンプレートとピラー データを使用してターゲットに固有の設定を生成し、junos.install_config
関数を呼び出してデバイス上に設定を読み込んでコミットします。設定がすでに適用されている場合、junos.install_config
機能は設定を再適用しません。
デバイスの設定後、junos_bgp_verify_peers
状態を適用します。この状態は、そのデバイスのピラーデータで定義された各ピアに対してEstablished
のpeer-state
値を返すか、タイムアウトするまで、各デバイスでget-bgp-neighbor-information
RPCを実行します。この状態は、BGP がデバイス上で実行されていることを前提としています。
構成
Salt を使用してデバイスを設定するには、このセクションに含まれるタスクを実行します。
ピラー データの定義
手順
BGP 設定を生成するために Jinja2 テンプレートで使用されるピラー データを定義するには、以下を行います。
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 という名前のファイルを作成します。
関数
junos.rpc
を使用してget-bgp-neighbor-information
RPC を実行し、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 %}
業績
highstateを実行すると、 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 の設定をレンダリングします。Salt は、Jinja2 テンプレートで無効な構成が生成される場合、構文エラーを生成します。このエラーを修正するには、Jinja2 テンプレートを更新して、エラー メッセージの bad_element
キーで識別される要素を修正します。