Czy możemy uruchomić Cisco ISE i dokonać wstępnej konfiguracji bez dostępu do konsoli? Tak, służy do tego ZTP. Mechanizm Zero Touch Provisioning na Cisco ISE pozwala na przekazanie podstawowych parametrów konfiguracyjnych do nowej maszyny wirtualnej oraz uruchomienie podstawowych usług. Dzięki temu dostęp do konsoli za pomocą hypervisora nie jest wymagany.
Spis treści
- Część I: Opis projektu
- Część II: Przygotowanie środowiska Jenkins i Ansible
- Część III: Sprawdzamy datę ostatniego backupu
- Część IV: Sprawdzamy ważność licencji trial na Cisco ISE
- Część V: Zatrzymujemy ISE i wyłączamy maszynę wirtualną
- Część VI: Zero Touch Provisioning
- Część VII: Odtworzenie konfiguracji z kopii zapasowej
Zero-Touch Provisioning (ZTP) nie tylko w Cisco ISE
Zero-Touch Provisioning (ZTP) nie tylko w Cisco ISE
Zero Touch Provisioning (ZTP) w kontekście Cisco Identity Services Engine (ISE) 3.2 jest interesującą funkcją. Pamiętajmy jednak, że nie jest to mechanizm charakterystyczny tylko dla tego produktu. Ten mechanizm znacząco upraszcza proces wdrażania urządzeń sieciowych, zwłaszcza w środowiskach, gdzie konieczne jest skonfigurowanie dużej liczby urządzeń z minimalną interwencją ręczną.
W swojej istocie, ZTP w Cisco ISE 3.2 automatyzuje początkowe wdrożenie urządzeń sieciowych. Tworząc nową maszynę wirtualną z Cisco ISE, niezależnie czy będzie to wdrożenie z ISO czy z OVA, możemy od razu przekazać szereg podstawowych parametrów konfiguracyjnych, a nawet wskazać, które usługi mają zostać uruchomione. Dzięki temu otrzymujemy od razy prekonfigurowaną maszynę wirtualną, do której możemy na przykład mieć dostęp po API, bez konieczności wcześniejszego logowania się do GUI, zmiany hasła i włączania usługi API. Hasło użytkownika “admin” także zakodujemy w obrazie ZTP. Możemy też już na tym etapie wskazać dodatkowe patche, które mają zostać zainstalowane.
Mechanizm ten ma oczywiście ograniczenia. Nie skonfigurujemy wszystkich parametrów, nie wgramy w ten sposób pełnej konfiguracji. Dostajemy jednak narzędzie do stworzenia konfiguracji startowej, która umożliwi nam późniejszą dalszą konfigurację na przykład za pomocą Ansible.
Jeżeli korzystamy z mechanizmu Zero Touch Provisioning w Cisco ISE (i nie tylko) musimy uzbroić się w cierpliwość. ZTP nie uruchamia się jako pierwszy czy domyślny mechanizm konfiguracji. Ponadto wiele zadań jest wykonywanych w sposób niewidoczny zupełnie dla użytkownika. Gdy pierwszy raz korzystałem z ZTP moim błędem było restartowanie maszyny wirtualnej czy nie gdyż myślałem że żadne operację się nie wykonują. Nic nie wyświetlało się na konsoli urządzenia. Jeżeli chcemy być pewni że coś się dzieje musimy spojrzeć na konsolę hypervisora i obserwować takie parametry jak aktualne zużycie CPU czy ilość wykonywanych operacji na dyskach.
Tworzymy obraz Zero Touch Provisioning dla Cisco ISE
Aby utworzyć obraz ZTP musimy najpierw przygotować plik konfiguracyjny. Przykład zawartości takiego pliku znajdziemy tutaj. Mój plik wygląda następująco:
hostname=ise-lab-2 ipv4_addr=172.20.1.91 ipv4_mask=255.255.255.0 ipv4_default_gw=172.20.1.1 domain=virl.lan primary_nameserver=192.168.1.250 secondary_nameserver=172.20.1.1 primary_ntpserver=172.20.1.1 timezone=Europe/Warsaw ssh=true username=admin password=SuperTajneHasło ers=true openapi=true SkipIcmpChecks=false SkipDnsChecks=false SkipNtpChecks=false
Ustawiam podstawowe parametry systemu takie jak nazwa (tymczasowa, zostanie nadpisana z odtwarzanej kopii zapasowej), adresy IP, serwery DNS i NTP. Włączam też usługę ssh by mieć dostep do konsoli. Nazwał domyślnego użytkownika oraz jego hasło musimy podać w sposób jawny, dlatego ważne jest by w zautomatyzowanych procesach hasło szybko zmienić. Włączam też usługi ERS i OpenAPI. W ten sposób w kolejnych krokach będę mógł przeprowadzić dodatkową konfigurację Cisco ISE i odtworzyć konfigurację z kopii zapasowej.
Minusem mechanizmu ZTP jest to, że w pliku konfiguracyjnym nie skonfiguruję repozytorium, które wymaga uwierzytelnienia. Moja kopia zapasowa znajduje się na serwerze FTP. Konfiguracja ZTP pozwala mi jedynie na konfigurację anonimowego FTP. TFTP czy NFS.
Tworzymy obraz Zero Touch Provisioning Cisco ISE
Skrypt do budowy obrazu ZTP dostępny jest poniżej. Pochodzi on z dokumentacji Cisco.
#!/bin/bash ########################################################### # This script is used to generate ise ztp image with ztp # configuration file. # # Need to pass ztp configuration file as input. # # Copyright (c) 2021 by Cisco Systems, Inc. # All rights reserved. # Note: # To mount the image use below command # mount ise_ztp_config.img /ztp # To mount the image from cdrom # mount -o ro /dev/sr1 /ztp ############################################################# if [ -z "$1" ];then echo "Usage:$0 [out-ztp.img]" exit 1 elif [ ! -f $1 ];then echo "file $1 not exist" exit 1 else conf_file=$1 fi if [ -z "$2" ] ;then image=ise_config.img else image=$2 fi mountpath=/tmp/ise_ztp ztplabel=ISE-ZTP rm -fr $mountpath mkdir -p $mountpath dd if=/dev/zero of=$image bs=1k count=1440 > /dev/null 2>&1 if [ `echo $?` -ne 0 ];then echo "Image creation failed\n" exit 1 fi mkfs.ext4 $image -L $ztplabel -F > /dev/null 2>&1 mount -o rw,loop $image $mountpath cp $conf_file $mountpath/ise-ztp.conf sync umount $mountpath sleep 1 # Check for automount and unmount automountpath=$(mount | grep $ztplabel | awk '{print $3}') if [ -n "$automountpath" ];then umount $automountpath fi echo "Image created $image"
mkfs.ext4
. $chmod +x create_ztp_image.sh $sudo ./create_ztp_image.sh ise-ztp.conf ise-ztp.img
Tak przygotowany plik wgrywamy na datastore ESXi, będzie nam potrzebny w kolejnym etapie.
Budujemy Cisco ISE za pomocą ZTP
Mechanizm Zero Touch Provisioning może być wykorzystany do instalacji maszyny wirtualnej zarówno za pomocą obrazu ISO jak i OVA. Ja wybrałem pierwszą metodę.
W playbooku statycznie definiuję nazwę obrazu ISO, z którego nastąpi instalacja. Plik z obrazem wgrany jest na datastore. Pierwsze zadanie to set_fact
, w którym definiuję zmienną annotation_text
, zawierającą dodatkowe informacje, które zostaną dodane do właściwości maszyny wirtualnej. Umożliwia mi to przekazanie ważnych informacji administracyjnych związanych z kontami użytkowników w VM.
--- - name: Install ISE from ISO hosts: all gather_facts: no vars: iso_name: "Cisco-ISE-3.3.0.430.SPA.x86_64.iso" tasks: - set_fact: annotation_text: | VM zbudowana z użyciem ZTP
Następnie korzystam z modułu community.vmware.vmware_guest
, aby skonfigurować i utworzyć nową maszynę wirtualną na serwerze ESXi, używając poświadczeń dostarczonych w playbooku. Parametry takie jak ilość vCPU, pamięć RAM czy rozmiar dysków są dostosowane do moich potrzeb i instalacji labowej. Na uwagę zasługuje konfiguracja napędów CD-ROM. Napędy muszą być typu IDE. Pierwsza jednostka musi mieć identyfikator 0:0 i montuje obraz ISO Cisco ISE. Drugi napęd ma identyfikator 1:0 i montuje obraz z konfiguracją Zero Touch Provisioning.
- name: Create the VM for Cisco ISE deployment from ISO community.vmware.vmware_guest: hostname: '{{ inventory_hostname }}' username: '{{ esxi_username }}' password: '{{ esxi_password }}' esxi_hostname: '{{ inventory_hostname }}' validate_certs: false name: '{{ vm_name }}' datastore: datastore-vm folder: '/vm' guest_id: "rhel8_64Guest" annotation: '{{ annotation_text }}' hardware: boot_firmware: bios memory_mb: 16384 num_cpu_cores_per_socket: 1 num_cpus: 4 scsi: paravirtual cdrom: - controller_number: 0 unit_number: 0 controller_type: ide state: present type: iso iso_path: "[datastore1]/ISO/{{ iso_name }}" - controller_number: 1 unit_number: 0 controller_type: ide state: present type: iso iso_path: "[datastore1]/ZTP/{{ vm_name }}.img" disk: - size_gb: 300 type: thin datastore: datastorevm networks: - name: "LabFlat1" connect: yes device_type: 'e1000e' wait_for_ip_address: false state: present delegate_to: localhost
Tak skonfigurowaną maszynę możemy teraz uruchomić. Mógłbym to zrobić w poprzednim kroku, wolę jednak je rozdzielić na wypadek, gdyby przyszło mi diagnozować problemy.
- name: Power on the Cisco ISE VM community.vmware.vmware_guest: hostname: '{{ inventory_hostname }}' username: '{{ esxi_username }}' password: '{{ esxi_password }}' esxi_hostname: '{{ inventory_hostname }}' validate_certs: false name: '{{ vm_name }}' wait_for_ip_address: false state: powered-on delegate_to: localhost
Konfiguracja Jenkinsfile
Plik konfiguracyjny Zero Touch Provisioning dla Cisco ISE tworzymy ręcznie. Nie będziemy go zmieniać tak długo aż nie będziemy zmieniać konfiguracji startowej albo jakieś nowe parametry nie będziemy musieli dodać do nowej wersji Cisco ISE. Playbooka tworzącego i uruchamiającego maszynę wirtualną uruchamiamy w znany już z poprzednich wpisów sposób. W kolejny kroku czekamy na to, aby nowa maszyna wirtualna się poprawnie uruchomiła. Testujemy to za pomocą powtarzanego w pętli wywołania ping
. To, że serwer odpowiada na ping nie oznacza jednak, że możemy przystąpić do dalszej jego konfiguracji. Muszą uruchomić się jeszcze wszystkie usługi. Dlatego wstrzymujemy dalej wykonanie zaprogramowanego potoku na 30 minut dając Cisco ISE czas na pierwsze uruchomienie.
stage('Build new ISE VM from ISO using ZTP') { environment { esxi_username = credentials('esxi_username') esxi_password = credentials('esxi_password') } steps { ansiblePlaybook( playbook: 'ise-build-ztp-from-iso.yaml', inventory: 'inventory-esxi', extraVars: [ esxi_username: env.esxi_username, esxi_password: env.esxi_password, vm_name: params.vm_name, ] ) } } stage('Wait fo ISE to boot') { steps { script { timeout(time: 90, unit: 'MINUTES') { waitUntil { def result = sh script: "ping -c 1 ${params.vm_name}", returnStatus: true return (result == 0) } } } } } stage('Pause for 30 Minutes') { steps { echo 'Pausing the pipeline for 30 minutes...' sleep time: 30, unit: 'MINUTES' } }