Cisco ได้เปิดตัว ZTP บน IOS XE 16.5.1 เป็นต้นไป เพื่อให้อุปกรณ์สามารถดาวน์โหลดและเรียกใช้สคริปต์ Python ใน Linux Guest Shell เพื่อดำเนินการอัปเกรดซอฟต์แวร์และงานกำหนดค่าบนอุปกรณ์
หากฮาร์ดแวร์ของคุณ (เช่น 9200L) และ/หรือซอฟต์แวร์ไม่รองรับ ZTP คุณสามารถใช้การติดตั้งอัตโนมัติทางเลือกอื่นได้
ขั้นตอนแรกคือการตรวจสอบว่ามีการกำหนดค่าการเริ่มต้นระบบอยู่หรือไม่ หากไม่มี ขั้นตอนที่สองคือดำเนินการร้องขอ DHCP ขั้นตอนที่สามคือการดาวน์โหลดสคริปต์ที่ระบุในการตอบกลับ DHCP ขั้นตอนที่สี่และขั้นตอนสุดท้ายคือการเรียกใช้สคริปต์ Python ในสภาพแวดล้อม Guest Shell Guest Shell ยังคงเปิดใช้งานอยู่หลังจากที่สคริปต์ถูกดำเนินการแล้ว
ตามค่าเริ่มต้น Guest Shell จะสามารถเข้าถึงเครือข่ายผ่านทางพอร์ตการจัดการ RP เมื่ออุปกรณ์เชื่อมต่อกับเครือข่ายผ่านพอร์ตที่แผงด้านหน้า Guest Shell จะไม่มีการเชื่อมต่อเครือข่าย script.py ใช้คำสั่ง CLI เช่น copy
และ more
เพื่อเข้าถึงเครือข่าย
script.py มีฟังก์ชันการทำงานในตัวดังต่อไปนี้:
script.py ต้องการให้ผู้ใช้กรอกตัวแปร 4 ตัว:
SYSLOG คือสตริงที่อยู่ IP ของเซิร์ฟเวอร์ syslog ส่วนสตริงว่างจะปิดใช้งาน syslog
LOGAPI เป็นสตริงที่มี URL สำหรับบันทึก API สตริงว่างจะปิดใช้งานการส่งข้อความสถานะ
JSON คือสตริงที่มี URL ของออบเจ็กต์ DATA ที่เข้ารหัส JSON ตามที่ระบุไว้ด้านล่าง สตริงว่างจะปิดใช้การดาวน์โหลดข้อมูลอุปกรณ์ภายนอก
DATA คือรายการคำสั่งที่กำหนดข้อมูลอุปกรณ์ รายการว่างจะปิดใช้งานข้อมูลภายในของสคริปต์ หากต้องการระบุค่าเริ่มต้นของอุปกรณ์ ให้ละคีย์ที่ชื่อ สแต็ก ออกจาก dict หนึ่งรายการ คีย์และค่าที่ถูกต้องคือ:
สำคัญ | ค่า |
---|---|
สแต็ค | dict โดยมีหมายเลขสวิตช์เป้าหมายเป็นคีย์และหมายเลขซีเรียลเป็นค่า |
รุ่น | สตริงที่มีเวอร์ชันเป้าหมายใช้เพื่อพิจารณาว่าจำเป็นต้องอัปเกรดหรือไม่ |
base_url | สตริงที่มี URL ฐานเพื่อเลือกที่จะเข้าร่วมกับ URL การติดตั้ง/กำหนดค่า |
ติดตั้ง | สตริงพร้อม URL ของ IOS เป้าหมายที่จะดาวน์โหลด |
กำหนดค่า | สตริงที่มี URL ของเทมเพลตการกำหนดค่าที่จะดาวน์โหลด |
ย่อย | เขียนตามคำบอกด้วยปุ่มที่ตรงกับตัวยึดตำแหน่งในเทมเพลต |
คลี | สตริงคำสั่งสุดท้ายของ 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 สำหรับการใช้งานแบบสแตนด์อโลนโดยไม่มีแอป 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 ****'
}
]
แทนที่จะป้อนข้อมูลลงใน script.py โดยตรง คุณสามารถใช้แอป GUI เพื่อป้อนข้อมูลและให้บริการไฟล์ได้ ชื่อคีย์เดียวกันของรายการ dicts ที่กำหนดข้อมูลอุปกรณ์จะแสดงในแอป GUI ตัวอย่างการกำหนดค่า script.py สำหรับการใช้งานแอป GUI:
SYSLOG = '10.0.0.1'
LOGAPI = 'http://10.0.0.1:8080/log'
JSON = 'http://10.0.0.1:8080/data'
DATA = []
แอป GUI ประกอบด้วยสององค์ประกอบ:
พูดง่ายๆ ก็คือ เว็บไคลเอ็นต์ดึงข้อมูลคำสั่งจากเซิร์ฟเวอร์และจัดเก็บข้อมูลคำสั่งใหม่ไว้บนเซิร์ฟเวอร์ที่ผู้ใช้ป้อน จากนั้น script.py จะดึงข้อมูลคำสั่งนั้น ดำเนินการและจัดเก็บเอาต์พุตบนเซิร์ฟเวอร์:
REST API ที่ได้รับจาก app.py คือ:
เรียก | คำอธิบาย |
---|---|
รับ /ไฟล์/ | ใช้เพื่อแสดงไฟล์และไดเรกทอรีย่อย เช่น อิมเมจหรือการกำหนดค่า IOS XE |
ลบ /ไฟล์/ | คำขอจะลบไฟล์ที่ระบุออกจากดิสก์ |
ใส่ /ไฟล์/ | สามารถใช้อัพโหลดไฟล์จาก IOS ไปยังเซิร์ฟเวอร์ได้ |
โพสต์ /ไฟล์ | ใช้โดยแบบฟอร์มไคลเอนต์ AJAX เพื่ออัปโหลดไฟล์ไปยังเซิร์ฟเวอร์ |
รับ /รายการ | เซิร์ฟเวอร์จะส่งรายการข้อความ JSON ของไฟล์ทั้งหมดในไดเร็กทอรีสคริปต์และไดเร็กทอรีย่อย |
รับ/ข้อมูล | เมื่อได้รับคำขอ เซิร์ฟเวอร์จะส่งชุดข้อมูลเป็นข้อความ JSON ไปยังไคลเอนต์/สวิตช์ |
โพสต์/ข้อมูล | ลูกค้าส่งชุดข้อมูลเป็นข้อความ JSON ไปยังเซิร์ฟเวอร์โดยใช้วิธี HTML POST |
รับ /csv | เมื่อได้รับคำขอ เซิร์ฟเวอร์จะขยายชุดข้อมูลและส่งออกเป็นไฟล์ CSV |
โพสต์ /csv | ไคลเอนต์ส่งไฟล์ CSV พร้อมชุดข้อมูลที่เรียบแล้วไปยังเซิร์ฟเวอร์เพื่อนำเข้า |
รับ /log | เมื่อได้รับคำขอ เซิร์ฟเวอร์จะส่งรายการบันทึกเป็นข้อความ JSON ไปยังไคลเอนต์ |
ใส่ /log | ใช้โดย script.py เพื่อส่งเอาต์พุตเวิร์กโฟลว์ ZTP เป็นข้อความ JSON ไปยังเซิร์ฟเวอร์ |
app.py ตรวจสอบรูปแบบของข้อมูลสำหรับการเรียก API ทุกครั้ง ข้อความแสดงข้อผิดพลาดจากการเรียก API ที่ล้มเหลวจะแสดงใน GUI โดยการส่งคืนการตอบสนอง HTTP 500 พร้อมสตริงข้อความ ไฟล์และไดเร็กทอรีจะให้บริการจากไดเร็กทอรีการทำงานปัจจุบัน API รายการไดเร็กทอรีส่งคืนไดเร็กทอรีย่อยเท่านั้น ไฟล์ที่อัพโหลดจะถูกใส่ลงในไดเร็กทอรี ที่อัพโหลด ตามค่าเริ่มต้น
บนแท็บหน้าแรก GUI จะแสดงรายการการเรียกใช้ script.py ที่บันทึกไว้ทั้งหมด GUI จะแสดงกล่องข้อความสำหรับทุกค่าคีย์ในรายการข้อมูลของคำสั่งบนแท็บการตั้งค่า กล่องข้อความ การติดตั้ง และ กำหนดค่า เป็นรายการแบบเลื่อนลงพร้อมไฟล์ในไดเรกทอรีย่อย กล่องข้อความ เวอร์ชัน จะถูกกรอกโดยอัตโนมัติหากสามารถแยกเวอร์ชัน IOS XE ออกจากชื่อไฟล์ได้ GUI ยังรองรับการอัพโหลดไฟล์ที่เลือกหลายไฟล์บนแท็บไฟล์:
กำหนดค่าเซิร์ฟเวอร์ 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 และพนักงานเสิร์ฟโดยใช้ 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