はじめに
Ansible 2.5.0 - 2.5.2 の ios_config
モジュールには、コンフィグが変更されていないにもかかわらず意図せず changed
になってしまうバグがありました。2018/05/18 にリリースされた Ansible 2.5.3 で修正されましたので、簡単な動作確認をします。
バグの詳細
Ansible 2.5.0 - 2.5.2 の ios_config
では、lines
オプションで指定したコンフィグが、すでに入っているかどうかを比較する際に、デフォルトコンフィグも明示的に表示させるる、show running-config all
または、 show running-config full
コマンド(以降 show run all
)の結果を取得していました。
本来は、 defaults: yes
なら show run all
の結果と、 defaults: no
なら show run
の結果と比較するのですが、defaults
オプションが無視され、常にshow run all
の結果と比較する挙動となっていました。
問題(意図せず changed
)になってしまうのは、show run
で表示したときと show run all
で表示したときとで、表記が変わるコマンドを投入しようとした場合です。
例えば、snmp-server community XXXXX RO
というコンフィグを投入すると、
show run
ではsnmp-server community XXXXX RO
show run all
ではsnmp-server community XXXXXv1default RO
のように、コンフィグ表記が異なります。(私の環境調べ)
このため、実際はすでに設定されている snmp-server community XXXXX RO
(show run
上の表記) を ios_config
モジュールで投入しようとする際、 snmp-server community XXXXX RO
が show run all
の結果に含まれない(snmp-server community XXXXXv1default RO
とは一致しない)ため、snmp-server community XXXXX RO
を再度を投入します。
結果としては、コンフィグの実質的な内容には変更ありません。
関連issue/PR
Fix fetching ios default running config by ganeshrn · Pull Request #39475 · ansible/ansible · GitHub
Ansible 2.5.3 CHANGELOG
ansible/CHANGELOG-v2.5.rst at stable-2.5 · ansible/ansible · GitHub
■ バグの再現(Ansible 2.5.2)
Ansible 2.5.2 でバグの再現を試みます。
事前状態確認
ネットワーク機器側の事前状態としては、show run
の結果に snmp-server community XXXXX RO
がすでに含まれる状態です。
csr1# show run | inc snmp-server snmp-server community XXXXX RO
なお、show run all
だと以下のように、以下のような表記になります。
csr1# show run all | inc snmp-server snmp-server community XXXXXv1default RO
Playbook
以下のPlaybookを用意します。
- hosts: ios gather_facts: no tasks: - name: config test ios_config: lines: - snmp-server community XXXXX RO
実行結果
(ansible252) [vagrant@centos7 vagrant]$ ansible-playbook -i inventory ios_test.yml PLAY [ios] ******************************************************************* TASK [config_test] *********************************************************** changed: [10.0.8.232] PLAY RECAP ******************************************************************* 10.0.8.232 : ok=1 changed=1 unreachable=0 failed=0
このように、show run
の結果に snmp-server community XXXXX RO
がすでに含まれているのに changed
となってしまいました。
前述のように、show run
ではなく show run all
の結果と比較してしまうためです。
■ バグ修正の確認(Ansible 2.5.3)
本バグが修正されたことを確認します。
Playbook
以下のPlaybookを用意します。(先ほどの 2.4.2 のときと同じです。)
- hosts: ios gather_facts: no tasks: - name: config test ios_config: lines: - snmp-server community XXXXX RO
実行結果
(ansible253) [vagrant@centos7 vagrant]$ ansible-playbook -i inventory ios_test.yml PLAY [ios] ******************************************************************* TASK [config_test] *********************************************************** ok: [10.0.8.232] PLAY RECAP ******************************************************************* 10.0.8.232 : ok=1 changed=0 unreachable=0 failed=0
今度は changed
になりませんでした。意図通りの結果です。
■ まとめ
ios_config モジュールで意図せず chaneged になってしまうバグの再現と修正確認を行いました。 Ansible 2.5.0 - 2.5.2 をお使いでこのような現象でお困りの場合、2.5.3 へのアップデートを検討してみてはいかがでしょうか。