Kolejne dni pracy z Cisco Modeling Labs 2.0. Przygotowywałem się do pierwszego wykorzystania go w większej topologii i scenariuszu w ramach webinaru. Ale tym razem nie będę pisał o CML 2.0. Przygotowując scenariusza laba chciałem mieć zapisane wzorcowe konfiguracje urządzeń z kolejnych etapów. Niestety CML 2.0 nie pozwala na łatwe zgranie konfiguracji z urządzeń biorących udział w symulacji. Napisanie playbooka wykonującego backup konfiguracji routera za pomocą Ansible jest przecież bardzo proste.
Co potrzebujemy aby zrobić backup konfiguracji routera za pomocą Ansible?
Przede wszystkim potrzebny będzie nam komputer, najlepiej z systemem Linux, z którego nawiążemy połączenie SSH z urządzeniem, którego konfigurację chcemy zgrać. Ponadto zainstalować musimy na nim następujące komponenty:
- Interpreter języka Python (najlepiej w wersji minimum 3.7)
- Ansible
- Niezbędne moduły Python wymagane przez Ansible
- Moduły Python wymagane przez moduł Ansible ios_command: paramiko, ans1crypto oraz wszystkie dodatkowe moduły przez nie wymagane.
Poza samym interpreterem języka Python wszystkie pozostałe komponenty najłatwiej zainstalujemy za pomocą PyPi. Mogą też być dostępne w paczkach w Twojej dystrybucji Linuksa.
Inventory
Do działania playbooka potrzebujemy definicję inventory, czyli bazy urządzeń, z których konfiguracja zostanie pobrana, oraz samego playbooka. Przykładowe inventory może wyglądać następująco:
[cisco] 172.16.1.101 172.16.1.102 [cisco:vars] username=cisco password=cisco ansible_connection=local
Zdefiniowałem w nim w grupie o nazwie cisco dwa urządzenia. Do ich identyfikacji posługiwałem się adresami IP. Ponadto dla utworzonej grupy stworzyłem trzy zmienne. Dwie pierwsze to login i hasło dostępowe – wszystko działo się w moim labie więc są zapisane otwartym tekstem. Nigdy tak jednak nie postępuj w środowisku firmowym. Ostatnia zmienna mówi Ansible, że zadania playboka mają być wykonywane na lokalnym hoście, nie zaś na tym pochodzącym z inventory.
Playbook
Drugi z plików, backup.yml, to sam playbook opisujący czynności niezbędne, aby wykonać backup konfiguracji routera za pomocą Ansible:
--- - name: Save Configurations (IOS) hosts: all gather_facts: no vars: creds: host: "{{ inventory_hostname }}" username: "{{ username }}" password: "{{ password }}" timeout: "60" tasks: - ios_command: provider: "{{ creds }}" commands: show run register: show_run - copy: content: "{{ show_run.stdout[0] }}" dest: "conf/{{ inventory_hostname }}.txt"
Korzystając ze zmiennych grupy zpisanych w inventory tworzę nową zmienną creds
, którą będę używał wywołując moduł ios_command
. Zawiera ona parametry połączenia, czyli nazwę urządzenia, login, hasło i dodatkowo limit czasu na zrealizowanie zadania. Zmienną tą przypisuję do parametru provider w module ios_command
. Dodatkowo muszę w parametrze commands
określić jakie polecenia ma na urządzeniu zostać wykonane.
Wynik polecenia zapisywany jest w zmiennej show_run. Przekazywana jest ona do drugiego zadania, w którym modułem copy
zapisujemy wartość obiektu show_run.stdout[0]
do pliku tekstowego.
Aby uruchomić wykonanie playbooka wydajemy polecenie ansible-playbook -i inventory backup.yml
. Zapisane zrzuty konfiguracji znajdziemy w katalogu conf w plikach o nazwach odpowiadających nazwom urządzeń.
Co do haseł i loginów: jedno i drugie można przechowywać w vaultcie. Albo po prostu uzyć RADIUSa albo TACACSa i interaktywnie pobrać je przy uruchamianiu playbooka za pomocą “prompt”
A zamiast używać copy i ios_command może dałoby sie użyć modułu fetch i pobierać plik bezpośrednio z nvram? samo show run nie pokaże haseł a kopia z nvram powinna je zawierać
Cześć Piotrek. Tak, oczywiście, że można, a nawet powinno trzymać się takie dane w vault, jednak tu chodziło o pokazanie realizacji prostego zadania.