Automatyzacja odtwarzania Cisco ISE z backupu - część VI

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.

Automation as seen by AI

Spis treści

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.

Previous slide
Next slide

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"    
Skrypt wykonujemy na urządzeniu z systemem Linux. Na MacOS nie działa on poprawnie, gdyż brakuje w tym systemie narzędzia 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'
            }
        }

E-BOOK

Zaczynasz swój pierwszy projekt związany z automatyzacją?

Ten e-book jest dla Ciebie! Zawiera sprawdzone podejście, które realizowałem w wielu projektach. Sprawdź co możesz zrobić, by odnieść sukces!


Subscribe
Powiadom o
guest

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

0 komentarzy
Inline Feedbacks
View all comments

ZdradziĆ Ci sekretY udanego projektu automatyzacji?

(link otwiera się w nowym oknie)