Backup konfiguracji routera za pomocą Ansible

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ń.


Subscribe
Powiadom o
guest

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

2 komentarzy
najstarszy
najnowszy oceniany
Inline Feedbacks
View all comments
Piotrek
Piotrek
12/08/2020 09:36

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ć

ZdradziĆ Ci sekretY udanego projektu automatyzacji?

(link otwiera się w nowym oknie)