【自動化】RESTCONFでCisco機器のコマンド実行・コンフィグ投入・ロールバック

DevNet

RESTCONFサンプルコード

Pythonのurllib3ライブラリを用いたRESTCONFのサンプルコードです。

コンフィグ取得(get_interface_config_xe.py)

import requests
import json

requests.packages.urllib3.disable_warnings()

HOST = '**.**.**.**'
PORT = 443
USER = '*****'
PASS = '*****'

def main():
	url = "https://{h}:{p}/restconf/data/ietf-interfaces:interfaces/interface=Loopback0".format(h=HOST, p=PORT)

	headers={'Content-Type':'application/yang-data+json',
		'Accept':'application/yang-data+json'}

	response = requests.get(url,auth=(USER,PASS),headers=headers,verify=False)

	print(response.text)

if __name__ == '__main__':
	main()

実行結果

$ python3 get_interface_config_xe.py
{
  "ietf-interfaces:interface": {
    "name": "Loopback0",
    "type": "iana-if-type:softwareLoopback",
    "enabled": true,
    "ietf-ip:ipv4": {
      "address": [
        {
          "ip": "1.1.1.1",
          "netmask": "255.255.255.0"
        }
      ]
    },
    "ietf-ip:ipv6": {
    }
  }
}

コンフィグ投入 (add_interface_config_xe.py)

request bodyは、上の既存コンフィグ取得結果をコピペして書き換える方法でいつも書いています。”type”は、LoopbackIFの場合は”iana-if-type:softwareLoopback”、EtherIFの場合は”iana-if-type:ethernetCsmacd”を指定しないとエラーになるようです。

import requests
import json

requests.packages.urllib3.disable_warnings()

HOST = '**.**.**.**'
PORT = 443
USER = '*****'
PASS = '*****'

def main():
	url = "https://{h}:{p}/restconf/data/ietf-interfaces:interfaces/interface=Loopback10".format(h=HOST, p=PORT)

	headers={'Content-Type':'application/yang-data+json',
		'Accept':'application/yang-data+json'}


	body={
		"ietf-interfaces:interface": {
			"name": "Loopback10",
			"type": "iana-if-type:softwareLoopback",
			"ietf-ip:ipv4": {
				"address": [{
					"ip": "5.5.5.5",
					"netmask": "255.255.255.255"
				}]
			}
		}
	     }

	response = requests.put(url,auth=(USER,PASS),headers=headers,data=json.dumps(body),verify=False)

	print(response.text)

if __name__ == '__main__':
	main()

typeの指定を誤っている場合のエラーメッセージ

$ python3 add_interface_config_xe.py
{
  "errors": {
    "error": [
      {
        "error-message": "/if:interfaces/interface{Loopback10}/type: Unsupported - value must be ethernetCsmacd or softwareLoopback",
        "error-path": "/ietf-interfaces:interfaces/interface=Loopback10",
        "error-tag": "malformed-message",
        "error-type": "application"
      }
    ]
  }
}

コンフィグ削除 (delete_interface_config_xe.py)

import requests
import json

requests.packages.urllib3.disable_warnings()

HOST = '**.**.**.**'
PORT = 443
USER = '*****'
PASS = '*****'

def main():
	url = "https://{h}:{p}/restconf/data/ietf-interfaces:interfaces/interface=Loopback10".format(h=HOST, p=PORT)

	headers={'Content-Type':'application/yang-data+json',
		'Accept':'application/yang-data+json'}

	response = requests.delete(url,auth=(USER,PASS),headers=headers,verify=False)

	print(response.text)

if __name__ == '__main__':
	main()

コンフィグ保存 (save_config_xe.py)

IOS-XEではコンフィグの世代管理ができ、 CLIでは”archive config”でコンフィグ保存ができますが、RESTCONFからもコンフィグ保存が可能です。

import requests
import json

requests.packages.urllib3.disable_warnings()

HOST = '**.**.**.**'
PORT = 443
USER = '*****'
PASS = '*****'

def main():
	url = "https://{h}:{p}/restconf/operations/cisco-ia:checkpoint".format(h=HOST, p=PORT)

	headers={'Content-Type':'application/yang-data+json',
		'Accept':'application/yang-data+json'}

	response = requests.post(url,auth=(USER,PASS),headers=headers,verify=False)

	print(response.text)

if __name__ == '__main__':
	main()

実行結果

$ python3 save_config_xe.py
{
  "cisco-ia:output": {
    "result": "Checkpoint successful"
  }
}

config archiveの取得 (get_config_archive_xe.py)

保存されたコンフィグリストを取得するスクリプトです。CLIの場合の”show archive”の結果を取得します。実行結果の”current”に記載されている番号のコンフィグが現在のrunning-configで、”recent”が直近で保存されたコンフィグになります。

import requests
import json

requests.packages.urllib3.disable_warnings()

HOST = '**.**.**.**'
PORT = 443
USER = '*****'
PASS = '*****'

def main():
	url = "https://{h}:{p}/restconf/data/Cisco-IOS-XE-checkpoint-archive-oper:checkpoint-archives".format(h=HOST, p=PORT)

	headers={'Content-Type':'application/yang-data+json',
		'Accept':'application/yang-data+json'}

	response = requests.get(url,auth=(USER,PASS),headers=headers,verify=False)

	print(response.text)

if __name__ == '__main__':
	main()

実行結果

$ python3 get_config_archive_xe.py
{
  "Cisco-IOS-XE-checkpoint-archive-oper:checkpoint-archives": {
    "max": 10,
    "current": 7,
    "recent": "bootflash:myconfig-Jul-30-13-24-23.922-28422",
    "archives": {
      "archive": [
        {
          "number": 1,
          "name": "bootflash:myconfig-Jul-30-13-03-10.211-28413"
        },
        {
          "number": 2,
          "name": "bootflash:myconfig-Jul-30-13-06-10.335-28414"
        },
   --- snip ---
      ]
    }
  }
}

コンフィグロールバック (rollback_config_xe.py)

archive保存されたコンフィグにロールバックするスクリプトです。request bodyの”target-url”にロールバック先のarchive config名を指定します。

import requests
import json

requests.packages.urllib3.disable_warnings()

HOST = '**.**.**.**'
PORT = 443
USER = '*****'
PASS = '*****'

def main():
	url = "https://{h}:{p}/restconf/operations/cisco-ia:rollback".format(h=HOST, p=PORT)

	headers={'Content-Type':'application/yang-data+json',
		'Accept':'application/yang-data+json'}

	body = {
		"cisco-ia:input": {
			"target-url": "bootflash:myconfig-Jul-30-13-39-11.879-28427"
			}
		}


	response = requests.post(url,auth=(USER,PASS),headers=headers,data=json.dumps(body),verify=False)

	print(response.text)

if __name__ == '__main__':
	main()

実行結果

$ python3 rollback_config_xe.py
{
  "cisco-ia:output": {
    "result": "Rollback successful"
  }
}

ネットワーク自動化を基礎から体系的に学びたい方は下記の本がおすすめです。

コメント

タイトルとURLをコピーしました