ncclient介紹
ncclient簡(jiǎn)介:
ncclient是一個(gè)用于NETCONF客戶端的Python庫,。它旨在體用一個(gè)直觀的API,,將NETCONF的XML編碼特性映射到Python構(gòu)造和習(xí)語,并使編寫網(wǎng)絡(luò)管理腳本更容易,。
其他主要功能有:
- 支持RFC 4741中定義的所有操作和功能,。
- 管道請(qǐng)求。
- 異步RPC請(qǐng)求,。
- 保持XML的方式,,除非真正需要變更。
- 擴(kuò)展,??梢暂p松添加新的傳輸映射和功能/操作。
Netconf相關(guān)原理,,概念:
netconf學(xué)習(xí)筆記: https://cshihong./2019/12/29/Netconf%E5%8D%8F%E8%AE%AE%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/
ncclient主要使用python實(shí)現(xiàn)了netconf的相關(guān)操作,。
ncclient庫學(xué)習(xí)
manager文件內(nèi)主要功能:
這個(gè)模塊是周圍庫的一個(gè)抽象層,它公開所有的核心功能,。
manager支持的操作:
manager中的操作,,都是映射到ncclient.operations.xxx對(duì)應(yīng)的calss。如下:
manager.OPERATIONS
Out[10]:
{'get': ncclient.operations.retrieve.Get,
'get_config': ncclient.operations.retrieve.GetConfig,
'get_schema': ncclient.operations.retrieve.GetSchema,
'dispatch': ncclient.operations.retrieve.Dispatch,
'edit_config': ncclient.operations.edit.EditConfig,
'copy_config': ncclient.operations.edit.CopyConfig,
'validate': ncclient.operations.edit.Validate,
'commit': ncclient.operations.edit.Commit,
'discard_changes': ncclient.operations.edit.DiscardChanges,
'cancel_commit': ncclient.operations.edit.CancelCommit,
'delete_config': ncclient.operations.edit.DeleteConfig,
'lock': ncclient.operations.lock.Lock,
'unlock': ncclient.operations.lock.Unlock,
'create_subscription': ncclient.operations.subscribe.CreateSubscription,
'close_session': ncclient.operations.session.CloseSession,
'kill_session': ncclient.operations.session.KillSession,
'poweroff_machine': ncclient.operations.flowmon.PoweroffMachine,
'reboot_machine': ncclient.operations.flowmon.RebootMachine}
常見方法:
def make_device_handler(device_params):
創(chuàng)建一個(gè)設(shè)備處理對(duì)象,,該對(duì)象提供設(shè)備的特殊參數(shù)和功能,。它在其ncclient的代碼中多次調(diào)用。
如果device_params 參數(shù)沒有定義,,或者這個(gè)參數(shù)對(duì)應(yīng)的值在參數(shù)字典中不知道,,那么會(huì)返會(huì)一個(gè)默認(rèn)的處理程序。
使用實(shí)例:
manager.make_device_handler({'name':'huawei'})
- Juniper: device_params={‘name’:’junos’}
- Cisco CSR: device_params={‘name’:’csr’}
- Cisco Nexus: device_params={‘name’:’nexus’}
- Huawei: device_params={‘name’:’huawei’}
- H3C: device_params={‘name’:’h3c’}
def connect_ssh(*args, **kws):
初始化一個(gè)連接,,通過:class:Manager over the SSH transport.
通過class:ncclient.transport.SSHSession 實(shí)現(xiàn),。
return Manager(session, device_handler, **manager_params)
def connect_ioproc(*args, **kwds):
調(diào)用ncclient.thransport.third_party。
return Manager(session, device_handler, **manager_params)
def connect(*args, **kwds):
如果host為localhosthe和device_param為junos/local
? return connect_ioproc(*args, **kwds)
否則:
? return connect_ssh(*args, **kwds)
class Manager(object):
將RPC操作的API作為方法公開調(diào)用,。這些方法的返回類型取決于我們是處于異步模式(asynchronous mode)還是同步模式(synchronous mode),。
- asynchronous mode(同步模式下):
同步模式下等待應(yīng)答并返回相應(yīng)的RPCReply對(duì)象。根據(jù)異常引發(fā)模式的不同,,應(yīng)答中的rpc錯(cuò)誤可能會(huì)被引發(fā)為RPCError異常,。
注意:在get()和get_config()操作中,,reply是GetReply 的一個(gè)實(shí)例, 它公開的附加屬性data (as Element )和data_xml (作為string ),,這是這些操作的主要關(guān)注點(diǎn),。
在傳輸層錯(cuò)誤的情況下,,例如意外的會(huì)話關(guān)閉,TransportError 將被觸發(fā),。
有關(guān)預(yù)期的操作行為和其他參數(shù)在:rfc4741中,。
Manager實(shí)例也是上下文管理器,所以你可以這樣使用它:
with manager.connect("host") as m:
# do your stuff
#or like this::
m = manager.connect("host")
try:
# do your stuff
finally:
m.close_session()
def get():
檢索運(yùn)行配置和設(shè)備狀態(tài)信息,。 查詢的是設(shè)備當(dāng)前運(yùn)行的狀態(tài)數(shù)據(jù),,即只能從配置數(shù)據(jù)庫中獲取數(shù)據(jù)。
不需要使用source參數(shù)指定配置數(shù)據(jù)庫,。
操作成功,,Server回復(fù)的元素中含有參數(shù),中封裝了獲取的結(jié)果數(shù)據(jù),。否則在消息中返回,。
def get_config(source, filter=None)
檢索指定配置的全部或部分。
-
source:指定需要查詢的數(shù)據(jù)庫名稱,。有running (正在運(yùn)行的數(shù)據(jù)庫) ,,startup (下次設(shè)備啟動(dòng)配置數(shù)據(jù)庫), candidate (兩階段運(yùn)行數(shù)據(jù)庫,需要commit提交生效)
-
fileter: 過濾器,。過濾器可以采用如下方式:
- A tuple of (type, criteria)
這里的type必須是xpath 或者subtree .
對(duì)于“xpath ,,criteria 應(yīng)該是包含XPath表達(dá)式的字符串。
對(duì)于substree ,,criteria 應(yīng)該是一個(gè)XML字符串或一個(gè)包含標(biāo)準(zhǔn)的元素對(duì)象,。
- element 作為XML 字符串的一個(gè)
Element 對(duì)象。
def edit_config(target, config, default_operation=None, test_option=None, error_option=None):
將指定配置的全部或部分加載到目標(biāo)配置數(shù)據(jù)存儲(chǔ)中,。
-
target:指定要配置的數(shù)據(jù)庫,。
-
config:必須放在元素中, 它可以指定為字符串或Element
-
default_operation: 如果指定,,必須是{ “merge”, “replace”, or “none” } 其中之一,。
-
test_option: { “test_then_set”, “set” } 之一。
-
error_option: { “stop-on-error”, “continue-on-error”, “rollback-on-error” } 之一,。
The “rollback-on-error” error_option :rollback-on-error capability.
def copy_config(source, target):
源配置數(shù)據(jù)庫替換目標(biāo)配置數(shù)據(jù)庫,。如果目標(biāo)配置數(shù)據(jù)庫沒有創(chuàng)建,則直接創(chuàng)建配置數(shù)據(jù)庫,,否則用源配置數(shù)據(jù)庫直接覆蓋目標(biāo)配置數(shù)據(jù)庫,。
- source: 是配置數(shù)據(jù)存儲(chǔ)的名稱,用作包含要復(fù)制的配置子樹的復(fù)制操作或配置元素的源 ,。
- target: 是要用作復(fù)制操作目標(biāo)的配置數(shù)據(jù)存儲(chǔ)的名稱 。
def delete_config(target):
刪除配置數(shù)據(jù)庫,。
- target: target指定要?jiǎng)h除的配置數(shù)據(jù)存儲(chǔ)的名稱或URL
def dispatch(rpc_command, source=None, filter=None):
- rpc_command:指定以純文本或xml元素格式(取決于命令)發(fā)送rpc命令
例如:
dispatch('clear-arp-table')
或者:
xsd_fetch = new_ele('get-xnm-information')
sub_ele(xsd_fetch, 'type').text="xml-schema"
sub_ele(xsd_fetch, 'namespace').text="junos-configuration"
dispatch(xsd_fetch)
def lock(target):
允許客戶端鎖定設(shè)備的配置系統(tǒng),。
def unlock(target):
釋放一個(gè)配置鎖,。
def locked(self, target):
返回一個(gè)上鎖的數(shù)據(jù)庫的上下文件管理器,對(duì)應(yīng)執(zhí)行操作是:
return operations.LockContext(self._session, self._device_handler, target)
target : 是要鎖定的配置數(shù)據(jù)存儲(chǔ)的名稱,,
with m.locked("running"):
# do your stuff
# ... instead of::
m.lock("running")
try:
# do your stuff
finally:
m.unlock("running")
def take_notification(self, block=True, timeout=None)
嘗試從接收的隊(duì)列中檢索一個(gè)通知,如果block為True,,則調(diào)用將等待直到通知收到為止。如果timeout是一個(gè)大于0的數(shù)字,,調(diào)用將等待它超時(shí)前收到通知的時(shí)間
如果在block為False或時(shí)沒有可用的通知超時(shí)后,,將不返回任何值。
return self._session.take_notification(block, timeout)
def close_session():
請(qǐng)求優(yōu)雅地終止NETCONF會(huì)話,,并關(guān)閉傳輸層會(huì)話,。
def kill_session(session_id):
強(qiáng)制去終止一個(gè)NETCONF會(huì)話。
- session_id:要終止會(huì)話的NETCONF會(huì)話標(biāo)識(shí)符,。
def commit(confirmed=False, timeout=None, persist=None):
將數(shù)據(jù)庫配置數(shù)據(jù)提交,,轉(zhuǎn)化為設(shè)備的新當(dāng)運(yùn)行的配置即。取決于:candidate capability ,。
-
timeout: 操作確認(rèn)超時(shí)時(shí)間,,單位是秒,缺省值是600秒,。設(shè)備執(zhí)行操作后,,在確認(rèn)超時(shí)時(shí)間內(nèi),如果沒有執(zhí)行確認(rèn)操作,,則對(duì)數(shù)據(jù)庫中的配置進(jìn)行回滾,,配置數(shù)據(jù)恢復(fù)到執(zhí)行操作之前的狀態(tài),并放棄數(shù)據(jù)庫中的編輯數(shù)據(jù),。
-
persist: 使已確認(rèn)的提交在會(huì)話終止后繼續(xù)執(zhí)行,,并在正在進(jìn)行的已確認(rèn)的提交上設(shè)置token 。
def discard_changes():
將候選配置還原為當(dāng)前正在運(yùn)行的配置,。任何未提交的更改都會(huì)被丟棄,。
def validate(source):
驗(yàn)證指定配置的內(nèi)容。
- source 是要驗(yàn)證的配置數(shù)據(jù)存儲(chǔ)或包含要驗(yàn)證的配置子樹的配置元素的名稱
self._session._server_capabilities
返會(huì)服務(wù)器支持的能力集,。
for i in m._session._server_capabilities:
print(i)
urn:ietf:params:netconf:base:1.0
urn:ietf:params:netconf:base:1.1
urn:ietf:params:netconf:capability:writable-running:1.0
....
self._session._client_capabilities
返會(huì)客戶端支持的能力集,。
for i in m._session._client_capabilities:
print(i)
urn:ietf:params:netconf:base:1.0
urn:ietf:params:netconf:base:1.1
urn:ietf:params:netconf:capability:writable-running:1.0
....
self._session.id
返會(huì)一個(gè)seesion.id 。
self._session.connected
判斷seesion是否已經(jīng)建立,。
raise_mode:
指定哪些錯(cuò)誤引發(fā)RPCError 異常,。有效值是在RaiseMode 中定義的常量。默認(rèn)值是ALL ,。
timeout:
指定同步RPC請(qǐng)求的超時(shí),。
async_mode:
指定操作是異步執(zhí)行的(True)還是同步執(zhí)行的(False)(缺省值)。
capbilities 文件主要功能,;
表示netconf的能力集,。
ncclient.capabilities.schemes(url_uri):
給定一個(gè)具有scheme查詢字符串的URI(即:url capability URI),,將返回一個(gè)受支持的模式列表。
class ncclient.capabilities.Capabilities(capabilities) :
表示NETCONF客戶端或服務(wù)器可用的能力集,。它是由一個(gè)capability URI列表初始化的 ,。
“cap” in caps
可以通過":cap" in caps 判斷一個(gè)能力集是否是客戶端或者服務(wù)器所支持的能力集。cap也能簡(jiǎn)寫,。
除了URI之外,,對(duì)于urn:ietf:params:netconf:capability:name:name:version表示的能力,它們的簡(jiǎn)寫可以用作鍵,。例如,,對(duì)于urn:ietf:params:netconf:capability:candidate:1.0,簡(jiǎn)寫應(yīng)該是:candidate,。如果版本是重要的,,使用:candidate:1.0作為鍵。
iter(caps):
返會(huì)能力集的迭代對(duì)象,。
xml_文件主要功能:
用于創(chuàng)建,、解析和處理XML和ElementTree對(duì)象的方法。
XML異常:
exception ncclient.xml_.XMLError , 基于:ncclient.NCClientError
def to_xml(ele, enconding=“UTF-8”, pretty_print=False):
轉(zhuǎn)換并返回具有指定編碼的ele(Element)的XML,。
def to_ele(x, huge_tree=False):
轉(zhuǎn)換并返回XML文檔x的元素,。
ncclient.xml_.parse_root(raw):
有效地解析原始XML文檔的根元素,返回其限定名和屬性字典的元組,。
ncclient.xml_.validated_element(x, tags=None, attrs=None**)** :
檢查XML文檔或元素的根元素是否滿足提供的條件,。
- tags: (如果指定)是單個(gè)允許的標(biāo)記名或一系列允許的替代項(xiàng)
- attrs: (如果指定)是所需屬性的序列,每個(gè)屬性都可以是多個(gè)允許的替代項(xiàng)的序列
- 如果不滿足要求,,則引發(fā)XMLError,。
transport-傳輸/會(huì)話層:
主要實(shí)現(xiàn)了NETCONF傳輸層連接。
session.py:
class ncclient.transport.Session(capabilities)
傳輸協(xié)議實(shí)現(xiàn)使用的基類,。
def add_listener(listener):
注冊(cè)一個(gè)監(jiān)聽器,,它將收到傳入消息和錯(cuò)誤的通知。
def client_capabilities():
客戶端的能力集,。
def connected():
返回會(huì)話的連接狀態(tài),。
def get_listener_instance(cls):
如果注冊(cè)了指定類型的偵聽器,則返回實(shí)例 ,。
def id():
表示會(huì)話id的字符串,。如果沒有初始化,為None,。
def remove_listener(listener):
注銷一些監(jiān)聽器;如果監(jiān)聽器沒有被注冊(cè),,將被忽略掉。
def server_capabilities():
返回服務(wù)器支持的能力集。
class ncclient.transport.SeesionListener:
會(huì)話監(jiān)聽器的基類,,當(dāng)接收到新的NETCONF消息或發(fā)生錯(cuò)誤時(shí),,會(huì)通知該類。
def callback(root, raw)
收到新的XML文檔時(shí)調(diào)用,。 root參數(shù)允許回調(diào)確定是否要進(jìn)一步處理文
def errback(ex):
發(fā)生錯(cuò)誤時(shí)調(diào)用,。
ssh.py:
是ssh會(huì)話的實(shí)現(xiàn),。
ssh.default_unknow_host_cb(host, fingerprint):
如果未知的主機(jī)回調(diào)發(fā)現(xiàn)可接受的密鑰,則返回True,,否則返回False,。
默認(rèn)返回False,可能導(dǎo)致connet()引發(fā)SSHUnknowHost 異常,。
如果需要以編程方式驗(yàn)證主機(jī)密鑰,,需要供另一個(gè)有效的回調(diào)。
-
host:需要驗(yàn)證的主機(jī)名
-
fingerprint:表示主機(jī)指紋的16進(jìn)制字符串,。用冒號(hào)分隔,。
例如: “4b:69:6c:72:6f:79:20:77:61:73:20:68:65:72:65:21”
class ncclient.transport.SSHSession(device_handler):
實(shí)現(xiàn)通過ssh的netconf會(huì)話連接。
connect(host[, port=830, timeout=None, unknown_host_cb=default_unknown_host_cb, username=None, password=None, key_filename=None, allow_agent=True, look_for_keys=True, ssh_config=None])
通過SSH連接并初始化NETCONF會(huì)話,。首先嘗試公鑰身份驗(yàn)證方法,,然后嘗試密碼身份驗(yàn)證。
若要完全禁用公鑰嘗試身份驗(yàn)證,,設(shè)置 allow_agent和look_for_keys作為False調(diào)用 ,。
- host:要連接的主機(jī)名或者IP地址。
- port:連接的端口,,默認(rèn)830,。有些設(shè)備可能是22。網(wǎng)絡(luò)設(shè)備也能配置自定義端口,。根據(jù)配置情況進(jìn)行指定,。
- timeout:超時(shí)時(shí)間,是socket連接的可選超時(shí),。
- unknow_host_cd: 當(dāng)服務(wù)器主機(jī)密鑰無法識(shí)別時(shí)調(diào)用,。有兩參數(shù)。host,,fingerprint,。
- username: 連接ssh認(rèn)證的用戶名。
- password:ssh用戶密碼,。
- key_filename: 秘鑰文件,。
- allow_agent: 是否啟用SSH代理,。
- host_for_keys: 允許在~/.ssh/id_* 尋找ssh密鑰。
- ssh_config: 對(duì)OpenSSH配置文件解析,,設(shè)置路徑,,例如:
~/.ssh/config
def load_known_hosts(filename=None):
從指定文件中加載主機(jī)密鑰。從而可以多次調(diào)用,。如果未指定文件路徑,,會(huì)使用默認(rèn)位置:~/.ssh/know_hosts and ~/ssh/know_hosts
Errors:
-
exceptionncclient.transport.TransportError
Bases: ncclient.NCClientError
-
exceptionncclient.transport.SessionCloseError(in_buf, out_buf=None)
Bases: ncclient.transport.errors.TransportError
-
exceptionncclient.transport.SSHError
Bases: ncclient.transport.errors.TransportError
-
exceptionncclient.transport.AuthenticationError
Bases: ncclient.transport.errors.TransportError
exception*ncclient.transport.SSHUnknownHostError(host, fingerprint)
Bases: ncclient.transport.errors.SSHError
operations類的主要功能:
該文件夾內(nèi)主要定義了netconf操作的實(shí)現(xiàn)方法。
dir(operations)
Out[3]:
['CancelCommit',
'CloseSession',
'Commit',
'CopyConfig',
'CreateSubscription',
'DeleteConfig',
'DiscardChanges',
'Dispatch',
'EditConfig',
'Get',
'GetConfig',
'GetReply',
'GetSchema',
'KillSession',
'Lock',
'LockContext',
'MissingCapabilityError',
'OperationError',
'PoweroffMachine',
'RPC',
'RPCError',
'RPCReply',
'RaiseMode',
'RebootMachine',
'TimeoutExpiredError',
'Unlock',
'Validate',
'edit',
'errors',
'flowmon',
'lock',
'retrieve',
'rpc',
'session',
'subscribe',
'util']
RPC類:
class RPC是所有操作的基類,,直接對(duì)應(yīng)于rpc請(qǐng)求,。處理發(fā)出請(qǐng)求和接收回復(fù)。
classncclient.operations.RPC(session, device_handler, async=False, timeout=30, raise_mode=0)
- sesssion : 是一個(gè)netconf的Session實(shí)例,。
- device_handler: 設(shè)備廠商標(biāo)識(shí)
- async: 請(qǐng)求是否異步模式,。
- timeout:超時(shí)。
- raise_mode = 0; 引發(fā)異常類型,。
classncclient.operations.RaiseMode Operations類異常類型如下:
定義應(yīng)如何處理RPC指示的錯(cuò)誤,。
- ALL = 2, 不看錯(cuò)誤類型,,總是引發(fā),。
- ERRORS = 1, 僅僅當(dāng)出現(xiàn)一個(gè)真正的錯(cuò)誤類型是才引發(fā),。
- NONE = 0,, 不嘗試去引發(fā)任何類型的rpc-error作為RPCError.
def _assert(capability):
子類可以在發(fā)出RPC請(qǐng)求之前,使用此方法來驗(yàn)證NETCONF服務(wù)器具有的capability, 如果該capablility不可用,,將會(huì)引發(fā)一個(gè)MissingCapabilityError 異常,。
def _request(op):
request 方法的實(shí)現(xiàn),發(fā)送RPC請(qǐng)求和處理回應(yīng),。
request():
操作的子類必須實(shí)現(xiàn)該方法,。通常,將所有請(qǐng)求構(gòu)建成一個(gè)Element元素op,,然后傳遞給_requests(op)去處理,。
RPCReply(raw)類:
表示一個(gè)rpc-reply,僅僅關(guān)注這個(gè)RPC請(qǐng)求操作是否成功。
def ok():
返會(huì)一個(gè)布爾值,表示RPC回復(fù)是否有錯(cuò)誤,。
RPCError(raw, errs=None):
表示rpc-error類型,。基類是ncclient.operations.errors.OperationError.
- info:XML字符串,,或者None,。表示error-info 。
- message:error-message元素的內(nèi)容如果存在或者None,。
- path: error-path元素的內(nèi)容如果存在或者None,。
- severity: error-severity元素的內(nèi)容。
- tag: error-tag元素的內(nèi)容,。
- type: error-type元素的內(nèi)容。
Retrieval檢索操作:
實(shí)現(xiàn)netconf查詢類操作,。操作類的基類都是: ncclient.operations.rpc.RPC
class Get():
class ncclient.operations.Get(session, device_handler, async=False, timeout=30, raise_mode=0)
def requests((self, filter=None, with_defaults=None):
檢索運(yùn)行配置和設(shè)備狀態(tài)信息
- filter: 指定要檢索的配置部分(默認(rèn)檢索整個(gè)配置)
- with_defaults: 定義從配置中檢索默認(rèn)值的顯式方法(參見RFC 6243)
class GetConfig():
class ncclient.operations.GetConfig(session, device_handler, async=False, timeout=30, raise_mode=0)
實(shí)現(xiàn)了request(source, filter=None), 檢索指定配置的全部或部分,。
- source:指定要檢測(cè)的配置數(shù)據(jù)庫。
- filter:過濾,。
class GetReply(raw):
基類是,; ncclient.operations.rpc.RPCReply
將data元素的屬性添加到’ RPCReply ’
- data: 和
data_ele 一樣。
- data_ele: 數(shù)據(jù)元素作為一個(gè)
Element
- data_xml: 數(shù)據(jù)元素作為一個(gè)XML字符串,。
class Dispatch():
classncclient.operations.Dispatch(session, device_handler, async=False, timeout=30, raise_mode=0)
request(rpc_command, source=None, filter=None)
rpc_command: 指定以純文本或xml元素格式(取決于命令).
使用示例:
dispatch('clear-arp-table')
or dispatch element like
xsd_fetch = new_ele('get-xnm-information')
sub_ele(xsd_fetch, 'type').text="xml-schema"
sub_ele(xsd_fetch, 'namespace').text="junos-configuration"
dispatch(xsd_fetch)
EditConfig():
實(shí)現(xiàn)通過netconf對(duì)設(shè)備進(jìn)行配置,。 將指定配置的全部或部分加載到目標(biāo)配置數(shù)據(jù)存儲(chǔ)中。
classncclient.operations.EditConfig(session, device_handler, async=False, timeout=30, raise_mode=0)
request(config, format='xml', target='candidate', default_operation=None, test_option=None, error_option=None)
- target: 正在編輯的配置數(shù)據(jù)存儲(chǔ)的名稱
- config:需要變更的配置,,它必須植根于配置元素,。它可以指定為字符串或Element。
- default_operation: { “merge”, “replace”, or “none” } 三者之一,。
- test_option: { “test_then_set”, “set” } 之一,。
- error_option: { “stop-on-error”, “continue-on-error”, “rollback-on-error” } 之一。
DeleteConfig():
實(shí)現(xiàn)刪除配置的操作,。刪除配置數(shù)據(jù)庫,。
classncclient.operations.DeleteConfig(session, device_handler, async=False, timeout=30, raise_mode=0)
request(target)
CopyConfig():
用另一個(gè)完整配置數(shù)據(jù)存儲(chǔ)的內(nèi)容創(chuàng)建或替換整個(gè)配置數(shù)據(jù)存儲(chǔ)
classncclient.operations.CopyConfig(session, device_handler, async=False, timeout=30, raise_mode=0)
request(source, target)
- source: 是配置數(shù)據(jù)存儲(chǔ)的名稱,用作包含要復(fù)制的配置子樹的復(fù)制操作或配置元素的源
- target; 配置數(shù)據(jù)存儲(chǔ)的名稱是否要用作復(fù)制操作的目標(biāo),。
Validate():
驗(yàn)證指定配置的內(nèi)容,。
classncclient.operations.Validate(session, device_handler, async=False, timeout=30, raise_mode=0)
request(source='candidate')
Commit():
將候選配置提交為設(shè)備的新當(dāng)前配置。取決于: candidate capability.
classncclient.operations.Commit(session, device_handler, async=False, timeout=30, raise_mode=0)
request(confirmed=False, timeout=None, persist=None)
如果在超時(shí)間隔內(nèi)沒有后續(xù)提交,,確認(rèn)提交(即confiremed is True)將被還原,。如果沒有指定超時(shí),則確認(rèn)超時(shí)默認(rèn)為600秒(10分鐘),。
- comfirmed: 是否確認(rèn)提交 ,。
- timeout: 指定確認(rèn)超時(shí)(以秒為單位)
- persit:使已確認(rèn)的提交在會(huì)話終止后繼續(xù)執(zhí)行,并在正在進(jìn)行的已確認(rèn)的提交上設(shè)置token。
DiscardChanges():
將候選配置還原為當(dāng)前正在運(yùn)行的配置,。任何未提交的更改都會(huì)被丟棄,。
classncclient.operations.DiscardChanges(session, device_handler, async=False, timeout=30, raise_mode=0)
request()
Lock():
允許客戶端鎖定設(shè)備的配置系統(tǒng)。
classncclient.operations.Lock(session, device_handler, async=False, timeout=30, raise_mode=0)
request(target='candidate')
Unlock():
釋放一個(gè)配置鎖,,這是以前通過鎖操作獲得的,。
classncclient.operations.Unlock(session, device_handler, async=False, timeout=30, raise_mode=0)
request(target='candidate')
CloseSession():
請(qǐng)求優(yōu)雅地終止NETCONF會(huì)話,并關(guān)閉傳輸,。
classncclient.operations.CloseSession(session, device_handler, async=False, timeout=30, raise_mode=0)
request()
KillSession():
強(qiáng)制終止一個(gè)NETCONF會(huì)話(不是當(dāng)前會(huì)話!)
classncclient.operations.KillSession(session, device_handler, async=False, timeout=30, raise_mode=0)
request(session_id)
使用ncclient獲取設(shè)備配置的python小程序示例
獲取acl 3900配置信息:
import logging
from string import Template
from ncclient import manager
from ncclient import operations
log = logging.getLogger(__name__)
def huawei_connect(host, port, user, password):
return manager.connect(host=host,
port=port,
username=user,
password=password,
hostkey_verify = False,
device_params={'name': 'huawei'},
allow_agent = False,
look_for_keys = False)
def _check_response(rpc_obj, snippet_name):
print("RPCReply for %s is %s" % (snippet_name, rpc_obj.xml))
xml_str = rpc_obj.xml
print(xml_str)
if "<ok/>" in xml_str:
print("%s successful" % snippet_name)
else:
print("Cannot successfully execute: %s" % snippet_name)
def test_edit_config_running(host, port, user, password):
#1.Create a NETCONF session
with huawei_connect(host, port=port, user=user, password=password) as m:
acl = '''
<access-lists xmlns="urn:ietf:params:xml:ns:yang:ietf-acl" xmlns:hw-acl="urn:huawei:params:xml:ns:yang:huawei-acl" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">
<access-list>
<access-control-list-name>3900</access-control-list-name>
</access-list>
</access-lists>
'''
get = m.get_config(source='running', filter = ('subtree', acl))
print(get)
if __name__ == '__main__':
host = 'x.x.x.x'
port = 830
user = 'user'
password = 'password'
test_edit_config_running(host, port, user, password)
程序返會(huì)內(nèi)容:
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="urn:uuid:f6ec534a-0eb1-4aea-a627-de98705cc780">
<data>
<access-lists xmlns="urn:ietf:params:xml:ns:yang:ietf-acl" xmlns:hw-acl="urn:huawei:params:xml:ns:yang:huawei-acl">
<access-list>
<access-control-list-name>3900</access-control-list-name>
<hw-acl:vsys>public</hw-acl:vsys>
<access-list-entries>
<access-list-entry>
<rule-name>5</rule-name>
<matches>
<protocol>0</protocol>
<source-ipv4-network>1.1.1.0/24</source-ipv4-network>
<destination-ipv4-network>1.1.1.2/32</destination-ipv4-network>
</matches>
<actions>
<permit/>
</actions>
</access-list-entry>
</access-list-entries>
</access-list>
</access-lists>
</data>
</rpc-reply>
附加:
華為Netconf開發(fā)指南: https://support.huawei.com/enterprise/zh/doc/EDOC1100109432
華為netconf API : https://support.huawei.com/enterprise/zh/doc/EDOC1100075576
參考資料: https://ncclient./en/latest/#
ncclient源碼: https://github.com/ncclient/ncclient
|