Cum îți poți face o imagine de Vagrant ?

TL;DR

Fie că instalezi sau imporți o mașină virtuală și o customizezi ca să o expoți folosești :

vagrant package nume_mașină

Ca să te bucuri de ea, în Vagrantfile, pui:
config.vm.box = nume_mașină
sau poți crea un proiect nou folosind
vagrant init nume cale/către/fișierul/exportat/la/package

Bare box – Ca și definiție simplistă, care-mi vine acum, ar fi o imagine a unei mașini virtuale pe care o folosești ca bază pentru a creea alte mașini virtuale. Imaginea asta poate să conțină setări predefinite, cât și aplicații preinstalate. Spre ex, ai putea creea o imagine care conține ceva setări de network speciale și pe lângă astea, să ai preinstalat nginx , mysql și php7. Just imagine… dar, realizezi că imagini simple de genul există deja și le poți folosi just like that. Take a look here.

Varianta propusă aici cu VirtualBox și Vagrant (mai există și Docker și nu numai…) e o alternativă la XAMPP și WAMP.

Diferența majoră dintre ele : cu Vagrant și Virtualbox poți crea un mediu de dezvoltare exact ca și mediul unde o să fie lansată aplicația sau poți creea clustere care comunică între ele, fiecare vm cu aplicația și mediul lui. Ca și exemplu, să presupunem că ai 2 aplicații web și ambele folosesc php, dar versiuni diferite. Poți pune ambele aplicații pe o singură mașină cu ambele versiuni de php instalate și o să meargă, dar când o să le pui individual pe mașinile de producție, există șanse să nu mai meargă. Un alt exemplu ar fi să ai un serviciu REST care are un domain whitelist și mai mulți consumatori cu domenii diferite și multe altele…

Un alt beneficiu e că poți da clientului/prietenilor proiectul și ei testează EXACT pe același mediu pe care tu faci dezvoltarea.

Și cum, „Vorba multă, sărăcia omului”…

1st avem nevoie de-un working vm:

  1. Dacă ai o imagine a unei mașini și nu e în formatul vdi (ex. qcow2) ai nevoie de un tool să o convertești. QEMU e recomandarea mea. Instalezi tool-ul, deschizi un PowerShell (cu admin rights) și execuți : &'QEMU/instalation/path/qemu-img.exe' convert -O vdi cale/imagine/ce/dorești/convertită.format cale/unde/vrei/imaginea/convertită.vdi. Ca și exemplu, folosind qcow2 : &'C:\Program Files\qemu\qemu-img.exe' convert -O vdi D:\VM\centos-7.qcow2 D:\VM\centos-7.vdi;
  2. Dacă ai un ISO/CD (btw, mai există?) poți defini o mașină nouă în virtualbox, adaugi ISO/CD și bootezi de pe el și termini install-ul;
  3. Daca ai un vdi deja și nu e de vagrant, just boot the vm;
  4. Dacă mai există și un alt caz, care nu mi-a venit acum, ideea e să ai un working vm (booted & ready) în virtualbox la final.

Tot ce urmează se aplică unui vm care nu-i importat din vagrant și e rezultat de la pasul de mai sus. După cum urmează, or să fie comment și comanda ce trebuie rulată.

# Bootezi mașina dacă nu ai făcut asta
# Te autentifici (loghezi) pe ea
# Și te faci boss
sudo su -
# Creezi userul vagrant
adduser vagrant
# Îl adaugi la grupul wheel
usermod -a -G wheel vagrant
# Pui la user o parolă - parola trebuie să fie vagrant
passwd vagrant
# Îl facem și pe el boss
visudo -f /etc/sudoers.d/vagrant -> add vagrant ALL=(ALL) NOPASSWD:ALL
# Creem folderul unde o să punem public key-ul
mkdir -p /home/vagrant/.ssh
# Setăm permisiuni de read, write, execute doar pe user pe folderul creat
chmod 0700 /home/vagrant/.ssh/
# Instalăm wget să putem lua pub key-ul oficial
yum -y install wget
# Descărcăm pub key-ul
wget https://raw.githubusercontent.com/hashicorp/vagrant/master/keys/vagrant.pub -O /home/vagrant/.ssh/authorized_keys
# Setăm read & write pe fișier (sshd requirements)
chmod 0600 /home/vagrant/.ssh/authorized_keys
# Pentru că suntem root, setăm owner-ul ca fiind vagrant
chown -R vagrant /home/vagrant/.ssh
# Edităm sshd config-ul și setăm următoarele:
#### PubKeyAuthentication yes
#### AuthorizedKeysFile %h/.ssh/authorized_keys
#### PermitEmptyPasswords no
vi /etc/ssh/sshd_config
# Dăm un restart la sshd
systemctl restart sshd
# Instalăm librăriile de development (trebe la Guest Additions)
yum group install "Development Tools"
yum -y install kernel-heders kernel-devel
# Optional, dacă imaginea vine preinstalată cu Polkit, trebuie creat un Policy ptr userul vagrant
# Crează fișierul vagrant.pkla în local authority:
#### vi /etc/polkit-1/localauthority/50-local.d/vagrant.pkla
# Adaugă următoarele și salvează
#### [Vagrant e Boss de BOSS]
#### Identity=unix-user:vagrant
#### Action=*
#### ResultAny=yes
#### ResultInactive=yes
#### ResultActive=yes
# Dăm un restart la mașină și ne logam cu userul vagrant (pass vagrant)
reboot
# Ca să poți partaja directoare cu host-ul (adică mașina pe care rulează vm-ul) ai nevoie să instalezi guest additions
# Ca să faci asta, pe bara de sus în virtual box (unde rulează mașina virtuală), faci click pe Devices și alegi Insert Guest Additions CD image...
# Pe mașina virtuală o să facem mount la el cu comanda:
sudo mount /dev/cdrom /media/
# Instalăm
sudo sh /media/VBoxLinuxAdditions.run
# Îi facem clean-up și o oprim
sudo yum clean all && sudo rm -rf /var/cache/yum && cat /dev/null > ~/.bash_history && history -c && halt -p

Poți copia ce-i mai sus în ordinea prezentată și ar trebui să fie ok (dacă nu, scrie-mi și corectez sau imbunătățesc unde-i cazul).

Acum, ca să o exporți, deschizi un cmd unde dorești să o salvezi și rulezi
vagrant package --base numele-mașinii-pe-care-l-ai-dat-când-ai-adăugat-o-în-virtual-box
Dacă toate sunt ok ar trebui să găsești un fișier package.box. Poți să-i faci rename la ce vrei tu.

Ca să-l poți folosi in vagrant trebuie 1st să-l adaugi:
vagrant box add numele-fișierului.box

Și ca să începi un proiect nou cu el (în oricare alt folder de pe pc, după ce l-ai adăugat mai sus)
vagrant init numele-fișierului.box

Spor și baftă la creat vm-uri!