はじめに
Cisco IOS 機器に設定コンフィグを流し込む、ios_config
モジュールには、コンフィグの保存(copy running-config startup-config
)する条件を指定する、save_when
をいうオプションがあります。
ここで、modified
を指定すると「running-config と startup-config に差分があるときだけ copy する」という動作になります。
ところが先日、差分がないであろうタイミングでも毎回 changed
になってしまう現象に遭遇しました。always
ではないのに。
その原因を調べました。結果としては、よく見たら差分がありました。
現象
たとえば、以下のようなタスクを実行したときです。
- name: save_when test ios_config: save_when: modified
1回目の実行で、コンフィグ差分があれば changed
(保存した)になるのは納得できるのですが、続いて実行したときも毎回 changed
(保存した)になりました。
TASK [save_when test] ******************************************************************** changed: [rt01]
※この例で、lines
や src
オプションの指定がないことからも分かるに、コンフィグを投入しなくても、コンフィグ保存の動作が起こるとすると changed
になります。そのため「このモジュールに冪等性がなく、毎回コンフィグを投入してるのではないか」という印象になるかもしれませんがそうではありません。lines
や src
オプションが指定され場合は、指定されたコンフィグがすでにあるかないかを事前に調べてから投入の有無を決定します。このあたりは注意点があります。
原因
よく見たら、コンフィグ保存直後にも関わらず、running-config と startup-config に差分がありました。
意味合い的には変わらないでしょうが、証明書情報をコンフィグ内に埋め込んでいるか、NVRAM 内のファイルを参照するかの違いでした。
- running-config
...(略)... crypto pki certificate chain TP-self-signed-1813660109 certificate self-signed 01 30820330 30820218 A0030201 02020101 300D0609 2A864886 F70D0101 05050030 ...(略)...
- startup-config
...(略)... crypto pki certificate chain TP-self-signed-1813660109 certificate self-signed 01 nvram:IOS-Self-Sig#1.cer ...(略)...
コンフィグによっては、他の箇所が原因になることも有り得そうです。
補足
なお、running-configと startup-config は他にも出力が異なる箇所があります。
たとえば、冒頭部分です。
- running-config
rt01#sh running-config Building configuration... Current configuration : 4356 bytes ! ! Last configuration change at 14:19:27 UTC Thu May 28 2020 by ec2-user ! version 16.12 ...(略)...
- startup-config
rt01#sh startup-config Using 2439 out of 33554432 bytes ! ! Last configuration change at 14:05:56 UTC Thu May 28 2020 ! version 16.12 ...(略)...
このあたりは、比較対象外にする文字列として、Ansible 內部で定義されているようです。
他にも、 !
で始まる行も比較前に除外されます。
たとえば、
Building configuration... Current configuration : 4344 bytes ! ! Last configuration change at 14:05:56 UTC Thu May 28 2020 ! version 16.12 service timestamps debug datetime msec ...(略)...
は
version 16.12 service timestamps debug datetime msec ...(略)...
に、予め整形されます。
おわりに
最初は lines
や src
オプションと併用していたときに毎回 chagned
になってしまったため、コンフィグの書き方などに気を取られていました。
今回のようなケースで困る場合は、modified
ではなく changed
を検討すると良さそうです。