Vad är Vagrant?
Jag tycker denna forumdelen inte riktigt uppnår sin potential, och tänkte göra mitt för att åtgärda detta genom att prata lite om ett häftigt verktyg jag använder både i jobbet och privat. Om detta leder till någon kul diskussion så kanske detta kan bli till något återkommande, att man beskriver användningsområden för användbara Linux-prylar.
Vagrant är ett verktyg för att hantera virtuella maskiner. Det är extremt smidigt för att snabbt få igång en liten (eller stor) labbmiljö man kan meka med. Om man skulle göra något dumt går det lika snabbt att skrota allt och börja på ny kula.
Hur använder man då vagrant? Jo, det första man behöver göra är att installera det, detta görs med fördel med valfri pakethanterare. Men jag tror många här kör Ubuntu eller någon annan debian-baserad dist så det kommandot kommer här:
sudo apt-get install vagrant
Sedan behöver man en VM-leverantör, detta kan vara t.ex. VM-ware, Virtualbox eller till och med docker, som vagrant ska använda sig av. Eftersom VirtualBox är väldigt vanligt att man använder till detta och jag tror VM-ware kostar pengar så kommer jag i detta exemplet använda mig av VirtualBox, så vi installerar det också:
sudo apt-get install vagrant
sudo apt-get install virtualbox-dkms
Nu när allt är installerat är det dags att sätta upp en virtuell maskin.
mkdir vagrant-projekt # Vi börjar med att skapa upp en mapp för vårt lilla projekt
cd vagrant-projekt # Sedan går vi in i mappen
vagrant init bento/ubuntu-16.04 # Vi initierar en maskin med Ubuntu 16.04
vagrant up # Vi sätter igång maskinen
Då var det klart! Nu kommer vagrant hämta ner snurra igång en maskin med Ubuntu 16.04. Du kan nu logga in på maskinen genom att köra kommandot:
vagrant ssh # Detta ansluter med ssh till den virtuella maskinen du
(vill du lämna den virtuella maskinen så kan det göras med CTRL+d eller kommandot exit, precis som vilken ssh-session som helst)
Vi gör en liten djupdykning i vad som faktiskt hände i initieringssteget. Det skapades en fil i din mapp som heter Vagrantfile. Denna fil beskriver hur maskinen ska konfigureras.
Vagrantfile
I denna fil så hamnar t.ex. vilket typ av "box" (ord för typ "förpackad maskin", i detta fallet Bentos Ubuntu 16.04 box) det ska vara. Anledningen till att vi valde just denna box är att Ubuntu 16.04 är i skrivande stund senaste LTS releasen av Ubuntu och att Hashicorp (de som gör Vagrant) brukar rekommendera Bentos opensourceboxar.
Om vi öppnar Vagrantfile i valfri text-editor så finns det många utkommenterade konfigurationsrader. Dessa beskriver bl.a. hur man delar en mapp från sin lokala maskin med den virtuella:
config.vm.synced_folder "../data", "/vagrant_data"
Detta skulle alltså dela mappen data, som ligger en nivå upp, med den virtuella maskinen som skulle se den som /vagrant_data. Detta kan vara bra i många situationer, men t.ex. när man vill ta ut en konfigurationsfil ur den virtuella maskinen så kan man lägga den i /vagrant_data så kan du hitta den i data-mappen på din lokala maskin.
Det finns mängder med olika inställningar man kan göra i Vagrantfile, och jag kommer verkligen inte gå igenom alla, men en häftig grej vi snabbt kan beröra är hur man sätter upp flera virtuella maskiner i samma fil:
Denna kod ska vara mellan Vagrant.configure("2") do |config|
och end
config.vm.define :vm1 do |vm1|
# Här skulle vi kunna köra maskinspecifika kommandon om vi vill
end
config.vm.define :vm2 do |vm2|
# Här skulle vi kunna köra maskinspecifika kommandon om vi vill
end
Ovan sätter vi upp vm1 och vm2, men eftersom Vagrantfile är skriven i Ruby kan vi också göra flera maskiner med en loop:
(1..3).each do |i|
config.vm.define "vm-#{i}" do |vm|
# Här skulle vi kunna köra maskinspecifika kommandon om vi vill
end
end
När man har flera maskiner kan man t.ex. skapa ett privat nätverk mellan dem, testa att hosta olika tjänster på dem och testa system som kommunicerar med varann. Man ansluter till en specifik maskin med
vagrant ssh maskinens namn
Stänga av och förstöra de virtuella maskinerna
När man lekt färdigt och inte vill att de virtuella maskinerna ska hålla på och ta kraft så kan man stänga ner dem med
vagrant halt
Vill man helt börja om på nytt och ta bort den virtuella maskinen (notera att Vagrantfile finns kvar) så kör man
vagrant destroy
eller om maskinen körs:
vagrant destroy -f
Användningsområden
Vad har jag använt detta till då? Jo, det är ett så smidigt sätt att sätta upp en testmiljö på så jag använder det i princip till alla projekt jag har. Nu senast skulle jag sätta upp min media-server och då gjorde jag ett ansible-script som deployar ut alla de olika tjänsterna och istället för att testa på min körande server så riktade jag scriptet mot en virtuell maskin. På så sätt kunde jag enkelt se till att allting fungerade på en gång på en helt ren maskin och behövde inte hålla på och få massa "skräp" i den verkliga miljön. Man behöver inte återställa något manuellt till ursprungstillståndet utan man kan bara köra en vagrant destroy följt av en vagrant up så är allt som nytt igen.