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