てくなべ (tekunabe)

ansible / network / automation

[Ansible] Network Resource Module の state: overridden の使い所を考えてみた


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


■ はじめに

Ansible 2.9 から Network Resource Module という新しいタイプのモジュールが続々と追加されています。

config オプションで設定内容を指定し、state というオプションで4種類の操作種別(mergedreplacedoverriddendeleted、今後増えるかも)を指定します。

中でも state: overriddenconfig で指定した設定以外は削除されるという強力な仕様でした。いくつかのイベントでこの件を説明した際に「overridden の使い所は?」という質問を受けました。

overridden は宣言的に指定できるため、パラーメーターシートとの相性が良いのではと私は思います。

この記事では、前回の記事「[Ansible] Junos のスタティックルート設定モジュール junos_static_routes の概要と state オプションの仕様 - てくなべ (tekunabe)」でご紹介した junos_static_routes モジュールを例にして説明します。


■ パラメーターシート と state: overridden の組み合わせた作業の流れ

前提

例えば、パラメーターシート(ここでは都合良くYAMLで表現、一応 Excel的なイメージも載せます)で以下のように、スタティックルートが定義されていて、実機でも同じ設定されているとします。

パラメーターシート

---
config_routes:
  - address_families:
    - afi: 'ipv4'
      routes:
        - dest: 0.0.0.0/0
          next_hop:
            - forward_router_address: 100.123.0.1

f:id:akira6592:20191208222755p:plain:w400
最初の状態

実機状態

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

ルートの追加時

スタティックルートを追加する要件が出てきたとします。このとき、パラーメーターシートにスタティックルートを追加します。

パラメーターシート

---
config_routes:
  - address_families:
    - afi: 'ipv4'
      routes:
        - dest: 0.0.0.0/0
          next_hop:
            - forward_router_address: 100.123.0.1
        - dest: 10.0.1.0/24     # 追加
          next_hop:
            - forward_router_address: 172.16.0.1

f:id:akira6592:20191208222848p:plain:w400
ルートの追加

Playbook

パラメータシート内の config_routes 変数を、junos_static_routes モジュールのconfig オプションに割り当ててるPlaybookを用意します。以降のシナリオでも同様の Playbook を利用します。

---
- hosts: vlabs
  gather_facts: no

  tasks:
    - name: static routes test
      junos_static_routes:
        config: "{{ config_routes }}"  # パラメータシートの内容を利用
        state: overridden

実機状態(Playbook 実行後)

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.1.0/24 next-hop 172.16.0.1

もし仮に、同じパラメータを merged で実行しても同じ結果になります。そのため、このケースでは overridden で何が嬉しいのか、まだ分かりにくいかもしれません。

ルート削除

では、パラメータシートからルートを削除した場合はどうでしょう。このケースでは overridden が活きます。

パラメーターシート

---
config_routes:
  - address_families:
    - afi: 'ipv4'
      routes:
        - dest: 0.0.0.0/0
          next_hop:
            - forward_router_address: 100.123.0.1
        # - dest: 10.0.1.0/24   # わかりやすいようにコメントアウトで削除
        #   next_hop:
        #     - forward_router_address: 172.16.0.1

f:id:akira6592:20191208222912p:plain:w400
ルートの削除

実機状態(Playbook 実行後)

10.0.1.0/24 あてのルートが削除されます。

user@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

もし仮に、merged で実行すると、パラメーターシートから削除した 10.0.1.0/24 あてのルートは削除されずに残ります。マージは足し算のイメージです。

ルート追加・変更・削除

先ほどの状態(デフォルトルートのみ)から、ルートがガラッと変わる(追加・変更・削除)ケースも overridden が活きます。

パラメーターシート

---
config_routes:
  - address_families:
    - afi: 'ipv4'
      routes:
        - dest: 0.0.0.0/0
          next_hop:
            - forward_router_address: 10.0.99.1
        - dest: 172.16.9.0/24
          next_hop:
            - forward_router_address: 172.16.0.254
        - dest: 192.168.9.0/24
          next_hop:
            - forward_router_address: 172.16.0.254

f:id:akira6592:20191208222948p:plain:w400
ガラッと変える

実機状態(Playbook 実行後)

ガラッとルートが変わりました。

jcluser@vMX-addr-0> show configuration routing-options static | display set 
set routing-options static route 0.0.0.0/0 next-hop 10.0.99.1
set routing-options static route 172.16.9.0/24 next-hop 172.16.0.254
set routing-options static route 192.168.9.0/24 next-hop 172.16.0.254

モジュールの内部では、現状の設定されているルート(have)と、config で指定したこうなってほしいルート(want)の差分を求めます。そして、余計なルートは delete コマンドで削除、不足しているルートは set コマンドで追加、といったことをしています。

Playbook やパラメーターシートを定義する側が、このあたりのコマンド生成ロジックを考えなくてもよいのが良いところです。

overridden は宣言的

他の mergedreplaceddeleted は差分、操作を意識するタイプなのに対して、overridden はあるべき状態を宣言的に指定することで、そのとおりの設定状態にしてくれるオプションです。「これはルートを追加するから merged」とか「削除だから deleted」と意識する必要もありません。

仕様を知らないと、強力すぎて危うい一面もあるかもしれませんが、うまく付き合うと便利な気がします。

モジュールの戻り値内の commands に、実際に実行されるコマンドが入って返ってくるので、チェックモードと組み合わせせて、確認しながら試すと良いかもしれません。


■ まとめ

junos_static_routes モジュールを例にして、state: overridden の使い所を考えてみました。

  • overridden は 宣言的に指定できる
  • 削除、追加コマンドの生成ロジックを気にしなくても良い
  • パラメーターシートとの相性がよさそう

参考

www.slideshare.net