こんにちは。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 について
exact
は strict
と非常によく似た機能なのですが、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!