Phương pháp from datetime import datetime import time from itertools import repeat from concurrent.futures import ThreadPoolExecutor import logging import netmiko import yaml logging.getLogger('paramiko').setLevel(logging.WARNING) logging.basicConfig( format = '%(threadName)s %(name)s %(levelname)s: %(message)s', level=logging.INFO) def send_show(device, show): start_msg = '===> {} Connection: {}' received_msg = '<=== {} Received: {}' ip = device['host'] logging.info(start_msg.format(datetime.now().time(), ip)) if ip == '192.168.100.1': time.sleep(5) with netmiko.ConnectHandler(**device) as ssh: ssh.enable() result = ssh.send_command(show) logging.info(received_msg.format(datetime.now().time(), ip)) return result with open('devices.yaml') as f: devices = yaml.safe_load(f) with ThreadPoolExecutor(max_workers=3) as executor: result = executor.map(send_show, devices, repeat('sh clock')) for device, output in zip(devices, result): print(device['host'], output)4 tương tự như chức năng bản đồ tích hợp. áp dụng hàm from datetime import datetime import time from itertools import repeat from concurrent.futures import ThreadPoolExecutor import logging import netmiko import yaml logging.getLogger('paramiko').setLevel(logging.WARNING) logging.basicConfig( format = '%(threadName)s %(name)s %(levelname)s: %(message)s', level=logging.INFO) def send_show(device, show): start_msg = '===> {} Connection: {}' received_msg = '<=== {} Received: {}' ip = device['host'] logging.info(start_msg.format(datetime.now().time(), ip)) if ip == '192.168.100.1': time.sleep(5) with netmiko.ConnectHandler(**device) as ssh: ssh.enable() result = ssh.send_command(show) logging.info(received_msg.format(datetime.now().time(), ip)) return result with open('devices.yaml') as f: devices = yaml.safe_load(f) with ThreadPoolExecutor(max_workers=3) as executor: result = executor.map(send_show, devices, repeat('sh clock')) for device, output in zip(devices, result): print(device['host'], output)0 cho một hoặc nhiều đối tượng có thể lặp lại. Mỗi cuộc gọi đến một chức năng sau đó được bắt đầu trong một luồng/quy trình riêng biệt. Phương thức from datetime import datetime import time from itertools import repeat from concurrent.futures import ThreadPoolExecutor import logging import netmiko import yaml logging.getLogger('paramiko').setLevel(logging.WARNING) logging.basicConfig( format = '%(threadName)s %(name)s %(levelname)s: %(message)s', level=logging.INFO) def send_show(device, show): start_msg = '===> {} Connection: {}' received_msg = '<=== {} Received: {}' ip = device['host'] logging.info(start_msg.format(datetime.now().time(), ip)) if ip == '192.168.100.1': time.sleep(5) with netmiko.ConnectHandler(**device) as ssh: ssh.enable() result = ssh.send_command(show) logging.info(received_msg.format(datetime.now().time(), ip)) return result with open('devices.yaml') as f: devices = yaml.safe_load(f) with ThreadPoolExecutor(max_workers=3) as executor: result = executor.map(send_show, devices, repeat('sh clock')) for device, output in zip(devices, result): print(device['host'], output)4 trả về một trình lặp với kết quả hàm cho từng phần tử của đối tượng được lặp. Các kết quả được sắp xếp theo thứ tự giống như các phần tử trong iterable object Khi làm việc với nhóm luồng/quy trình, một số luồng/quy trình nhất định được tạo và mã được thực thi trong các luồng này. Ví dụ: nếu nhóm được tạo với 5 luồng và chức năng phải được bắt đầu cho 10 thiết bị khác nhau, thì kết nối sẽ được thực hiện trước với năm thiết bị đầu tiên và sau đó, khi chúng được giải phóng, với các thiết bị khác Một ví dụ về việc sử dụng hàm from datetime import datetime import time from itertools import repeat from concurrent.futures import ThreadPoolExecutor import logging import netmiko import yaml logging.getLogger('paramiko').setLevel(logging.WARNING) logging.basicConfig( format = '%(threadName)s %(name)s %(levelname)s: %(message)s', level=logging.INFO) def send_show(device, show): start_msg = '===> {} Connection: {}' received_msg = '<=== {} Received: {}' ip = device['host'] logging.info(start_msg.format(datetime.now().time(), ip)) if ip == '192.168.100.1': time.sleep(5) with netmiko.ConnectHandler(**device) as ssh: ssh.enable() result = ssh.send_command(show) logging.info(received_msg.format(datetime.now().time(), ip)) return result with open('devices.yaml') as f: devices = yaml.safe_load(f) with ThreadPoolExecutor(max_workers=3) as executor: result = executor.map(send_show, devices, repeat('sh clock')) for device, output in zip(devices, result): print(device['host'], output)4 với ThreadPoolExecutor (netmiko_threads_map_basics. tập tin py) from datetime import datetime import time from itertools import repeat from concurrent.futures import ThreadPoolExecutor import logging import netmiko import yaml logging.getLogger('paramiko').setLevel(logging.WARNING) logging.basicConfig( format = '%(threadName)s %(name)s %(levelname)s: %(message)s', level=logging.INFO) def send_show(device, show): start_msg = '===> {} Connection: {}' received_msg = '<=== {} Received: {}' ip = device['host'] logging.info(start_msg.format(datetime.now().time(), ip)) if ip == '192.168.100.1': time.sleep(5) with netmiko.ConnectHandler(**device) as ssh: ssh.enable() result = ssh.send_command(show) logging.info(received_msg.format(datetime.now().time(), ip)) return result with open('devices.yaml') as f: devices = yaml.safe_load(f) with ThreadPoolExecutor(max_workers=3) as executor: result = executor.map(send_show, devices, repeat('sh clock')) for device, output in zip(devices, result): print(device['host'], output) Vì hàm phải được truyền cho phương thức from datetime import datetime import time from itertools import repeat from concurrent.futures import ThreadPoolExecutor import logging import netmiko import yaml logging.getLogger('paramiko').setLevel(logging.WARNING) logging.basicConfig( format = '%(threadName)s %(name)s %(levelname)s: %(message)s', level=logging.INFO) def send_show(device, show): start_msg = '===> {} Connection: {}' received_msg = '<=== {} Received: {}' ip = device['host'] logging.info(start_msg.format(datetime.now().time(), ip)) if ip == '192.168.100.1': time.sleep(5) with netmiko.ConnectHandler(**device) as ssh: ssh.enable() result = ssh.send_command(show) logging.info(received_msg.format(datetime.now().time(), ip)) return result with open('devices.yaml') as f: devices = yaml.safe_load(f) with ThreadPoolExecutor(max_workers=3) as executor: result = executor.map(send_show, devices, repeat('sh clock')) for device, output in zip(devices, result): print(device['host'], output)4, nên hàm from datetime import datetime import time from itertools import repeat from concurrent.futures import ThreadPoolExecutor import logging import netmiko import yaml logging.getLogger('paramiko').setLevel(logging.WARNING) logging.basicConfig( format = '%(threadName)s %(name)s %(levelname)s: %(message)s', level=logging.INFO) def send_show(device, show): start_msg = '===> {} Connection: {}' received_msg = '<=== {} Received: {}' ip = device['host'] logging.info(start_msg.format(datetime.now().time(), ip)) if ip == '192.168.100.1': time.sleep(5) with netmiko.ConnectHandler(**device) as ssh: ssh.enable() result = ssh.send_command(show) logging.info(received_msg.format(datetime.now().time(), ip)) return result with open('devices.yaml') as f: devices = yaml.safe_load(f) with ThreadPoolExecutor(max_workers=3) as executor: result = executor.map(send_show, devices, repeat('sh clock')) for device, output in zip(devices, result): print(device['host'], output)4 được tạo để kết nối với các thiết bị, truyền lệnh hiển thị được chỉ định và trả về kết quả với đầu ra lệnh def send_show(device, show): start_msg = '===> {} Connection: {}' received_msg = '<=== {} Received: {}' ip = device['host'] logging.info(start_msg.format(datetime.now().time(), ip)) if ip == '192.168.100.1': time.sleep(5) with netmiko.ConnectHandler(**device) as ssh: ssh.enable() result = ssh.send_command(show) logging.info(received_msg.format(datetime.now().time(), ip)) return result Hàm from datetime import datetime import time from itertools import repeat from concurrent.futures import ThreadPoolExecutor import logging import netmiko import yaml logging.getLogger('paramiko').setLevel(logging.WARNING) logging.basicConfig( format = '%(threadName)s %(name)s %(levelname)s: %(message)s', level=logging.INFO) def send_show(device, show): start_msg = '===> {} Connection: {}' received_msg = '<=== {} Received: {}' ip = device['host'] logging.info(start_msg.format(datetime.now().time(), ip)) if ip == '192.168.100.1': time.sleep(5) with netmiko.ConnectHandler(**device) as ssh: ssh.enable() result = ssh.send_command(show) logging.info(received_msg.format(datetime.now().time(), ip)) return result with open('devices.yaml') as f: devices = yaml.safe_load(f) with ThreadPoolExecutor(max_workers=3) as executor: result = executor.map(send_show, devices, repeat('sh clock')) for device, output in zip(devices, result): print(device['host'], output)4 xuất log message khi bắt đầu và kết thúc công việc. Điều này sẽ xác định khi chức năng đã hoạt động cho thiết bị cụ thể. Cũng trong chức năng, nó được chỉ định rằng khi kết nối với thiết bị có địa chỉ 192. 168. 100. 1, cần tạm dừng trong 5 giây - do đó bộ định tuyến có địa chỉ này sẽ phản hồi lâu hơn 4 dòng mã cuối cùng chịu trách nhiệm kết nối với các thiết bị trong các luồng riêng biệt with ThreadPoolExecutor(max_workers=3) as executor: result = executor.map(send_show, devices, repeat('sh clock')) for device, output in zip(devices, result): print(device['host'], output)
kết quả thực hiện from datetime import datetime import time from itertools import repeat from concurrent.futures import ThreadPoolExecutor import logging import netmiko import yaml logging.getLogger('paramiko').setLevel(logging.WARNING) logging.basicConfig( format = '%(threadName)s %(name)s %(levelname)s: %(message)s', level=logging.INFO) def send_show(device, show): start_msg = '===> {} Connection: {}' received_msg = '<=== {} Received: {}' ip = device['host'] logging.info(start_msg.format(datetime.now().time(), ip)) if ip == '192.168.100.1': time.sleep(5) with netmiko.ConnectHandler(**device) as ssh: ssh.enable() result = ssh.send_command(show) logging.info(received_msg.format(datetime.now().time(), ip)) return result with open('devices.yaml') as f: devices = yaml.safe_load(f) with ThreadPoolExecutor(max_workers=3) as executor: result = executor.map(send_show, devices, repeat('sh clock')) for device, output in zip(devices, result): print(device['host'], output)3 Ba thông báo đầu tiên cho biết thời điểm kết nối được thực hiện và với thiết bị nào from datetime import datetime import time from itertools import repeat from concurrent.futures import ThreadPoolExecutor import logging import netmiko import yaml logging.getLogger('paramiko').setLevel(logging.WARNING) logging.basicConfig( format = '%(threadName)s %(name)s %(levelname)s: %(message)s', level=logging.INFO) def send_show(device, show): start_msg = '===> {} Connection: {}' received_msg = '<=== {} Received: {}' ip = device['host'] logging.info(start_msg.format(datetime.now().time(), ip)) if ip == '192.168.100.1': time.sleep(5) with netmiko.ConnectHandler(**device) as ssh: ssh.enable() result = ssh.send_command(show) logging.info(received_msg.format(datetime.now().time(), ip)) return result with open('devices.yaml') as f: devices = yaml.safe_load(f) with ThreadPoolExecutor(max_workers=3) as executor: result = executor.map(send_show, devices, repeat('sh clock')) for device, output in zip(devices, result): print(device['host'], output)4 Ba thông báo sau thể hiện thời gian nhận thông tin và hoàn thành chức năng from datetime import datetime import time from itertools import repeat from concurrent.futures import ThreadPoolExecutor import logging import netmiko import yaml logging.getLogger('paramiko').setLevel(logging.WARNING) logging.basicConfig( format = '%(threadName)s %(name)s %(levelname)s: %(message)s', level=logging.INFO) def send_show(device, show): start_msg = '===> {} Connection: {}' received_msg = '<=== {} Received: {}' ip = device['host'] logging.info(start_msg.format(datetime.now().time(), ip)) if ip == '192.168.100.1': time.sleep(5) with netmiko.ConnectHandler(**device) as ssh: ssh.enable() result = ssh.send_command(show) logging.info(received_msg.format(datetime.now().time(), ip)) return result with open('devices.yaml') as f: devices = yaml.safe_load(f) with ThreadPoolExecutor(max_workers=3) as executor: result = executor.map(send_show, devices, repeat('sh clock')) for device, output in zip(devices, result): print(device['host'], output)5 Vì def send_show(device, show): start_msg = '===> {} Connection: {}' received_msg = '<=== {} Received: {}' ip = device['host'] logging.info(start_msg.format(datetime.now().time(), ip)) if ip == '192.168.100.1': time.sleep(5) with netmiko.ConnectHandler(**device) as ssh: ssh.enable() result = ssh.send_command(show) logging.info(received_msg.format(datetime.now().time(), ip)) return result8 đã được thêm cho thiết bị đầu tiên trong 5 giây, thông tin từ bộ định tuyến đầu tiên thực sự được nhận sau đó. Tuy nhiên, vì phương thức from datetime import datetime import time from itertools import repeat from concurrent.futures import ThreadPoolExecutor import logging import netmiko import yaml logging.getLogger('paramiko').setLevel(logging.WARNING) logging.basicConfig( format = '%(threadName)s %(name)s %(levelname)s: %(message)s', level=logging.INFO) def send_show(device, show): start_msg = '===> {} Connection: {}' received_msg = '<=== {} Received: {}' ip = device['host'] logging.info(start_msg.format(datetime.now().time(), ip)) if ip == '192.168.100.1': time.sleep(5) with netmiko.ConnectHandler(**device) as ssh: ssh.enable() result = ssh.send_command(show) logging.info(received_msg.format(datetime.now().time(), ip)) return result with open('devices.yaml') as f: devices = yaml.safe_load(f) with ThreadPoolExecutor(max_workers=3) as executor: result = executor.map(send_show, devices, repeat('sh clock')) for device, output in zip(devices, result): print(device['host'], output)4 trả về các giá trị theo cùng thứ tự như các thiết bị trong danh sách with ThreadPoolExecutor(max_workers=3) as executor: result = executor.map(send_show, devices, repeat('sh clock')) for device, output in zip(devices, result): print(device['host'], output)0, nên kết quả là from datetime import datetime import time from itertools import repeat from concurrent.futures import ThreadPoolExecutor import logging import netmiko import yaml logging.getLogger('paramiko').setLevel(logging.WARNING) logging.basicConfig( format = '%(threadName)s %(name)s %(levelname)s: %(message)s', level=logging.INFO) def send_show(device, show): start_msg = '===> {} Connection: {}' received_msg = '<=== {} Received: {}' ip = device['host'] logging.info(start_msg.format(datetime.now().time(), ip)) if ip == '192.168.100.1': time.sleep(5) with netmiko.ConnectHandler(**device) as ssh: ssh.enable() result = ssh.send_command(show) logging.info(received_msg.format(datetime.now().time(), ip)) return result with open('devices.yaml') as f: devices = yaml.safe_load(f) with ThreadPoolExecutor(max_workers=3) as executor: result = executor.map(send_show, devices, repeat('sh clock')) for device, output in zip(devices, result): print(device['host'], output)8 Xử lý ngoại lệ bản đồ#Ví dụ về from datetime import datetime import time from itertools import repeat from concurrent.futures import ThreadPoolExecutor import logging import netmiko import yaml logging.getLogger('paramiko').setLevel(logging.WARNING) logging.basicConfig( format = '%(threadName)s %(name)s %(levelname)s: %(message)s', level=logging.INFO) def send_show(device, show): start_msg = '===> {} Connection: {}' received_msg = '<=== {} Received: {}' ip = device['host'] logging.info(start_msg.format(datetime.now().time(), ip)) if ip == '192.168.100.1': time.sleep(5) with netmiko.ConnectHandler(**device) as ssh: ssh.enable() result = ssh.send_command(show) logging.info(received_msg.format(datetime.now().time(), ip)) return result with open('devices.yaml') as f: devices = yaml.safe_load(f) with ThreadPoolExecutor(max_workers=3) as executor: result = executor.map(send_show, devices, repeat('sh clock')) for device, output in zip(devices, result): print(device['host'], output)4 với xử lý ngoại lệ from datetime import datetime import time from itertools import repeat from concurrent.futures import ThreadPoolExecutor import logging import netmiko import yaml logging.getLogger('paramiko').setLevel(logging.WARNING) logging.basicConfig( format = '%(threadName)s %(name)s %(levelname)s: %(message)s', level=logging.INFO) def send_show(device, show): start_msg = '===> {} Connection: {}' received_msg = '<=== {} Received: {}' ip = device['host'] logging.info(start_msg.format(datetime.now().time(), ip)) if ip == '192.168.100.1': time.sleep(5) with netmiko.ConnectHandler(**device) as ssh: ssh.enable() result = ssh.send_command(show) logging.info(received_msg.format(datetime.now().time(), ip)) return result with open('devices.yaml') as f: devices = yaml.safe_load(f) with ThreadPoolExecutor(max_workers=3) as executor: result = executor.map(send_show, devices, repeat('sh clock')) for device, output in zip(devices, result): print(device['host'], output)9 Ví dụ nhìn chung tương tự như ví dụ trước nhưng NetMikoAuthenticationException đã được giới thiệu trong hàm from datetime import datetime import time from itertools import repeat from concurrent.futures import ThreadPoolExecutor import logging import netmiko import yaml logging.getLogger('paramiko').setLevel(logging.WARNING) logging.basicConfig( format = '%(threadName)s %(name)s %(levelname)s: %(message)s', level=logging.INFO) def send_show(device, show): start_msg = '===> {} Connection: {}' received_msg = '<=== {} Received: {}' ip = device['host'] logging.info(start_msg.format(datetime.now().time(), ip)) if ip == '192.168.100.1': time.sleep(5) with netmiko.ConnectHandler(**device) as ssh: ssh.enable() result = ssh.send_command(show) logging.info(received_msg.format(datetime.now().time(), ip)) return result with open('devices.yaml') as f: devices = yaml.safe_load(f) with ThreadPoolExecutor(max_workers=3) as executor: result = executor.map(send_show, devices, repeat('sh clock')) for device, output in zip(devices, result): print(device['host'], output)4 và mã bắt đầu hàm from datetime import datetime import time from itertools import repeat from concurrent.futures import ThreadPoolExecutor import logging import netmiko import yaml logging.getLogger('paramiko').setLevel(logging.WARNING) logging.basicConfig( format = '%(threadName)s %(name)s %(levelname)s: %(message)s', level=logging.INFO) def send_show(device, show): start_msg = '===> {} Connection: {}' received_msg = '<=== {} Received: {}' ip = device['host'] logging.info(start_msg.format(datetime.now().time(), ip)) if ip == '192.168.100.1': time.sleep(5) with netmiko.ConnectHandler(**device) as ssh: ssh.enable() result = ssh.send_command(show) logging.info(received_msg.format(datetime.now().time(), ip)) return result with open('devices.yaml') as f: devices = yaml.safe_load(f) with ThreadPoolExecutor(max_workers=3) as executor: result = executor.map(send_show, devices, repeat('sh clock')) for device, output in zip(devices, result): print(device['host'], output)4 trong luồng hiện có trong hàm with ThreadPoolExecutor(max_workers=3) as executor: result = executor.map(send_show, devices, repeat('sh clock')) for device, output in zip(devices, result): print(device['host'], output)4 Khi sử dụng phương pháp from datetime import datetime import time from itertools import repeat from concurrent.futures import ThreadPoolExecutor import logging import netmiko import yaml logging.getLogger('paramiko').setLevel(logging.WARNING) logging.basicConfig( format = '%(threadName)s %(name)s %(levelname)s: %(message)s', level=logging.INFO) def send_show(device, show): start_msg = '===> {} Connection: {}' received_msg = '<=== {} Received: {}' ip = device['host'] logging.info(start_msg.format(datetime.now().time(), ip)) if ip == '192.168.100.1': time.sleep(5) with netmiko.ConnectHandler(**device) as ssh: ssh.enable() result = ssh.send_command(show) logging.info(received_msg.format(datetime.now().time(), ip)) return result with open('devices.yaml') as f: devices = yaml.safe_load(f) with ThreadPoolExecutor(max_workers=3) as executor: result = executor.map(send_show, devices, repeat('sh clock')) for device, output in zip(devices, result): print(device['host'], output)4, việc xử lý ngoại lệ được thực hiện tốt nhất trong một hàm chạy trong luồng, trong trường hợp này là hàm from datetime import datetime import time from itertools import repeat from concurrent.futures import ThreadPoolExecutor import logging import netmiko import yaml logging.getLogger('paramiko').setLevel(logging.WARNING) logging.basicConfig( format = '%(threadName)s %(name)s %(levelname)s: %(message)s', level=logging.INFO) def send_show(device, show): start_msg = '===> {} Connection: {}' received_msg = '<=== {} Received: {}' ip = device['host'] logging.info(start_msg.format(datetime.now().time(), ip)) if ip == '192.168.100.1': time.sleep(5) with netmiko.ConnectHandler(**device) as ssh: ssh.enable() result = ssh.send_command(show) logging.info(received_msg.format(datetime.now().time(), ip)) return result with open('devices.yaml') as f: devices = yaml.safe_load(f) with ThreadPoolExecutor(max_workers=3) as executor: result = executor.map(send_show, devices, repeat('sh clock')) for device, output in zip(devices, result): print(device['host'], output)4 |