Vagrant virtualių mašinų valdymas

Kas tas Vagrant ir kam jis reikalingas

Jei kada nors bandėte pasidalinti savo projektu su komandos nariu ir girdėjote sakant „bet pas mane veikia”, tai tikrai suprasite, kodėl Vagrant atsirado. Ši įrankis leidžia sukurti identiškas kūrimo aplinkas visiems komandos nariams, nepriklausomai nuo to, ar jie naudoja Windows, macOS ar Linux.

Vagrant yra atviro kodo įrankis, sukurtas HashiCorp, kuris automatizuoja virtualių mašinų kūrimą ir konfigūravimą. Pagalvokite apie jį kaip apie Docker, tik vietoj konteinerių čia naudojamos pilnavertės virtualios mašinos. Tai ypač naudinga, kai jums reikia testuoti programinę įrangą skirtingose operacinėse sistemose arba kai projektas reikalauja specifinės aplinkos konfigūracijos.

Pagrindinis Vagrant pranašumas – tai Vagrantfile. Šis paprastas tekstinis failas aprašo visą virtualios mašinos konfigūraciją: kokią operacinę sistemą naudoti, kiek RAM skirti, kokius tinklo nustatymus taikyti ir kaip automatiškai įdiegti reikiamą programinę įrangą. Vieną kartą sukūrę Vagrantfile, galite jį įtraukti į versijavimo sistemą ir dalintis su visa komanda.

Pirmieji žingsniai su Vagrant

Prieš pradedant dirbti su Vagrant, jums reikės dviejų dalykų: paties Vagrant ir virtualizacijos programos. Populiariausi pasirinkimai – VirtualBox (nemokamas) arba VMware (mokamas, bet greitesnis). Asmeniškai rekomenduoju pradėti su VirtualBox, nes jis veikia visose platformose ir nereikalauja jokių papildomų licencijų.

Įdiegę abu įrankius, galite sukurti savo pirmąjį projektą. Atidarykite terminalą ir įvykdykite:

mkdir mano-projektas
cd mano-projektas
vagrant init ubuntu/focal64

Šios komandos sukurs naują direktoriją ir joje sugeneruos Vagrantfile su Ubuntu 20.04 konfigūracija. Dabar galite paleisti virtualią mašiną:

vagrant up

Pirmą kartą tai užtruks šiek tiek ilgiau, nes Vagrant atsisiųs Ubuntu „box” failą (tai iš esmės virtualios mašinos šablonas). Vėlesniais paleidimais procesas bus daug greitesnis. Kai mašina paleista, galite prie jos prisijungti per SSH:

vagrant ssh

Ir štai taip – jūs jau esate savo virtualioje mašinoje. Galite įdiegti programinę įrangą, keisti nustatymus, eksperimentuoti kaip tik norite. Kai baigsite darbą, tiesiog įvykdykite vagrant halt, kad sustabdytumėte mašiną, arba vagrant destroy, jei norite ją visiškai ištrinti.

Vagrantfile konfigūravimo galimybės

Tikroji Vagrant galia atsiskleidžia, kai pradedi konfigūruoti Vagrantfile. Tai Ruby kalba parašytas failas, bet nereikia būti Ruby ekspertu, kad jį naudotumėte. Pagrindinis sintaksė yra gana intuityvi.

Štai keletas praktinių pavyzdžių, kaip galite pritaikyti savo virtualią mašiną. Norėdami pakeisti skiriamą RAM kiekį ir procesorių skaičių:

Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/focal64"

config.vm.provider "virtualbox" do |vb|
vb.memory = "2048"
vb.cpus = 2
end
end

Tinklo nustatymai taip pat labai svarbūs. Galite nustatyti privačią IP adresą, kad galėtumėte pasiekti savo aplikaciją iš naršyklės:

config.vm.network "private_network", ip: "192.168.33.10"

Arba nukreipti konkretų prievadą iš jūsų kompiuterio į virtualią mašiną:

config.vm.network "forwarded_port", guest: 80, host: 8080

Dabar, jei jūsų virtualioje mašinoje veikia web serveris 80 prievade, galėsite jį pasiekti naršyklėje adresu localhost:8080.

Automatinis aplinkos konfigūravimas

Vienas iš galingiausių Vagrant aspektų – galimybė automatizuoti visos aplinkos konfigūravimą naudojant provisioning. Tai reiškia, kad galite parašyti scenarijų, kuris automatiškai įdiegs visą reikiamą programinę įrangą ir sukonfigūruos sistemą.

Paprasčiausias būdas – naudoti shell scenarijų. Pavyzdžiui, jei norite automatiškai įdiegti Nginx ir Node.js:

config.vm.provision "shell", inline: <<-SHELL apt-get update apt-get install -y nginx nodejs npm systemctl start nginx systemctl enable nginx SHELL

Taip pat galite nurodyti išorinį scenarijų failą:

config.vm.provision "shell", path: "setup.sh"

Sudėtingesniems projektams galite naudoti Ansible, Puppet ar Chef. Ansible yra ypač populiarus pasirinkimas dėl savo paprastumo. Štai kaip jį integruotumėte:

config.vm.provision "ansible" do |ansible|
ansible.playbook = "playbook.yml"
end

Provisioning scenarijai vykdomi tik pirmą kartą paleidžiant vagrant up arba kai specialiai nurodote vagrant provision. Tai puikus būdas užtikrinti, kad visi komandos nariai turėtų identiškai sukonfigūruotas aplinkas.

Darbas su kelių mašinų konfigūracijomis

Kai projektai tampa sudėtingesni, dažnai reikia kelių serverių – galbūt vieno duomenų bazei, kito aplikacijai ir trečio web serveriui. Vagrant puikiai tvarko tokias situacijas viename Vagrantfile.

Štai pavyzdys, kaip sukurti trijų mašinų konfigūraciją:

Vagrant.configure("2") do |config|
config.vm.define "web" do |web|
web.vm.box = "ubuntu/focal64"
web.vm.network "private_network", ip: "192.168.33.10"
web.vm.hostname = "web-server"
end

config.vm.define "app" do |app|
app.vm.box = "ubuntu/focal64"
app.vm.network "private_network", ip: "192.168.33.11"
app.vm.hostname = "app-server"
end

config.vm.define "db" do |db|
db.vm.box = "ubuntu/focal64"
db.vm.network "private_network", ip: "192.168.33.12"
db.vm.hostname = "database-server"
db.vm.provider "virtualbox" do |vb|
vb.memory = "4096"
end
end
end

Dabar galite valdyti visas mašinas atskirai. Pavyzdžiui, vagrant up web paleis tik web serverį, o vagrant ssh db prisijungs prie duomenų bazės serverio. Jei norite paleisti visas mašinas iš karto, tiesiog naudokite vagrant up be jokių papildomų parametrų.

Bendrinami katalogai ir failų sinchronizacija

Viena iš patogesnių Vagrant funkcijų – automatinis katalogų bendrinimas. Pagal nutylėjimą, direktorija, kurioje yra Vagrantfile, automatiškai pritvirtinama prie /vagrant kelio virtualioje mašinoje. Tai reiškia, kad galite redaguoti failus savo įprastoje redagavimo aplinkoje, o pakeitimai iš karto atsispindės virtualioje mašinoje.

Tačiau galite sukonfigūruoti ir papildomus bendrinamus katalogus:

config.vm.synced_folder "./projektas", "/var/www/html"

Tai ypač naudinga web kūrimui – jūsų kodas gali būti jūsų kompiuteryje, bet vykdomas virtualioje mašinoje su tiksliai tokia aplinka, kokia bus produkcijoje.

Yra keletas sinchronizacijos tipų, kuriuos galite naudoti. Numatytasis metodas naudoja virtualios mašinos shared folders funkciją, bet tai gali būti lėta su dideliu failų kiekiu. Alternatyvos:

NFS (Linux ir macOS) – daug greitesnis, bet reikalauja šiek tiek daugiau konfigūracijos:

config.vm.synced_folder "./projektas", "/var/www/html", type: "nfs"

rsync – vienkryptė sinchronizacija, labai greita, bet pakeitimai nepersiduoda atgal į host sistemą:

config.vm.synced_folder "./projektas", "/var/www/html", type: "rsync"

Asmeniškai, dirbdamas su Node.js projektais, kuriuose yra tūkstančiai smulkių failų node_modules direktorijoje, dažnai naudoju rsync arba tiesiog nebendrinu node_modules, o jį įdiegiu tiesiogiai virtualioje mašinoje.

Boxes valdymas ir kūrimas

Vagrant boxes – tai iš esmės virtualių mašinų šablonai. Oficialus Vagrant Cloud (vagrantup.com) turi tūkstančius paruoštų boxes įvairioms operacinėms sistemoms ir konfigūracijoms. Galite ieškoti boxes naudodami komandą:

vagrant box list

Ši komanda parodys visus jūsų sistemoje esančius boxes. Norėdami pridėti naują:

vagrant box add ubuntu/jammy64

Kartais gali prireikti atnaujinti senus boxes:

vagrant box update

O jei norite išvalyti vietą ir pašalinti nebereikalingus boxes:

vagrant box remove ubuntu/focal64

Įdomesnis dalykas – galite sukurti savo boxes. Tai naudinga, kai turite specifinę konfigūraciją, kurią norite pakartotinai naudoti keliuose projektuose. Procesas gana paprastas:

1. Sukurkite ir sukonfigūruokite virtualią mašiną kaip norite
2. Išvalykite nereikalingus failus ir istoriją
3. Supakuokite ją į box failą:

vagrant package --output mano-custom-box.box

Dabar galite šį box failą naudoti kituose projektuose arba net įkelti į Vagrant Cloud, kad juo galėtų naudotis kiti.

Problemų sprendimas ir optimizavimas

Dirbant su Vagrant, neišvengiamai susiduriate su įvairiomis problemomis. Štai keletas dažniausių situacijų ir kaip jas spręsti.

Lėtas veikimas – tai viena dažniausių nusiskundimų. Pirmas dalykas, kurį turėtumėte padaryti – padidinti skiriamą RAM ir procesorių skaičių. Taip pat išjunkite GUI režimą, jei jis įjungtas:

config.vm.provider "virtualbox" do |vb|
vb.gui = false
vb.memory = "4096"
vb.cpus = 4
end

Tinklo problemos – jei negalite pasiekti virtualios mašinos per tinklą, patikrinkite ugniasienės nustatymus. Taip pat įsitikinkite, kad naudojamas IP adresas nekonfliktauja su kitais jūsų tinklo įrenginiais.

Sinchronizacijos klaidos – jei failai nesinchronizuojasi teisingai, pabandykite pakeisti sinchronizacijos tipą. NFS paprastai veikia patikimiausiai, bet reikalauja papildomų teisių.

Kai kas nors eina ne taip, naudokite debug režimą, kad gautumėte daugiau informacijos:

vagrant up --debug

Jei mašina visiškai "užstrigo" ir nereaguoja į jokias komandas, galite ją priverstinai išjungti:

vagrant halt --force

O jei viskas visiškai sugedo ir norite pradėti iš naujo:

vagrant destroy -f
vagrant up

Kaip integruoti Vagrant į kasdienį workflow

Vagrant tampa tikrai naudingas, kai jį integruojate į savo kasdienį darbo procesą. Štai keletas praktinių patarimų, kaip tai padaryti efektyviai.

Pirmiausia, sukurkite bazinį Vagrantfile šabloną savo dažniausiai naudojamiems projektų tipams. Pavyzdžiui, vienas šablonas PHP projektams su Apache ir MySQL, kitas Node.js projektams su MongoDB. Laikykite juos atskiroje direktorijoje ir tiesiog kopijuokite, kai pradedate naują projektą.

Antra, naudokite Vagrant kartu su Git. Įtraukite Vagrantfile į savo repozitoriją, bet nepamirškite pridėti .vagrant/ direktoriją į .gitignore. Taip visi komandos nariai galės naudoti tą pačią aplinką, bet nepersikels nereikalingų virtualios mašinos failų.

Trečia, sukurkite alias komandas savo shell konfigūracijoje, kad greičiau galėtumėte vykdyti dažniausiai naudojamas Vagrant komandas:

alias vu='vagrant up'
alias vh='vagrant halt'
alias vs='vagrant ssh'
alias vr='vagrant reload'

Ketvirta, jei dirbate su keliais projektais vienu metu, naudokite vagrant global-status, kad pamatytumėte visas veikiančias virtualias mašinas. Tai padės išvengti situacijos, kai fone veikia kelios pamirštos mašinos ir ėda jūsų sistemos resursus.

Galiausiai, reguliariai atnaujinkite savo boxes ir Vagrant versiją. Naujos versijos dažnai turi našumo patobulinimų ir klaidų pataisymų, kurie gali žymiai pagerinti jūsų patirtį.

Vagrant nėra tobulas įrankis – jis gali būti lėtesnis nei Docker konteineriai ir užima daugiau vietos. Bet kai reikia pilnavertės operacinės sistemos testavimui arba kai projektas reikalauja specifinės aplinkos, kuri sunkiai pakartuojama konteineryje, Vagrant lieka nepakeičiamas. Svarbiausia – suprasti, kada jį naudoti ir kaip jį tinkamai sukonfigūruoti savo poreikiams. Su šiame straipsnyje pateiktomis žiniomis turėtumėte turėti tvirtą pagrindą pradėti efektyviai naudoti Vagrant savo projektuose.

Daugiau

Server-side request forgery (SSRF) prevencija