cisco.iosxr.iosxr_config モジュールの match に与える4種それぞれのオプションの違いについて

こんにちは。Red Hat にて Ansible Automation Platform のテクニカルサポートをしている呉です。

※暖房が効かなくなってしまい、極寒の家で毛布被って体育座りしながら書いてますので、以下、暖い心で読んでいただけましたら幸いです。;)

今回は、Ansible モジュールの小ネタの一つとして cisco.iosxr.iosxr_config モジュール(https://docs.ansible.com/ansible/latest/collections/cisco/iosxr/iosxr_config_module.html)の match に与える事のできる以下のオプションのそれぞれの違いについて紹介したいと思います。

  • line (default)
  • strict
  • exact
  • none

手始めに、以下はドキュメントに記載されている match の説明文を ChatGPT に翻訳してもらったものになります。

このモジュールに、一連のコマンドを現在のデバイス設定に対してどのように照合するかを指示します。matchがlineに設定されている場合、コマンドは行ごとに照合されます。matchがstrictに設定されている場合、コマンド行は位置に応じて照合されます。matchがexactに設定されている場合、コマンド行は完全に一致していなければなりません。最後に、matchがnoneに設定されている場合、モジュールはソース設定をリモートデバイス上の実行中の設定と比較しようとはしません。

私は正直、こちらを読んでもよく理解できませんでしたので、検証してみました :) 以下にその結果を記載します。

1. line (default) について

こちらは、cisco.iosxr.iosxr_config モジュールの lines に与えられたコンフィグが running-config に存在しているかどうかを確認します。ただし、投入されているコンフィグの順番は考慮しません。あくまで、コンフィグが存在しているかどうかのみを確認します。

※例:

running-config

ipv4 access-list IPv4-ACL
 10 deny tcp any 1.1.1.1 0.0.0.255
 20 permit tcp any 2.2.2.2 0.0.0.255
 30 permit tcp any 3.3.3.3 0.0.0.255
 40 permit tcp any any

例えば、上記のコンフィグに対し以下のプレイブックが渡されても、既にコンフィグが存在するので、iosxr_config モジュールは何もしません。

- name: iosxr_config "line" test
  cisco.iosxr.iosxr_config:
    lines:
    - 20 permit tcp any 2.2.2.2 0.0.0.255 #<--- 順番が入れ替わっている箇所
    - 10 deny tcp any 1.1.1.1 0.0.0.255 #<--- 順番が入れ替わっている箇所
    - 30 permit tcp any 3.3.3.3 0.0.0.255
    - 40 permit tcp any any
    parents: ipv4 access-list IPv4-ACL
    match: line

2. strict について

こちらは、cisco.iosxr.iosxr_config モジュールの lines に与えられたコンフィグが running-config に存在しているかどうかだけでなく、lines に与えられた順番通りに存在しているかどうかまでを確認します。コンフィグが存在していても、設定されているコンフィグの順番に差分がある場合には、lines に与えられた順番通りになるよう変更を試みます。

※例:

running-config

ipv4 access-list IPv4-ACL
 10 deny tcp any 1.1.1.1 0.0.0.255
 20 permit tcp any 2.2.2.2 0.0.0.255
 30 permit tcp any 3.3.3.3 0.0.0.255
 40 permit tcp any any

例えば、上記のコンフィグに対し以下のプレイブックが実行された場合、順番に差分がありますので、iosxr_config モジュールは設定変更を試みます。

- name: iosxr_config "strict" test
  cisco.iosxr.iosxr_config:
    lines:
    - 20 permit tcp any 2.2.2.2 0.0.0.255
    - 10 deny tcp any 1.1.1.1 0.0.0.255
    - 30 permit tcp any 3.3.3.3 0.0.0.255
    - 40 permit tcp any any
    parents: ipv4 access-list IPv4-ACL
    match: strict

3. exact について

exactstrict と非常によく似た機能なのですが、strict との相違点としては、cisco.iosxr.iosxr_config モジュールの lines に与えられたコンフィグと running-config との比較だけでなく、parents に指定されたブロック全体の「行数」まで比較を行う点にあります。

※例:

running-config

interface GigabitEthernet0/0/0/1
 description ansible test hogehoge
 shutdown

例えば、上記のコンフィグを持つインターフェイス(GigabitEthernet0/0/0/1)に以下のプレイブックを実行した場合、何度実行しても"TEST EXACT"タスクの lines に指定した設定が常に適用され、status は changed となります。理由としましては、lines に与えられたコンフィグの合計の行数が 2 行(interface GigabitEthernet0/0/0/1 と description ansible test hogehoge) に対し、現在の running-config が 3 行となるので、差分があると判定し、変更を試みるためです。

サンプル Playbook 1

---
- hosts: example01.com
  gather_facts: false

  tasks:
      - name: TEST EXACT
        cisco.iosxr.iosxr_config:
        lines:
          - description ansible test hogehoge
#          - shutdown
        parents: interface GigabitEthernet0/0/0/1
        match: exact

尚、strict の場合は、lines に指定した各行レベルでの比較のみを行います。 例えば以下のプレイブック(match: strict の箇所以外は サンプル Playbook 1と同じ)を実行しても、lines に指定した description の設定が running-config と一致している場合は、設定の変更は試みられず、プレイブックの実行 status は常に ok となります。これは、ブロック内の行数については比較しないためです。

サンプル Playbook 2

---
- hosts: example01.com
  gather_facts: false

  tasks:
      - name: TEST STRICT
        cisco.iosxr.iosxr_config:
        lines:
        - description ansible test hogehoge
#          - shutdown
        parents: interface GigabitEthernet0/0/0/1
        match: strict

4. none について

こちらは、lines に与えられたコンフィグと running-config の比較を行いません。したがって、lines に与えられたコンフィグが running-config に存在しているかどうかにかかわらず、常に設定を試みます。

以上、ご参考になれば幸いです。 Happy holiday & Automation!

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。