Cisco telah memperkenalkan ZTP pada IOS XE 16.5.1 dan seterusnya untuk memberi perangkat kemampuan mengunduh dan menjalankan skrip Python di Linux Guest Shell untuk melakukan peningkatan perangkat lunak dan tugas konfigurasi pada perangkat.
Jika perangkat keras Anda (misalnya 9200L) dan/atau perangkat lunak tidak mendukung ZTP, Anda dapat menggunakan implementasi AutoInstall alternatif.
Langkah pertama adalah memeriksa apakah ada konfigurasi startup, jika tidak, maka langkah kedua adalah melakukan permintaan DHCP. Langkah ketiga adalah mendownload script balasan yang ditentukan dalam DHCP. Langkah keempat dan terakhir adalah menjalankan skrip Python di lingkungan Guest Shell. Guest Shell tetap diaktifkan setelah skrip dijalankan.
Secara default, Guest Shell memiliki akses ke jaringan melalui port manajemen RP. Ketika perangkat terhubung ke jaringan melalui port panel depan, Guest Shell tidak memiliki koneksi jaringan. script.py menggunakan perintah CLI seperti copy
dan more
untuk mengakses jaringan.
script.py memiliki fungsi bawaan berikut:
script.py membutuhkan 4 variabel untuk diisi oleh pengguna:
SYSLOG adalah string alamat IP dari server syslog, string kosong menonaktifkan syslog
LOGAPI adalah string dengan URL untuk mencatat API, string kosong menonaktifkan pesan status
JSON adalah string dengan URL objek DATA yang dikodekan JSON seperti yang ditentukan di bawah ini. String kosong menonaktifkan pengunduhan data perangkat eksternal.
DATA adalah daftar dicts yang mendefinisikan data perangkat. Daftar kosong menonaktifkan data internal skrip. Untuk menentukan default perangkat, hilangkan kunci bernama tumpukan dari satu dict. Kunci dan nilai yang valid adalah:
Kunci | Nilai |
---|---|
tumpukan | dict dengan nomor sakelar target sebagai kunci dan nomor seri sebagai nilai |
versi | string dengan versi target digunakan untuk menentukan apakah peningkatan diperlukan |
base_url | string dengan URL dasar untuk digabungkan secara opsional dengan URL instal/konfigurasi |
memasang | string dengan URL target IOS untuk diunduh |
konfigurasi | string dengan URL templat konfigurasi untuk diunduh |
pengganti | dict dengan kunci yang cocok dengan placeholder di template |
klik | string perintah akhir IOS, atau Python jika dalam {{...}} |
menyimpan | boolean untuk menunjukkan untuk menyimpan konfigurasi pada penyelesaian skrip |
templat | templat konfigurasi penahan string dengan placeholder berbasis $ |
Pengaturan default diwarisi oleh semua tumpukan, namun pengaturan tumpukan memiliki preferensi. Misalnya: jika versi default adalah 16.6.5 dan versi tumpukan adalah 16.9.2, maka versi tumpukan akan digunakan. Ketika variabel DATA diisi, skrip, gambar IOS XE, dan konfigurasi dapat disajikan oleh server HTTP mana pun. Templat konfigurasi tidak mendukung spanduk multi-baris, ini merupakan batasan ZTP. Ekspresi Python dapat digunakan dalam string perintah cli terakhir. Misalnya untuk menggunakan nomor seri pada nama file:
copy run http://10.0.0.1:8080/file/{{ztp['serial']}}.conf
Atau untuk menghentikan sejenak eksekusi perintah:
{{time.sleep(10)}}
Contoh konfigurasi script.py untuk penggunaan mandiri tanpa aplikasi GUI:
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 ****'
}
]
Daripada memasukkan data langsung ke script.py , aplikasi GUI dapat digunakan untuk memasukkan data dan menyajikan file. Nama kunci yang sama dari daftar dicts yang mendefinisikan data perangkat, ditampilkan di aplikasi GUI. Contoh konfigurasi script.py untuk penggunaan aplikasi GUI:
SYSLOG = '10.0.0.1'
LOGAPI = 'http://10.0.0.1:8080/log'
JSON = 'http://10.0.0.1:8080/data'
DATA = []
Aplikasi GUI terdiri dari dua komponen:
Sederhananya, klien web mengambil data instruksi dari server dan menyimpan data instruksi baru di server yang dimasukkan oleh pengguna. Kemudian script.py mengambil data instruksi tersebut, menjalankannya dan menyimpan hasilnya di server:
REST API yang disediakan oleh app.py adalah:
Panggilan | Keterangan |
---|---|
DAPATKAN /berkas/ | digunakan untuk menyajikan file dan subdirektori, seperti gambar atau konfigurasi IOS XE |
HAPUS /berkas/ | permintaan menghapus file tertentu dari disk |
TEMPATKAN /berkas/ | dapat digunakan untuk mengupload file dari IOS ke server |
POSTING /berkas | digunakan oleh formulir klien AJAX untuk mengunggah file ke server |
DAPATKAN /daftar | server mengirimkan daftar teks JSON dari semua file di direktori skrip dan subdirektori |
DAPATKAN /data | setelah menerima permintaan, server mengirimkan kumpulan data sebagai teks JSON ke klien/switch |
POSTING /data | klien mengirimkan kumpulan data sebagai teks JSON ke server menggunakan metode HTML POST |
DAPATKAN /csv | setelah menerima permintaan, server meratakan kumpulan data dan mengekspornya sebagai file CSV |
POSTING /csv | klien mengirimkan file CSV dengan kumpulan data yang diratakan ke server untuk diimpor |
DAPATKAN /log | setelah menerima permintaan, server mengirimkan entri log sebagai teks JSON ke klien |
PUT /log | digunakan oleh script.py untuk mengirim output alur kerja ZTP sebagai teks JSON ke server |
app.py memvalidasi format data untuk setiap panggilan API. Pesan kesalahan dari panggilan API yang gagal disajikan di GUI dengan mengembalikan respons HTTP 500 dengan string pesan. File dan direktori disajikan dari direktori kerja saat ini. API daftar direktori hanya mengembalikan subdirektori. File yang diunggah dimasukkan ke dalam direktori yang diunggah secara default.
Pada tab Beranda, GUI mencantumkan semua proses log script.py . GUI menampilkan kotak teks untuk setiap nilai kunci dalam daftar dikt DATA pada tab Pengaturan. Kotak teks install dan config adalah daftar drop-down dengan file di subdirektori. Kotak teks versi terisi secara otomatis jika versi IOS XE dapat diekstraksi dari nama file. GUI juga mendukung pengunggahan beberapa file yang dipilih pada tab File:
Konfigurasikan server DHCP untuk melayani rentang dengan opsi 67 diatur ke: http://xxxx:8080/file/script.py
, dengan xxxx adalah alamat IP mesin yang menghosting app.py . Contoh konfigurasi pada perangkat 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
Instal Botol dan Pelayan menggunakan PIP:
pip install bottle waitress
atau di Ubuntu sebagai berikut:
sudo apt-get install python-bottle python-waitress
Letakkan app.py , index.html , main.js , style.css dan script.py dalam direktori dan mulai backend server di Linux sebagai berikut:
nohup python app.py &
Aplikasi ini juga dapat dijalankan di Windows. Python 2.7+ dan 3.4+ didukung.
Sebagai alternatif, aplikasi juga dapat digunakan dalam container Docker dengan menjalankan perintah berikut:
docker build -t ztp .
docker run --rm -e ZTP_IP=192.168.0.4 -e ZTP_PORT=8080 -p 8080:8080 --name ztp ztp
Skrip telah berhasil diuji pada platform berikut yang menjalankan perangkat lunak 16.6.x dan lebih tinggi:
Skrip telah berhasil diuji pada platform berikut yang menjalankan perangkat lunak 16.8.x dan lebih tinggi:
Skrip harus mendukung platform berikut yang menjalankan perangkat lunak 16.12.x dan lebih tinggi:
Platform yang menjalankan perangkat lunak 16.12.4 memiliki masalah umum CSCvw63161 dan Anda dapat menggunakan implementasi AutoInstall alternatif sebagai solusinya.
Skrip ini menggunakan applet EEM untuk instalasi perangkat lunak, yang memerlukan lisensi DNA Essentials.