W kolejnym wpisie z cyklu zajmiemy się sprawdzaniem drugiego z warunków, które są niezbędne do podjęcia decyzji o odtworzeniu z kopii zapasowej. Pokażę Ci teraz jak sprawdzić ważność licencji trial, czy liczba pozostałych dni jest mniejsza niż 21. Wykorzystamy do tego API dostarczane przez Cisco ISE.
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
Aktywujemy API w Cisco ISE
Interfejs API Cisco ISE nie jest domyślnie włączony. Wynika to z aspektów bezpieczeństwa. Niepoprawnie skonfigurowany może potencjalnie stanowić lukę w zabezpieczeniach jednego z kluczowych komponentów bezpieczeństwa naszej infrastruktury. Cisco ISE w wersji 3.1 oferuje dwa interfejsy – ERS i OpenAPI.
External RESTful Services (ERS) to zestaw REST API, które umożliwiają programowe interakcje z różnymi aspektami Cisco ISE. Należą do nich między innymi konfiguracja polityk, zarządzanie tożsamością, raportowanie i telemetria. ERS pozwala na tworzenie, czytanie, aktualizowanie i usuwanie (model operacji CRUD) obiektów w ISE, takich jak użytkownicy, urządzenia, grupy, itp. Daje to administratorom i deweloperom duże możliwości automatyzacji i integracji zewnętrznych systemów zarządzania z Cisco ISE.
OpenAPI w kontekście Cisco ISE odnosi się do specyfikacji interfejsu API, które są zgodne ze standardem OpenAPI (dawniej Swagger). To standardowa metoda dokumentowania API REST, która umożliwia automatyczne generowanie klientów API w różnych językach programowania oraz interaktywną dokumentację API. W Cisco ISE 3.1, OpenAPI możemy używać do interakcji z niektórymi usługami podobnie jak ERS. Dodatkowym benefitem jest lepsza dokumentacja i narzędzia wspomagające deweloperów.
Dlaczego API w Cisco ISE jest nam potrzebne? Ponieważ korzysta z niego biblioteka języka Python ciscoisesdk. Ta biblioteka zaś jest niezbędna aby poprawnie działały moduły z kolekcji cisco.ise do Ansible. Abu włączyć API musimy zalogować się do Cisco ISE. Następnie wybramy z menu Administration -> API Settings. W zakładce API Service Settings włączamy zarówno ERS jak i OpenAPI. W sieciach firmowych warto też wgrać podpisany przez autoryzowane CA certyfikat do połączeń SSL.
Sprawdzamy ważność licencji trial Cisco ISE
Kolekcja cisco.ise ma zaimplementowany moduł odczytujący informację o licencji, co bardzo upraszcza zaprogramowanie czynności sprawdzających.
W pierwszym zadaniu bloku, “Get Evaluation license status”, wykorzystujemy moduł cisco.ise.licensing_eval_license_info. Pobramy za jego pomocą informacje o statusie licencji ewaluacyjnej Cisco ISE. Do wykonania tego zadania konieczne jest podanie nazwy hosta ISE (ise_hostname), nazwy użytkownika (ise_username), hasła (ise_password) oraz informacji, że nie należy weryfikować certyfikatu SSL (ise_verify ustawione na false). Wyniki tego zadania rejestrujemy pod zmienną result.
Następnie, w drugim zadaniu, “Fail if there is more than 21 days left”, wykorzystujemy zarejestrowany wynik i sprawdzamy ile dni pozostało do końca okresu licencji ewaluacyjnej. Jeśli liczba dni przekracza 21, wykonanie playbooka przerywamy z odpowiednim komunikatem błędu. Zadanie to jest wykonane tylko wtedy, gdy zmienna ignore_license_period nie jest ustawiona na true. Pozwala to na opcjonalne pominiecie tego kroku w zależności od konkretnego przypadku użycia lub potrzeb testowych.
--- - name: Check ISE license hosts: all gather_facts: no tasks: - block: - name: Get Evaluation license status cisco.ise.licensing_eval_license_info: ise_hostname: "{{ vm_name }}" ise_username: "{{ ise_username }}" ise_password: "{{ ise_password }}" ise_verify: false register: result - name: Fail if there is more than 21 days left fail: msg: "More than 21 days of evaluation license left. Aborting..." when: result.ise_response.daysRemaining > 21 when: not ignore_license_period
Problemy z uruchomieniem playbooka na niektórych systemach
W niektórych dystrybucjach Linuksa czy na MacOS playbooki z modułami Cisco ISE często nie działają. Wymagają one zdefiniowania dwóch zmiennych środowiskowych, które są stosowane w specyficznych kontekstach. Dzieje się tak szczególnie przy pracy z niektórymi narzędziami i bibliotekami w systemach Unixowych oraz w kontekście komunikacji sieciowej.
export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES export no_proxy=*
Zmienna środowiskowa OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
jest specyficzna dla systemów opartych na macOS i związana jest z ograniczeniami wprowadzonymi w macOS High Sierra i nowszych, dotyczącymi użycia wielowątkowości (a konkretnie forka) w aplikacjach, które korzystają z niektórych interfejsów Apple, takich jak Objective-C. Ustawiając tą zmienną na YES informujemy środowisko uruchomieniowe, że inicjalizacja bezpieczeństwa forka może być wyłączona. Jest to potrzebne dla niektórych operacji, które mogą być wykonywane przez biblioteki lub narzędzia używane w playbookach Ansible. Bez tego, próby użycia wielowątkowości mogłyby skutkować błędami lub awarią aplikacji z powodu tych ograniczeń bezpieczeństwa.
Druga zmienna środowiskowa konfiguruje zachowanie proxy w aplikacjach sieciowych. Ustawienie no_proxy=*
informuje system i aplikacje, aby nie używały skonfigurowanego serwera proxy dla żadnych połączeń. Jest to użyteczne w scenariuszach, w których konfiguracja proxy może przeszkadzać w komunikacji bezpośredniej między narzędziami Ansible a urządzeniami sieciowymi, takimi jak Cisco ISE. W przypadku modułów komunikujących się przez sieć, nieodpowiednia konfiguracja proxy może prowadzić do błędów połączenia lub czasu oczekiwania, co ostatecznie uniemożliwia poprawne działanie playbooka.
Konfiguracja pipeline Jenkins
Konfiguracja pipeline Jenkins
Konfiguracja Jenkinsfile dla tego zadania jest bardzo prosta i polega na uruchomieniu playbooka Ansible. Wszystkie dodatkowe parametry przekazuję w postaci extraVars. Parametry związane z loginem i hasłem są najpierw przekazuję w bezpieczny sposób do środowiska wykonania zdefiniowanego zadania. Same wartości przechowuję bezpiecznie w Jenkinsie.
stage('Check eval license') { environment { ise_username = credentials('ise_username') ise_password = credentials('ise_password') } steps { ansiblePlaybook( playbook: 'ise-check-license.yaml', inventory: 'inventory-localhost', extraVars: [ vm_name: params.vm_name, ise_username: env.ise_username, ise_password: env.ise_password, ignore_license_period: params.ignore_license_period ] ) } }