Pierwsze kroki z Vagrant

Pierwsze kroki z Vagrant

Jednym z najbardziej kluczowych etapów automatyzacji jest testowanie konfiguracji, zanim zostanie ona wrzucona na urządzenia produkcyjne. O ile w świecie systemowo-aplikacyjnym bardzo łatwo jest odzwierciedlić środowisko produkcyjne, uruchamiając kilka maszyn wirtualnych lub kontenerów, o tyle w świecie sieciowym takie odwzorowanie jest bardzo trudne. Co nie oznacza, że nie jest możliwe. W trakcie testów nie zawsze interesuje nas kompletna topologia czy wydajność urządzeń. Na pierwszym etapie automatyzacji wystarczy, że będziemy mogli przetestować poprawność składni i zweryfikować podstawowe założenia naszej konfiguracji.

Do testowania konfiguracji najlepiej jest wykorzystać urządzenia fizyczne, ale nie zawsze jest to możliwe. Na szczęście, producenci urządzeń sieciowych coraz częściej udostępniają wirtualne obrazy, a nawet całe środowiska testowe. Możemy sobie ściągnąć taki obraz (czasami wystarczy założyć sobie zwykłe konto, ale czasami wymagane jest posiadanie specjalnego partnerstwa lub nawet kontraktu serwisowego) i uruchomić go na naszym laptopie. Następnie, możemy wkleić naszą konfigurację i zweryfikować jej działanie kilkoma poleceniami show. Fajnie by jednak było, aby cały ten proces był automatyczny. Chodzi o to, żebyśmy w prosty sposób mogli powołać lokalnie środowisko, dokonać odpowiednich zmian, przeprowadzić szybkie testy i skasować całe środowisko bez zaśmiecania naszego komputera. Z pomocą przychodzi nam system zwany Vagrant.

Czym jest Vagrant?

Vagrant to narzędzie open-source, rozwijane przez firmę HashiCorp, służące do automatyzowania implementacji i konfiguracji testowych środowisk wirtualnych (jest to swojego rodzaju sandbox). Vagrant to tak naprawdę nakładka na oprogramowanie wirtualizujące, takie jak VirtualBox czy VMware Workstation. Możemy go sobie zainstalować na systemie Linux, Windows czy Mac OS. Konfigurację naszego środowiska opisujemy w pliku Vagrantfile. Zawiera on definicję wirtualnych urządzeń oraz konfigurację parametrów sieciowych. Zaletą Vagranta jest to, że może one też automatycznie uruchomić proces konfiguracji naszych urządzeń, wykorzystując takie narzędzia jak Ansible. Ponieważ wszystko opisane jest w plikach tekstowych, to łatwo jest nie tylko wersjonować ich zawartość (Git), ale też wspólnie pracować z innymi administratorami, bez konieczności przesyłania sobie dużych obrazów maszyn wirtualnych.

Jak zatem rozpocząć pracę z Vagrantem? Po pierwsze musimy mieć jakiś wirtualizator. W nomenklaturze Vagranta wirtualizator to tzw. Provider. My, do naszych testów wykorzystamy VirtualBox, który jest dość popularny i przede wszystkim darmowy. Pełna lista wspieranych systemów znajduje się tu. Poza niektórymi ustawieniami sieciowymi, pozostałe parametry dla każdego Providera są takie same, więc jeden administrator może pracować z VirtualBox’em, inny na VMware Workstation, wciąż powołując to samo środowisko testowe.

Instalacja VirtualBox i Vagrant

VirtualBox jest wirtualizatorem rozwijanym przez firmę Oracle. Niestety, od wersji 6 nie są już wspierane systemy 32-bitowe, więc jeżeli mamy do dyspozycji starsze obrazy to musimy ściągnąć i zainstalować VirtualBox w wersji 5. Pliki instalacyjne dostępne są tu. Instalacja jest bardzo prosta i sprowadza się do przeklikania kreatora. Uwaga! W trakcie tworzenia wirtualnych interfejsów sieciowych możemy na chwilę zostać odcięci od sieci. Musimy też mieć uprawnienia administratora, aby instalator mógł dokonać odpowiednich zmian w ustawieniach systemowych.

Po zakończeniu instalacji możemy sobie uruchomić GUI, aby zapoznać się z jego wyglądem. Korzystając jednak z takich narzędzi jak Vagrant rzadko zaglądamy do GUI, wszystko dzieje się automatycznie, w tle.

Pliki instalacyjne Vagrant znajdziemy tu. Podobnie jak przy VirtualBox, instalacja to szybkie przeklikanie kreatora. Na koniec wymagany będzie restart systemu.

Przygotowanie pierwszego obrazu

Tworząc środowisko testowe często uruchamiamy jakąś maszynę wirtualną, definiując podstawowe parametry, takie jak ilość CPU, RAM i HDD, a następnie instalujemy na niej jakiś system operacyjny. Obraz taki zazwyczaj albo klonujemy albo robimy z niego wzorzec (template) do powielania. Vagrant bazuje właśnie na takich pre-instalowanych obrazach, które noszą nazwę box. Dla wielu systemów i aplikacji obrazy takie dostępne są publicznie. Można je pobrać z repozytorium Vagrant Cloud. Możemy też sobie sami stworzyć taki obraz (zrobimy to w jednym z kolejnych artykułów). Systemy operacyjne dostępne publicznie występują w wielu wariantach i mają zainstalowane różne aplikacje. Obrazy urządzeń sieciowych musimy pobrać najczęściej ze strony producenta. W naszym przypadku będzie to przełącznik Cisco Nexus 9000v (NXOS). Można go pobrać tu (rys. poniżej).

NXOS download
Pobieranie obrazu przełącznika Nexus 9000v

Ściągamy sobie plik box do dowolnego katalogu (najlepiej innego, niż katalog naszego projektu) i dodajemy go do lokalnego repozytorium Vagranta poleceniem vagrant box add. Polecenie to wykonujemy w katalogu ze ściągniętym plikiem .box. Repozytorium to lokalny zasób, z którego korzysta Vagrant i domyślnie znajduje się w katalogu domowym w .vagrant.d\boxes\.

c:\Users\devops\Documents\NetDevOps\vagrant-101>vagrant box add --name nxos/7.0.3.I7.3 nxosv-final.7.0.3.I7.6.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'nxos/7.0.3.I7.3' (v0) for provider:
    box: Unpacking necessary files from: file://c:/Users/devops/Documents/NetDevOps/vagrant-101/nxosv-final.7.0.3.I7.6.box
    box: Progress: 100% (Rate: 610M/s, Estimated time remaining: --:--:--)
==> box: Successfully added box 'nxos/7.0.3.I7.3' (v0) for 'virtualbox'!

Listę wszystkich lokalnych obrazów możemy wyświetlić poleceniem vagrant box list.

c:\Users\devops\Documents\NetDevOps\vagrant-101>vagrant box list
debian/jessie64 (virtualbox, 8.11.0)
nxos/7.0.3.I7.3 (virtualbox, 0)

Uruchomienie pierwszego obrazu

Teraz musimy utworzyć plik Vagranfile z konfiguracją naszego przełącznika. Utwórzmy sobie najpierw nowy, pusty katalog dla naszego projektu, np. vagrant-101. Polecenia vagrant muszą być wykonywane w katalogu, w którym znajduje się plik Vagrantfile. Plik ten możemy utworzyć na dwa sposoby. Albo definiujemy go sami, od zera albo tworzymy jego szkielet poleceniem vagrant init nxos/7.0.3.I7.3. W drugim przypadku, oprócz podstawowych, wymaganych parametrów, plik będzie zawierał dodatkowe ustawienia, które możemy dodać do naszej konfiguracji. Ustawienia te domyślnie są wyłączone (znak # oznacza komentarz). Zachęcam do stworzenia sobie pliku w ten sposób i przejrzenia jego zawartości. Po usunięciu zbędnych poleceń i dodaniu kilku nowych, plik ten będzie wyglądał następująco:

# -*- mode: ruby -*-

Vagrant.configure("2") do |config|
  config.vm.define "nxos1" do |nxos|
    nxos.vm.box = "nxos/7.0.3.I7.3"
    nxos.vm.provider "virtualbox" do |vm|
      vm.memory = "4096"
      vm.gui = false
      vm.name = "nxos-1"
    end
  end
end
  • #1 – Linia ta jest niezbędna i nie wolno jej kasować. Definiuje ona typ pliku, zrozumiały dla Vagranta.
  • #3 – Początek definicji naszej konfiguracji, |config| to nazwa zmiennej, możemy ją sobie zmienić, ale trzeba też zmienić w całej konfiguracji odwołanie do niej
  • #4 – Początek definicji bloku opisującego nasz przełącznik, podobnie jak wyżej, |nxos| to zmienna.
  • #5 – Definicja uruchamianego obrazu
  • #6 – Początek bloku definiującego fizyczne parametry przełącznika
  • #7 – Ustawiamy 4GB RAM. NXOSv domyślnie ma 8GB, ale do testów wystarczy 4GB.
  • #8 – Wyłączamy GUI (dla testów można włączyć, żeby zobaczyć jak wygląda, nie jest to GUI samego VirtualBoxa, a tylko konsola danej VMki)
  • #9 – definiujemy nazwę maszyny wirtualnej przełącznika, nie jest to hostname, ten musimy ustawić później z poziomu CLI.

Obraz naszego przełącznika uruchamiamy poleceniem vagrant up

c:\Users\devops\Documents\NetDevOps\vagrant-101>vagrant up
Bringing machine 'nxos1' up with 'virtualbox' provider...
==> nxos1: Importing base box 'nxos/7.0.3.I7.3'...
==> nxos1: Matching MAC address for NAT networking...
==> nxos1: Setting the name of the VM: nxos-1
==> nxos1: Clearing any previously set network interfaces...
==> nxos1: Preparing network interfaces based on configuration...
    nxos1: Adapter 1: nat
==> nxos1: Forwarding ports...
    nxos1: 22 (guest) => 2222 (host) (adapter 1)
==> nxos1: Running 'pre-boot' VM customizations...
==> nxos1: Booting VM...
==> nxos1: Waiting for machine to boot. This may take a few minutes...
    nxos1: SSH address: 127.0.0.1:2222
    nxos1: SSH username: vagrant
    nxos1: SSH auth method: private key

Jak tylko zobaczymy powyższy komunikat, uruchamiamy polecenie putty.exe -telnet localhost 2023 (najlepiej jest ściągnąć plik putty.exe do lokalnego katalogu naszego projektu). Polecenie to spowoduje uruchomienie konsoli szeregowej (port 2023 jest domyślny) do naszego przełącznika. Możemy z niej obserwować proces uruchamiania się NXOS. Z poziomu GUI nie mamy dostępu do CLI, ponieważ kontrolę przejmuje bootloader NXOS. Niestety, przełącznik NXOSv 9000 startuje niemiłosiernie długo, więc za pierwszym razem musimy uzbroić się w cierpliwość. Na koniec Vagrant wyświetli komunikat o przekroczeniu timeout’u. Pomimo tego, że sam NXOS wstał poprawnie (stąd obserwowanie go z konsoli), to Vagrant nie jest w stanie zalogować się do niego interaktywnie, podając hasło. Możemy zignorować ten błąd.

Timed out while waiting for the machine to boot. This means that
Vagrant was unable to communicate with the guest machine within
the configured ("config.vm.boot_timeout" value) time period.
[...]

Logowanie się do przełącznika

Do systemów powołanych przez Vagranta możemy zalogować się na dwa sposoby (poza opisaną powyżej konsolą). Jeżeli skonfigurowaliśmy w odpowiedni sposób interfejsy sieciowe (w pliku Vagrantfile i na samym przełączniku 9000v) to możemy połączyć się z nim za pomocą SSH, tak jak do urządzenia fizycznego (zwróćmy uwagę na linię #10 z procesu startowania przełącznika, połączenie SSH musi być wykonane na port 2222, który jest NATowany na oryginalny port 22 – kolejne przełączniki będą miały inne porty lokalne). Możemy też wykonać połączenie SSH lokalnie, niezależnie od konfiguracji samego przełącznika, wykonując polecenie vagrant ssh. Domyślnie, każdy publicznie dostępny box ma zdefiniowanego użytkownika vagrant, z hasłem vagrant (to za jego pomocą Vagrant nie może się zalogować – ktoś ma jakiś pomysł?).

c:\Users\devops\Documents\NetDevOps\vagrant-101>vagrant ssh
Password:

[...]
Nexus9000v#

Wyłączanie i kasowanie obrazu

Uruchomienie pierwszego obrazu zawsze tworzy ukryty katalog .vagrant. Są w nim zapisywane wszystkie informacje na temat stanu i bieżącej konfiguracji każdego z uruchomionych urządzeń. Wyłączenie naszego przełącznika możemy wykonać na trzy sposoby. Polecenie vagrant destroy spowoduje całkowite jego usunięcie, wraz z konfiguracją. Polecenia vagrant halt spowoduje wyłączenie go (graceful shutdown), z zachowaniem konfiguracji. Zaś vagrant suspend spowoduje zapisanie stanu przełącznika. Oczywiście ponowne uruchomienie będzie najszybsze po ostatnim wariancie.

W kolejnej części zdefiniujemy sobie bardziej rozbudowaną topologię i zaczniemy testować konfigurację za pomocą Ansible.

Podsumowanie

Odsyłacze do zasobów:

Podstawowe polecenia Vagrant:

vagrant version  - wyświetlenie wersji Vagranta
vagrant init     - stworzenie przykładowego pliku konfiguracyjnego Vagrantfile
vagrant box add  - dodanie do lokalnego repozytorium ściągnietego obrazu
vagrant box list - wyświetlenie obrazów w repozytorium
vagrant up       - uruchomienie maszyn wirtualnych zdefiniowanych w pliku Vagrantfile
vagrant ssh      - połączenie się lokalnie z maszyną wirtualną
vagrant suspend  - zawieszenie maszyny wirtualnej z zachowaniem stanu CPU i RAM
vagrant halt     - wyłączenie maszyny wirtualnej z zachowaniem konfiguracji
vagrant resume   - wznowienie pracy maszyny wirtualnej po wykonaniu suspend
vagrant destroy  - skasowanie maszyny wirtualnej wraz ze wszystkimi jej zasobami
vagrant status   - wyświetlenie stanu działających obrazów

Podziel się z innymi:
Email this to someone
email
Share on Facebook
Facebook
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin

Dodaj komentarz

13 − 5 =