Как избавиться от номера словаря при динамическом построении

#python #dictionary

Вопрос:

 device_total={}
user_n="Cisco"
pwd= "test"
count=1
for i in range(0,31):
    ip_addr= input('Please enter the device IP address'   ' : ')
    dev_type = input (" Enter device type"   ' : ')
    dsum = {'device type':dev_type,'host':ip_addr,'username':user_n,'password':pwd}
    device_total[i] = dsum
    i 1
    query_user=input('Do you want to add additional devices? (y/n)' )
    if query_user != 'y':
       break
print(device_total)
 

Я пытаюсь динамически создавать несколько словарей на основе пользовательского ввода, который будет использоваться для настройки сетевых устройств с помощью Netmiko, словари построены, но каждый из них пронумерован, что вызывает ошибку строки, когда функции Netmiko пытаются использовать их для входа в систему и внесения изменений в конфигурацию. Пожалуйста, дайте мне знать, если есть способ создать словарь без них. Я хотел бы создать отдельный словарь для каждого устройства, введенного пользователем, а не один с несколькими записями. Спасибо.

См. Пример ниже:

 {0: {'device type': 'cisco', 'host': '1.1.1.1', 'username': 'Cisco', 'password': 'test'}, 1: {'device type': 'Arista', 'host': '2.2.2.2', 'username': 'Cisco', 'password': 'test'}}
 

Комментарии:

1. Я подозреваю, что вам вообще нужен не словарь, а список. Я предлагаю device_total=[] , а затем device_total.append( dsum ) вместо этого device_total[i] = dsum .

2. Спасибо, но мне действительно нужен словарь. Название было неправильным , потому что мой вопрос был неправильным, я пытаюсь разделить словари, как только они вложены. Я искал решение в Интернете, и, похоже, никто никогда не сталкивался с этой проблемой.

3. Поскольку вы не показали нам, как будете использовать эту информацию, мы мало что можем сделать. Обратите внимание, что device_total.values() это вернет все значения без их ключей.

Ответ №1:

 device_total=[]
user_n="Cisco"
pwd= "test"
count=1
for i in range(0,31):
    ip_addr= input('Please enter the device IP address'   ' : ')
    dev_type = input (" Enter device type"   ' : ')
    dsum = {'device type':dev_type,'host':ip_addr,'username':user_n,'password':pwd}
    device_total.append( dsum)
    i 1
    query_user=input('Do you want to add additional devices? (y/n)' )
    if query_user != 'y':
       break
print(device_total)
 

Ответ №2:

Вот решение, которое я придумал для всех, кто может оказаться в такой же ситуации и застрять.

 from getpass import getpass
from netmiko import ConnectHandler
from netmiko import NetmikoAuthenticationException


def user_input():
    """ Getting user credentials """
    usr_n = input("username: ")
    pwd = getpass()
    cred = (usr_n, pwd)

    return cred


def net_devices():
    login_info = user_input()
    username = login_info[0]
    password = login_info[1]

    with open("districts devices.txt") as f:

        net_devices = f.read().splitlines()

    for device in net_devices:
        try:
            netw_devices = {"device_type": 'cisco_ios', 'host': device, 'username': username, 'password': password}
            net_connect = ConnectHandler(**netw_devices)
        except NetmikoAuthenticationException:
            print(f"Unable to login to {device}. Verify you have the right credentials or it is added to ISE.")
            continue

        """ Verifying the access-list has been applied to the device. """

        print('Verifying ACL the is on: '   device)

        verification = net_connect.send_command('show run | b line vty')

        if "access-class" not in verification:
            print("nThe access-class is missing from this device's configuration. Configuring the ACL on: "
                    device)
            acl_cmds = ['service password-encryption', 'ip access-list standard Sample-ONLY',
                        'permit 10.0.0.0 0.255.255.255',
                        ' permit 172.16.0.0 0.0.255.255', 'line vty 0 15', 'transport in ssh',
                        'access-class sample in', 'do write memory']
            commands = net_connect.send_config_set(acl_cmds)
            print(commands)
            


        else:
            print("nNo update necessary.n")

            # print(" nVerifying the ACL is now in place.")
            # re_verification = net_connect.send_command('nshow run | b line vty')
            # print(re_verification)

            net_connect.disconnect()


net_devices()