これは Ansible 3 Advent Calendar 2019 の9日目の記事です。
■ はじめに
Ansible 2.9 から Network Resource Module という新しいタイプのモジュールが続々と追加されています。
config オプションで設定内容を指定し、state というオプションで4種類の操作種別(merged、replaced、overridden、deleted、今後増えるかも)を指定します。
中でも state: overridden は config で指定した設定以外は削除されるという強力な仕様でした。いくつかのイベントでこの件を説明した際に「overridden の使い所は?」という質問を受けました。
overridden は宣言的に指定できるため、パラーメーターシートとの相性が良いのではと私は思います。
この記事では、前回の記事「[Ansible] Junos のスタティックルート設定モジュール junos_static_routes の概要と state オプションの仕様 - てくなべ (tekunabe)」でご紹介した junos_static_routes モジュールを例にして説明します。
- 環境
- Ansible 2.10.0.dev0
- Junos 18.3R1.9 (Juniper vLabs)
■ パラメーターシート と 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

実機状態
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

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

実機状態(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

実機状態(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 は宣言的
他の merged、replaced、deleted は差分、操作を意識するタイプなのに対して、overridden はあるべき状態を宣言的に指定することで、そのとおりの設定状態にしてくれるオプションです。「これはルートを追加するから merged」とか「削除だから deleted」と意識する必要もありません。
仕様を知らないと、強力すぎて危うい一面もあるかもしれませんが、うまく付き合うと便利な気がします。
モジュールの戻り値内の commands に、実際に実行されるコマンドが入って返ってくるので、チェックモードと組み合わせせて、確認しながら試すと良いかもしれません。
■ まとめ
junos_static_routes モジュールを例にして、state: overridden の使い所を考えてみました。
overriddenは 宣言的に指定できる- 削除、追加コマンドの生成ロジックを気にしなくても良い
- パラメーターシートとの相性がよさそう
参考
www.slideshare.net