この記事は エーピーコミュニケーションズ Advent Calendar 2023 の11日目の投稿です。
Network Resoruce Moduleとは
公式はこちら ⇒ Network Resource Modules — Ansible Documentation
端的に言うとネットワーク系のコレクションにおいて~_command
や~_config
ではない、~_interface
や~_ospf
などのより細かい単位での設定を行うモジュールのこと。
今回はその冪等性をいかに確認しているかについてcisco.ios.ios_interfaces
モジュールをベースに探っていきます。
冪等性について
大体のconfigモジュール
Configの文字列のダイジェストを比較しています。
cisco.ios.ios_config
モジュールより抜粋
running_config = NetworkConfig(indent=1, contents=output[0], ignore_lines=diff_ignore_lines) startup_config = NetworkConfig(indent=1, contents=output[1], ignore_lines=diff_ignore_lines) if running_config.sha1 != startup_config.sha1: save_config(module, result)
Resource Module
Factを作ってそれを比較しています。
Fact
Ansibleはgather_fact
をtrue
にすると対象の機器情報を収集します。
これはネットワーク機器を対象とした場合はそのネットワークOSに合わせたFactsが収集されます。
例えば下記のような形
"GigabitEthernet1": { "bandwidth": 1000000, "description": null, "duplex": "Full", "ipv4": { "address": "192.168.1.1", "masklen": 24 }, "lineprotocol": "up ", "macaddress": "", "mediatype": "RJ45", "mtu": 1500, "operstatus": "up", "type": "CSR vNIC" },
ConfigとPlaybookに記載された内容をこのFactの形に起こして、それらを対合することで冪等性を担保しています。
ではそのFactはどのように集めているのか、それは当然ですがResource Moduleごとに異なります。
cisco.ios.ios_interfaces
の場合はcisco.ios
のplugins/module_utils/network/ios/facts/interfaces/interfaces.py
に答えがあります。
plugins/module_utils/network/ios/facts/interfaces/interfaces.py から一部抜粋
class InterfacesFacts(object): """The ios interfaces facts class""" def __init__(self, module): self._module = module self.argument_spec = InterfacesArgs.argument_spec def get_interfaces_data(self, connection): return connection.get("show running-config | section ^interface") def populate_facts(self, connection, ansible_facts, data=None): """Populate the facts for Interfaces network resource :param connection: the device connection :param ansible_facts: Facts dictionary :param data: previously collected conf :rtype: dictionary :returns: facts """ if not data: data = self.get_interfaces_data(connection)
ここではget_interfaces_data
にてshow running-config | section ^interface
をコマンド実行していることがわかります。
まとめ
ということで、cisco.ios.ios_interfaces
では冪等性の確認としてshow running-config | section ^interface
のコマンドを使用していることがわかりました。
その他のResource Moduleもだいたいはmodule_utils/network/<network_os>/facts/<module_name>/<module_name>.py
のファイルに答えがあるので気になった方は是非ここを探るとよいでしょう。