これは 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 2.10.0.dev0
- Junos 18.3R1.9 (Juniper vLabs)
■ 環境の準備
開発版 Ansible のインストール
開発版をインストールするには、以下のように devel ブランチを指定して pip isntall します。
$ pip install git+https://github.com/ansible/ansible.git@devel ...(略)... $ ansible --version ansible 2.10.0.dev0 ...(略)...
必要な Python モジュール のインストール
NETCONF クライアントライブラリの ncclient、XML を扱う 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 の動作

まずは、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 の動作

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 の動作

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 の動作

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: merged、state: replaced、state: 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 については別途使い所を考えた記事をアップしました。