Cisco는 Linux 게스트 셸에서 Python 스크립트를 다운로드하고 실행하여 장치에서 소프트웨어 업그레이드 및 구성 작업을 수행할 수 있는 기능을 장치에 제공하기 위해 IOS XE 16.5.1에 ZTP를 도입했습니다.
하드웨어(예: 9200L) 및/또는 소프트웨어가 ZTP를 지원하지 않는 경우 대체 AutoInstall 구현을 사용할 수 있습니다.
첫 번째 단계는 시작 구성이 있는지 확인하는 것이고, 그렇지 않은 경우 두 번째 단계는 DHCP 요청을 수행하는 것입니다. 세 번째 단계는 DHCP 응답에 지정된 스크립트를 다운로드하는 것입니다. 네 번째이자 마지막 단계는 게스트 셸 환경에서 Python 스크립트를 실행하는 것입니다. 스크립트가 실행된 후에도 게스트 셸은 활성화된 상태로 유지됩니다.
기본적으로 게스트 셸은 RP 관리 포트를 통해 네트워크에 액세스할 수 있습니다. 장치가 전면 패널 포트를 통해 네트워크에 연결된 경우 게스트 셸에는 네트워크 연결이 없습니다. script.py는 copy
more
의 CLI 명령을 사용하여 네트워크에 액세스합니다.
script.py 에는 다음과 같은 기능이 내장되어 있습니다:
script.py에는 사용자가 입력할 4개의 변수가 필요합니다.
SYSLOG는 syslog 서버의 IP 주소 문자열이며, 빈 문자열은 syslog를 비활성화합니다.
LOGAPI는 API를 기록하기 위한 URL이 포함된 문자열이며, 빈 문자열은 상태 메시지를 비활성화합니다.
JSON은 아래에 지정된 대로 JSON으로 인코딩된 DATA 개체의 URL이 포함된 문자열입니다. 빈 문자열은 외부 장치 데이터 다운로드를 비활성화합니다.
DATA는 장치 데이터를 정의하는 dict 목록입니다. 빈 목록은 스크립트의 내부 데이터를 비활성화합니다. 장치 기본값을 지정하려면 하나의 사전에서 stack 이라는 키를 생략하세요. 유효한 키와 값은 다음과 같습니다.
열쇠 | 값 |
---|---|
스택 | 대상 스위치 번호를 키로, 일련 번호를 값으로 사용하는 dict |
버전 | 업그레이드가 필요한지 확인하는 데 사용되는 대상 버전이 포함된 문자열 |
base_url | 선택적으로 설치/구성 URL과 결합할 기본 URL이 포함된 문자열 |
설치하다 | 다운로드할 대상 IOS의 URL이 포함된 문자열 |
구성 | 다운로드할 구성 템플릿의 URL이 포함된 문자열 |
대체하다 | 템플릿의 자리표시자와 일치하는 키를 사용하여 dict |
CLI | 최종 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)}}
GUI 앱 없이 독립형으로 사용하기 위한 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 에 직접 데이터를 입력하는 대신 GUI 앱을 사용하여 데이터를 입력하고 파일을 제공할 수 있습니다. 장치 데이터를 정의하는 사전 목록의 동일한 키 이름이 GUI 앱에 표시됩니다. GUI 앱 사용을 위한 script.py 구성 예:
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는 해당 명령 데이터를 검색하고 실행한 후 서버에 출력을 저장합니다.
app.py 에서 제공하는 REST API는 다음과 같습니다.
부르다 | 설명 |
---|---|
GET /파일/ | IOS XE 이미지 또는 구성과 같은 파일 및 하위 디렉터리를 제공하는 데 사용됩니다. |
삭제 /파일/ | 요청이 디스크에서 지정된 파일을 제거합니다. |
넣어 /파일/ | IOS에서 서버로 파일을 업로드하는 데 사용할 수 있습니다. |
게시/파일 | AJAX 클라이언트 양식에서 서버에 파일을 업로드하는 데 사용됩니다. |
GET /목록 | 서버는 스크립트 디렉터리와 하위 디렉터리에 있는 모든 파일의 JSON 텍스트 목록을 보냅니다. |
GET /데이터 | 요청을 받으면 서버는 데이터 세트를 JSON 텍스트로 클라이언트/스위치에 보냅니다. |
POST /데이터 | 클라이언트는 HTML POST 메서드를 사용하여 데이터 세트를 JSON 텍스트로 서버에 보냅니다. |
/csv 받기 | 요청을 받으면 서버는 데이터 세트를 평면화하고 이를 CSV 파일로 내보냅니다. |
POST /csv | 클라이언트는 가져오기를 위해 평면화된 데이터세트가 포함된 CSV 파일을 서버로 보냅니다. |
GET /로그 | 요청을 받으면 서버는 로그 항목을 JSON 텍스트로 클라이언트에 보냅니다. |
PUT /로그 | script.py 에서 ZTP 워크플로 출력을 JSON 텍스트로 서버에 보내는 데 사용됩니다. |
app.py는 모든 API 호출에 대한 데이터 형식의 유효성을 검사합니다. 실패한 API 호출로 인한 오류 메시지는 메시지 문자열과 함께 HTTP 500 응답을 반환하여 GUI에 표시됩니다. 파일과 디렉터리는 현재 작업 디렉터리에서 제공됩니다. 디렉터리 목록 API는 하위 디렉터리만 반환합니다. 업로드된 파일은 기본적으로 업로드된 디렉터리에 저장됩니다.
홈 탭의 GUI에는 기록된 script.py 실행이 모두 나열됩니다. GUI는 설정 탭의 사전 데이터 목록에 있는 모든 키 값에 대한 텍스트 상자를 표시합니다. 설치 및 구성 텍스트 상자는 하위 디렉터리의 파일이 포함된 드롭다운 목록입니다. 파일 이름에서 IOS XE 버전을 추출할 수 있는 경우 버전 텍스트 상자가 자동으로 채워집니다. GUI는 파일 탭에서 선택한 여러 파일의 업로드도 지원합니다.
옵션 67이 http://xxxx:8080/file/script.py
로 설정된 범위를 제공하도록 DHCP 서버를 구성합니다. 여기서 xxxx는 app.py를 호스팅하는 시스템의 IP 주소입니다. 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
PIP를 사용하여 병 및 웨이트리스 설치:
pip install bottle waitress
또는 우분투에서는 다음과 같이 합니다:
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이 있으며 대체 AutoInstall 구현을 해결 방법으로 사용할 수 있습니다.
이 스크립트는 DNA Essentials 라이센스가 필요한 소프트웨어 설치를 위해 EEM 애플릿을 사용합니다.