てくなべ (tekunabe)

ansible / network / automation

[Ansible] Junos のスタティックルート設定モジュール junos_static_routes の概要と state オプションの仕様


これは Ansible 3 Advent Calendar 2019 の8日目の記事です。


■ はじめに

開発中の Ansible 2.10 では、Juniper Junos 向けのスタティックルート設定モジュール junos_static_routes モジュール (末尾 s あり)が追加されます。

Ansible 2.9 から続々と追加されている Network Resource Module のひとつです。 既存のjunos_static_route モジュール(末尾 s なし)は、DECRECATED(非推奨)扱いになります。

この記事では、junos_static_routes の概要の説明と、操作種別を示す各 state オプションの検証結果を掲載します。

一言でいうと、便利になります。


■ 環境の準備

開発版 Ansible のインストール

開発版をインストールするには、以下のように devel ブランチを指定して pip isntall します。

$ pip install git+https://github.com/ansible/ansible.git@devel
...(略)...
$ ansible --version
ansible 2.10.0.dev0
...(略)...

必要な Python モジュール のインストール

NETCONF クライアントライブラリの ncclientXML を扱う xmltodict が必要と、公式ドキュメントの Requirementsに書かれているので、インストールします。ncclient と一緒に paramiko もインストールされます。

$ pip install ncclient xmltodict

ここまでで、環境の準備ができました。


junos_static_routes モジュールの基本

junos_static_routes モジュールには、大きくけて、設定の内容を示す config オプションと、その内容をどういう状態にするかを指定する state オプションがあります。

サンプル

- name: Merge provided configuration with device configuration (default operation is merge)
  junos_static_routes:
    config:
      - address_families:
          - afi: 'ipv4'
            routes:
              - dest: 10.200.16.75/24
                next_hop:
                  - forward_router_address: 10.200.16.2
    state: merged

※ 公式ドキュメントの Examples から抜粋

雰囲気で分かる感じですが、config オプション内で更に細かく、宛先やネクストホップの指定します。

state オプション

state オプションは、以下の4種類から1つ選択できます。

state オプションの値 動作
merged config 指定の内容をマージ(デフォルト)
replaced config 指定の内容に置き換え
overridden config 指定の内容でまるごと上書き(結果的にルーティングが削除されることもあり)
deleted config 指定の内容を削除

特に orverriden の動きが個人的にかなり特徴的(強力)だと思っています。

一通り Examples に掲載されていますが、 この記事では少し違うアプローチで独自に検証します。

コネクションプラグインnetconf のみサポート

junos_static_routes モジュールは、コネクションプラグインとして、netconf のみサポートしています。networ_cli には対応していません。

そのため、ansible_connection 変数には netconf を指定して利用します。 あわせて、ncclient などをインストールした python 環境を、ansible_python_interpreter 変数で指定します。

  • 変数定義ファイルの例
ansible_connection: netconf
ansible_network_os: junos
ansible_user: testuser
ansible_password: testpassxxx
ansible_python_interpreter: /Users/ansible/envs/venvs/a210dev/bin/python


state: merged の動作

f:id:akira6592:20191208092001p:plain:w400
merged は足し算

まずは、config 指定の内容をマージする state: merged(デフォルト) を検証します。

事前状態

Playbook 実行前は以下とおり、デフォルトルートが1つある状態です。

jcluser@vMX-addr-0> show configuration routing-options static | display set 
set routing-options static route 0.0.0.0/0 next-hop 100.123.0.1

Playbook 作成

3つのスタティックルートをマージする Playbook を作成します。

- hosts: vlabs
  gather_facts: no

  tasks:
    - name: static routes test
      junos_static_routes:
        config:
          - address_families:
            - afi: 'ipv4'
              routes:
                - dest: 10.0.1.0/24
                  next_hop:
                    - forward_router_address: 192.168.0.1
                - dest: 10.0.2.0/24
                  next_hop:
                    - forward_router_address: 192.168.0.1
                - dest: 10.0.3.0/24
                  next_hop:
                    - forward_router_address: 192.168.0.1
        state: merged    # ポイント

Playbook 実行

Playbook を実行します。

$ ansible-playbook -i ../inventory.ini static_routes.yml 

PLAY [vlabs] ***************************************************************************************************

TASK [static routes test] **************************************************************************************
changed: [vmx]

PLAY RECAP *****************************************************************************************************
vmx                        : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

なお、内部では実際に実行されるコマンドは junos_static_routes モジュールの戻り値の commands で確認できます。

事後状態

以下の通り、スタティックルートが3つ 追加 されました。もともとあったデフォルトルートはそのままです。

jcluser@vMX-addr-0> show configuration routing-options static | display set    
set routing-options static route 0.0.0.0/0 next-hop 100.123.0.1
set routing-options static route 10.0.1.0/24 next-hop 192.168.0.1
set routing-options static route 10.0.2.0/24 next-hop 192.168.0.1
set routing-options static route 10.0.3.0/24 next-hop 192.168.0.1

ここまでで、state: merged で、指定したルートがマージされることが検証できました。


state: replaced の動作

f:id:akira6592:20191208092304p:plain:w400
replaced は特定のエントリの置き換え
次に、config 指定の内容に置き換える state: replaced を検証します。

事前状態

先ほど検証した state: merged の事後状態から始めます。

Playbook 作成

10.0.1.0/24 あてのネクストホップを置き換える Playbook を作成します。

- hosts: vlabs
  gather_facts: no

  tasks:
    - name: static routes test
      junos_static_routes:
        config:
          - address_families:
            - afi: 'ipv4'
              routes:
                - dest: 10.0.1.0/24
                  next_hop:
                    - forward_router_address: 172.16.0.1  # ネクストホップ置き換え
        state: replaced  # ポイント

Playbook 実行

Playbook を実行します。

$ ansible-playbook -i ../inventory.ini static_routes.yml 
...(略)...

事後状態

以下の通り、10.0.1.0/24 あてのネクストホップが置き換わりました。

jcluser@vMX-addr-0> show configuration routing-options static | display set    
set routing-options static route 0.0.0.0/0 next-hop 100.123.0.1
set routing-options static route 10.0.2.0/24 next-hop 192.168.0.1
set routing-options static route 10.0.3.0/24 next-hop 192.168.0.1
set routing-options static route 10.0.1.0/24 next-hop 172.16.0.1

ここまでで、state: replaced で、指定したルートが置き換えされることが検証できました。

なお、同じ config 内容で state: merged にすると、

jcluser@vMX-addr-0> show configuration routing-options static | display set    
set routing-options static route 0.0.0.0/0 next-hop 100.123.0.1
set routing-options static route 10.0.1.0/24 next-hop 192.168.0.1   # 同じNWあて
set routing-options static route 10.0.1.0/24 next-hop 172.16.0.1    # 同じNWあて
set routing-options static route 10.0.2.0/24 next-hop 192.168.0.1
set routing-options static route 10.0.3.0/24 next-hop 192.168.0.1

のように、同じ 10.0.1.0/24 あての別のエントリができます。


state: overridden の動作

f:id:akira6592:20191208092547p:plain:w400
overridden は丸ごと上書き
一番気になっている指定です。

config 指定の内容でまるごと上書きする state: overridden を検証します。

事前状態

先ほど検証した state: replaced の事後状態から始めます。

Playbook 作成

デフォルトルートと、10.0.99.0/24 あてのみにする Playbook を作成します。 指定した2エントリ以外のルーティングは削除されます。

- hosts: vlabs
  gather_facts: no

  tasks:
    - name: static routes test
      junos_static_routes:
        config:
          - address_families:
            - afi: 'ipv4'
              routes:
                - dest: 0.0.0.0/0
                  next_hop:
                    - forward_router_address: 100.123.0.1
                - dest: 10.0.99.0/24
                  next_hop:
                    - forward_router_address: 192.168.99.1
        state: overridden   # ポイント

Playbook 実行

Playbook を実行します。

$ ansible-playbook -i ../inventory.ini static_routes.yml 
...(略)...

事後状態

以下の通り、デフォルトルートと、10.0.99.0/24 あてのみになりました。 指定した2エントリ以外のルーティングは削除されました。

jcluser@vMX-addr-0> show configuration routing-options static | display set    
set routing-options static route 0.0.0.0/0 next-hop 100.123.0.1
set routing-options static route 10.0.99.0/24 next-hop 192.168.99.1

他の指定とは異なり、 config で指定したルーティング以外は削除される 点が、便利でもあり、注意点でもあります。

ここまでで、state: overridden で、指定の内容でまるごと上書きされることが検証できました。


state: deleted の動作

f:id:akira6592:20191208092702p:plain:w400
deleted は特定エントリの削除
最後のオプション、config 指定の内容を削除する state: deleted を検証します。

事前状態

先ほど検証した state: overridden の事後状態から始めます。

Playbook 作成

10.0.1.0/24 あてルートを削除そする Playbook を作成します。

- hosts: vlabs
  gather_facts: no

  tasks:
    - name: static routes test
      junos_static_routes:
        config:
          - address_families:
            - afi: 'ipv4'
              routes:
                - dest: 10.0.99.0/24
                  next_hop:
                    - forward_router_address: 192.168.99.1
        state: deleted   # ポイント

Playbook 実行

Playbook を実行します。

$ ansible-playbook -i ../inventory.ini static_routes.yml 
...(略)...

事後状態

以下の通り、10.0.1.0/24 あてのルートが削除され、デフォルトルートのみになりました。

jcluser@vMX-addr-0> show configuration routing-options static | display set    
set routing-options static route 0.0.0.0/0 next-hop 100.123.0.1

ここまでで、state: deleted で、指定したルートが削除されることが検証できました。


■ まとめ

junos_static_routes モジュールは、以下のような特徴がありました。

  • コマンド(set / delete 〜など)は直接指定しない
  • config オプションに設定パラメータを指定する
  • state オプションの値よって挙動が異なる
  • state: mergedstate: replacedstate: deleted 手続きベースの指定
  • state: overridden は、config で指定したルート以外は削除され、宣言的な指定ができる

なお、Network: 2.10 Roadmapによると、Ansible 2.10 では、以下の *_static_routes モジュールの開発が予定されているようです。

  • vyos_static_routes
  • ios_static_routes
  • iosxr_static_routes
  • junos_static_routes
  • eos_static_routes
  • nxos_static_routes

[2019/12/09 追記] 特に特徴的な挙動だった、overridden については別途使い所を考えた記事をアップしました。

tekunabe.hatenablog.jp