てくなべ

ネットワーク、自動化などの技術的なことを書いていきます。

Ansible ios_config モジュールで意図せず chaneged になってしまうバグが 2.5.3 で修正された

はじめに

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 ROshow run all の結果に含まれない(snmp-server community XXXXXv1default ROとは一致しない)ため、snmp-server community XXXXX RO を再度を投入します。 結果としては、コンフィグの実質的な内容には変更ありません。

関連issue/PR

ios_config module: Always "changed" will come out. "server community" and "snmp-server community" · Issue #37550 · ansible/ansible · GitHub

Fetch ios default config is defaults is enabled by ganeshrn · Pull Request #39741 · ansible/ansible · GitHub

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 へのアップデートを検討してみてはいかがでしょうか。