AnsibleのNetwork Resource Moduleが冪等性の確認として利用しているコマンドを探る
Network Resoruce Moduleとは
公式はこちら ⇒ Network Resource Modules — Ansible Community 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のファイルに答えがあるので気になった方は是非ここを探るとよいでしょう。