Cisco представила ZTP в IOS XE 16.5.1 и более поздних версиях, чтобы дать устройству возможность загружать и запускать сценарий Python в гостевой оболочке Linux для выполнения задач обновления программного обеспечения и настройки на устройстве.
Если ваше оборудование (например, 9200L) и/или программное обеспечение не поддерживает ZTP, вы можете использовать альтернативную реализацию автоматической установки.
Первый шаг — проверить, присутствует ли конфигурация запуска, если нет, то второй шаг — выполнить запрос DHCP. Третий шаг — загрузить сценарий, указанный в ответе DHCP. Четвертый и последний шаг — запустить скрипт Python в среде гостевой оболочки. Гостевая оболочка остается включенной после выполнения сценария.
По умолчанию гостевая оболочка имеет доступ к сети через порт управления RP. Когда устройство подключено к сети через порты на передней панели, гостевая оболочка не имеет сетевого подключения. script.py использует команды CLI, такие как copy
и more
для доступа к сети.
script.py имеет следующие встроенные функции:
script.py требует, чтобы пользователь заполнил 4 переменные:
SYSLOG — это строка IP-адреса сервера системного журнала, пустая строка отключает системный журнал.
LOGAPI — это строка с URL-адресом для входа в API. Пустая строка отключает обмен сообщениями о состоянии.
JSON — это строка с URL-адресом объекта DATA в формате JSON, как указано ниже. Пустая строка отключает загрузку данных внешнего устройства.
ДАННЫЕ — это список слов, определяющих данные устройства. Пустой список отключает внутренние данные скрипта. Чтобы указать настройки устройства по умолчанию, опустите ключ с именем stack из одного словаря. Допустимые ключи и значения:
Ключ | Ценить |
---|---|
куча | dict с номером целевого переключателя в качестве ключа и серийным номером в качестве значения |
версия | строка с целевой версией, используемая для определения необходимости обновления |
base_url | строка с базовым URL-адресом для присоединения к URL-адресу установки/конфигурации |
установить | строка с URL-адресом целевой iOS для загрузки |
конфигурация | строка с URL-адресом шаблона конфигурации для загрузки |
заменить | dict с ключами, которые соответствуют заполнителям в шаблоне |
Кли | строка финальных команд IOS или Python, если внутри {{...}} |
сохранять | логическое значение, указывающее на сохранение конфигурации после завершения сценария |
шаблон | строка, содержащая шаблон конфигурации с заполнителями на основе $ |
Настройки по умолчанию наследуются всеми стеками, но настройки стека имеют предпочтение. Например: если версия по умолчанию — 16.6.5, а версия стека — 16.9.2, то используется последняя. Когда переменная DATA заполнена, сценарий, образы и конфигурации IOS XE могут обслуживаться любым HTTP-сервером. Шаблон конфигурации не поддерживает многострочные баннеры, это ограничение ZTP. Выражения Python можно использовать в финальной командной строке cli . Например, чтобы использовать серийный номер в имени файла:
copy run http://10.0.0.1:8080/file/{{ztp['serial']}}.conf
Или приостановить выполнение команды на мгновение:
{{time.sleep(10)}}
Пример конфигурации script.py для автономного использования без приложения с графическим интерфейсом:
SYSLOG = '10.0.0.1'
LOGAPI = ''
JSON = ''
DATA = [{
'version' : '16.6.5' ,
'install' : 'http://10.0.0.1/cat9k_iosxe.16.06.05.SPA.bin' ,
'save' : True ,
'template' : '''hostname $name
ip domain name lab
ip name-server 8.8.8.8
interface range $uplink1 , $uplink2
description uplink'''
}, {
'stack' : { 1 : 'FCW0000D0LR' , 2 : 'FCW0000G0L7' , 3 : 'FOC0000X0DW' },
'subst' : { 'name' : 'switch1' , 'uplink1' : 'Gi1/0/1' , 'uplink2' : 'Gi2/0/1' }
}, {
'stack' : { 1 : 'FCW0000D0LT' },
'subst' : { 'name' : 'switch2' , 'uplink1' : 'Gi1/0/1' , 'uplink2' : 'Gi1/0/2' },
'version' : '16.9.2' ,
'install' : 'http://10.0.0.1/cat9k_iosxe.16.09.02.SPA.bin' ,
'cli' : 'license smart register idtoken ****'
}
]
Вместо ввода данных непосредственно в script.py для ввода данных и обслуживания файлов можно использовать приложение с графическим интерфейсом. Те же ключевые имена списка dicts, который определяет данные устройства, отображаются в приложении с графическим интерфейсом. Пример конфигурации script.py для использования приложения с графическим интерфейсом:
SYSLOG = '10.0.0.1'
LOGAPI = 'http://10.0.0.1:8080/log'
JSON = 'http://10.0.0.1:8080/data'
DATA = []
Приложение с графическим интерфейсом состоит из двух компонентов:
Проще говоря, веб-клиент получает данные инструкций с сервера и сохраняет на сервере новые данные инструкций, введенные пользователем. Затем script.py извлекает данные этой инструкции, выполняет ее и сохраняет выходные данные на сервере:
API REST, предоставляемые app.py :
Вызов | Описание |
---|---|
ПОЛУЧИТЬ /файл/ | используется для обслуживания файлов и подкаталогов, таких как образы или конфигурации IOS XE |
УДАЛИТЬ /файл/ | запрос удаляет указанный файл с диска |
ПОМЕСТИ /файл/ | можно использовать для загрузки файлов с IOS на сервер |
ПОСТ/файл | используется формой клиента AJAX для загрузки файла на сервер |
ПОЛУЧИТЬ/список | сервер отправляет текстовый список JSON всех файлов в каталоге сценария и подкаталогах. |
ПОЛУЧИТЬ/данные | после получения запроса сервер отправляет набор данных в виде текста JSON клиенту/коммутатору. |
ПОСТ/данные | клиент отправляет набор данных в виде текста JSON на сервер, используя метод HTML POST. |
ПОЛУЧИТЬ/CSV | после получения запроса сервер выравнивает набор данных и экспортирует его в виде файла CSV. |
ПОСТ/csv | клиент отправляет файл CSV со сведенным набором данных на сервер для импорта |
ПОЛУЧИТЬ /лог | после получения запроса сервер отправляет записи журнала в виде текста JSON клиенту. |
ПУТ / журнал | используется script.py для отправки выходных данных рабочего процесса ZTP в виде текста JSON на сервер |
app.py проверяет формат данных для каждого вызова API. Сообщения об ошибках из-за неудачных вызовов API отображаются в графическом интерфейсе путем возврата ответа HTTP 500 со строкой сообщения. Файлы и каталоги обслуживаются из текущего рабочего каталога. API списка каталогов возвращает только подкаталоги. Загруженные файлы по умолчанию помещаются в загруженный каталог.
На вкладке «Главная» графический интерфейс отображает все зарегистрированные запуски script.py . Графический интерфейс отображает текстовые поля для каждого значения ключа в списке DATA на вкладке «Настройки». Текстовые поля установки и конфигурации представляют собой раскрывающиеся списки с файлами в подкаталогах. Текстовое поле версии заполняется автоматически, если версию IOS XE можно извлечь из имени файла. Графический интерфейс также поддерживает загрузку нескольких выбранных файлов на вкладке «Файлы»:
Настройте DHCP-сервер для обслуживания диапазона, установив для параметра 67 значение: http://xxxx:8080/file/script.py
, где xxxx — это IP-адрес компьютера, на котором размещен файл app.py. Пример конфигурации на устройстве Cisco:
ip dhcp excluded-address 10.0.0.1
ip dhcp pool ztp_pool
network 10.0.0.0 255.255.255.0
default-router 10.0.0.1
option 67 ascii http://10.0.0.1:8080/file/script.py
Установите Bottle и Waitress с помощью PIP:
pip install bottle waitress
или в Ubuntu следующим образом:
sudo apt-get install python-bottle python-waitress
Поместите app.py , index.html , main.js , style.css и script.py в каталог и запустите серверную часть сервера в Linux следующим образом:
nohup python app.py &
Приложение также можно запустить в Windows. Поддерживаются Python 2.7+ и 3.4+.
В качестве альтернативы приложение также можно использовать в контейнере Docker, выполнив следующие команды:
docker build -t ztp .
docker run --rm -e ZTP_IP=192.168.0.4 -e ZTP_PORT=8080 -p 8080:8080 --name ztp ztp
Скрипт был успешно протестирован на следующих платформах с программным обеспечением версии 16.6.x и выше:
Скрипт был успешно протестирован на следующих платформах с программным обеспечением версии 16.8.x и выше:
Скрипт должен поддерживать следующие платформы с программным обеспечением версии 16.12.x и выше:
Платформы, на которых работает программное обеспечение 16.12.4, имеют известную проблему CSCvw63161, и в качестве обходного пути можно использовать альтернативную реализацию автоматической установки.
Этот сценарий использует апплет EEM для установки программного обеспечения, для которого требуется лицензия DNA Essentials.