サカトラ

自動化したり統計したり

AnsibleのNetwork Resource Moduleが冪等性の確認として利用しているコマンドを探る

この記事は エーピーコミュニケーションズ 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_facttrueにすると対象の機器情報を収集します。
これはネットワーク機器を対象とした場合はそのネットワーク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.iosplugins/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のファイルに答えがあるので気になった方は是非ここを探るとよいでしょう。