(2022) netmiko - 2.批量登录交换机(加强版)

在上一節中,已經實現依次登入設備庫中的交換機。如果設備庫的數量少,那等待的時間可以忽略,但如果有50台以上的設備要操作,那就必須要考慮效率問題了。所以,使用到綫程池這個功能,實現同時登入多台設備,同時限制綫程數量,確保操作過程高效且穩定。

以下代碼使用裝飾器和綫程池,請自行查閲相關資料:)

import yaml
from netmiko import ConnectHandler
from netmiko.exceptions import NetmikoTimeoutException, NetmikoAuthenticationException
import time
from concurrent.futures import ThreadPoolExecutor, as_completed

# 裝飾器,用於計算所耗時間
def run_time(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        func(*args, **kwargs)
        print("TIME: ", time.time() - start)
    return wrapper 

# ssh連接交換機進行操作
def ssh_dev(hostname, conn_info):
    cmd_cisco = [
        'show run',
        'show inventory'
    ]
    cmd_huawei = [
        'display cu',
        'display startup'
    ]
    cmd_extreme = [
        'show conf'
    ]
    try:
        with ConnectHandler(**conn_info) as conn:
            # print(f'[{hostname}] connected -> {conn.find_prompt()}')
            cmds= []
            if conn_info['device_type'] == "extreme_exos":
                cmds = cmd_extreme
            elif conn_info['device_type'] == "cisco_ios":
                cmds = cmd_cisco
            elif conn_info['device_type'] == "huawei":
                cmds = cmd_huawei
            for c in cmds:
                output = conn.send_command_timing(c)
                # print(output)
    except NetmikoTimeoutException:
        print(f'ERROR: [{hostname}] connect timeout!')
    except NetmikoAuthenticationException:
        print(f'ERROR: [{hostname}] please check your username & password!')
    return f"[{hostname}] finished."

# 語法糖,對main計算時間
@run_time
def main(devs):
    # max_workers指定綫程數量
    with ThreadPoolExecutor(max_workers=5) as pool:
        futures = [pool.submit(ssh_dev, k, v) for k, v in devs.items()]
    
    # 按列表順序顯示結果
    # for future in futures:
    #     print(future.result())
    
    # 先完成的結果先顯示
    for future in as_completed(futures):
        print(future.result())


if __name__ == '__main__':
    with open('inventory.yml', 'r') as f:
        devs = yaml.safe_load(f)
    
    main(devs)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值