ВОПРОС: 1 Ценю, кто-то может посоветовать мне дальше. Я хочу подключиться к своему оборудованию с помощью скрипта Python и модуля netmiko. Я получаю данные SSH (файл JSON) через запрос API и использовал эти данные для запуска скрипта. Однако я получаю ошибку ниже. Я надеюсь, что кто-то мог посоветовать и показать мне путь.
Я что-то здесь упускаю, но я не знаю, как это решить. Пожалуйста, поправьте и приведите меня. Благодарю.
Файл json создается как фрагмент ниже;
response = requests.post(url,data=data,headers=headers,verify=False)
dictionary_info = response.json()
with open('devices.json', 'w') as fp:
json.dump(dictionary_info, fp, indent=4, sort_keys=True)
файл devices.json следующим образом;
{
"device": [
{
"login": "test1",
"ip": "10.10.10.1",
"password": "test1",
"device_type": "cisco_ios"
},
{
"login": "test1",
"ip": "10.10.10.2",
"password": "test1",
"device_type": "cisco_ios"
},
{
"login": "test1",
"ip": "10.10.10.3",
"password": "test1",
"device_type": "cisco_ios"
},
{
"login": "test1",
"ip": "10.10.10.4",
"password": "test1",
"device_type": "cisco_ios"
}
],
"status": "SUCCESS"
}
когда я запускаю скрипт ниже (фрагмент), он вернет ошибку ниже
File "devices.py", line 18, in <module>
print('Connecting to device:',device['ip'])
TypeError: string indices must be integers
for device in devices:
try:
print('~' * 79)
print('Connecting to device:',device['ip'])
connection = netmiko.ConnectHandler(**device)
print(connection.send_command('show interface'))
connection.disconnect()
except netmiko_exceptions as e:
print('Failed to ', device['ip'], e)
Я должен иметь возможность запускать скрипт и ssh для каждого устройства на основе данных ssh, предоставленных файлом json. Каким-то образом код необходимо изменить дальше, просто я не знаю как. Пожалуйста, помогите мне. Спасибо
Я редактирую содержимое devices.json..Я удаляю фигурную скобку {}, имя объекта 'device' и 'status' и просто остаюсь в списке [] следующим образом;
[
{
"username": "scnpa",
"ip": "10.10.10.1",
"password": "123",
"device_type": "cisco_ios"
},
{
"username": "scnpa",
"ip": "10.10.10.2",
"password": "123",
"device_type": "cisco_ios"
},
{
"username": "scnpa",
"ip": "10.10.10.3",
"password": "123",
"device_type": "cisco_ios"
},
{
"username": "scnpa",
"ip": "10.10.10.4",
"password": "123",
"device_type": "cisco_ios"
}
]
Сегодня я просто пробую n error... и запускаю скрипт, и он работает.. с использованием редактируемого файла json выше... Я знаю, что это не решение, так как в итоге я получу файл json, которым я поделился ранее (с curly скобки {} и т.д.) или есть способ, я могу получить как в формате выше [{}, {}, {}, {}]? Создайте файл из ответа json api и получите только содержимое {{}, {}. {}, {}]...?
или оставь формат как есть...
Возможно, нужно изменить скрипт Python в части цикла for. Я пытаюсь удалить устройство, и я получаю другую ошибку. Измените "устройство" на другое имя и все равно выдайте мне ошибку "Ошибка типа: строковые индексы должны быть целыми числами ". Без понятия...
for device in devices:
try:
print('~' * 79)
print('Connecting to device:',device['ip'])
connection = netmiko.ConnectHandler(**device)
print(connection.send_command('show interface'))
connection.disconnect()
ВЫПУСК: 2 СОЗДАЮ ОТДЕЛЬНЫЙ ПОСТ
У меня есть еще вопросы относительно чтения ответного файла (строки) json из API. Например, ответ JSON, как следует
{
"status": "SUCCESS",
"device": [
{
"model":"XXXX-A",
"username": "scnpa1",
"ip": "10.10.10.1",
"password": "123",
"device_type": "cisco_ios"
},
{
"model":"XXXX-A",
"username": "scnpa2",
"ip": "10.10.10.2",
"password": "456",
"device_type": "cisco_ios"
}
]
}
Как гарантировать, что только определенные ключи/значения, такие как имя и пароль, способны распечатать и создать файл в виде файла json (списка), который может быть прочитан как входные данные скриптом python. Ожидайте, что это будет так ниже
{
"status": "SUCCESS",
"device": [
{
"username": "scnpa1",
"ip": "10.10.10.1",
"password": "123"
},
{
"username": "scnpa2",
"ip": "10.10.10.2",
"password": "456"
}
]
}
Я использую код ниже, но он создаст файл JSON со всеми параметрами
response = requests.post(url,data=data,headers=headers,verify=False)
dictionary_info = response.json()
with open('devices.json', 'w') as fp:
json.dump(dictionary_info, fp, indent=4, sort_keys=True)
Пожалуйста, посоветуй мне. Спасибо
Вы должны изменить цикл на
for device in devices['mydevice']:
devices
?