Dezvoltare rapidă a mașinilor virtuale ESXi folosind Terraform

Salut tuturor, mă numesc Ivan și sunt un administrator de sisteme alcoolic (OPS).

Aș dori să împărtășesc cum desfășor mașini virtuale pe ESXi fără vCenter folosind Terraform.

Destul de des trebuie să desfășor/recreez mașini virtuale pentru a testa diverse aplicații. Din cauza lenii, m-am gândit să automatizez procesul. Căutările mele m-au condus la un produs minunat al companiei hashicorp, terraform.

Cred că mulți știu ce este Terraform, iar cine nu știe, este o aplicație pentru gestionarea oricărui cloud, infrastructură sau serviciu folosind conceptul IasC (Infrastructure as Code).

Ca mediu de virtualizare, folosesc ESXi. Un sistem destul de simplu, convenabil și de încredere.
Anticipez întrebarea.

De ce terraform dacă putem folosi vCenter Server?

Sigur, se poate, dar. În primul rând, este o licență suplimentară, în al doilea rând, acest produs este foarte resursiv și pur și simplu nu va încăpea pe serverul meu de acasă, iar în al treilea rând, există oportunitatea de a-mi dezvolta abilitățile.

Ca server, folosesc platforma Intel NUC:

CPU: 2 CPUs x Intel(R) Core(TM) i3-4010U CPU @ 1.70GHz
RAM: 8Gb
HDD: 500Gb
Versiune ESXi: ESXi-6.5.0-4564106-standard (VMware, Inc.)

Deci, să începem.

Între timp, să configurăm ESXi, adică să deschidem portul VNC în setările firewall-ului.

Din păcate, fișierul este protejat împotriva scrierii. Facem următoarele manevre:

chmod 644 /etc/vmware/firewall/service.xml
chmod +t /etc/vmware/firewall/service.xml
vi /etc/vmware/firewall/service.xml

Adăugăm următorul bloc la sfârșitul fișierului:

packer-vnc
  
    inbound
    tcp
    dst
    
      5900
      6000
    
  
  true
  true

Ieșim, salvăm. Schimbăm permisiunile înapoi și repornim serviciul:

chmod 444 /etc/vmware/firewall/service.xml
esxcli network firewall refresh

Valabil până la repornirea gazdei. După aceea, această manevră va trebui repetată.

În continuare, voi desfășura toată munca într-o mașină virtuală pe același server.

Specificații:

OS: Centos 7 x86_64 minimal
RAM: 1GB
HDD: 20GB
Selinux: disable
firewalld: disable

Apoi avem nevoie de packer, de asemenea, un produs al companiei HashiCorp.

Este necesar pentru construirea automată a unui "imagine de aur". Pe care o vom folosi în viitor.

yum install unzip git -y
curl -O https://releases.hashicorp.com/packer/1.5.5/packer_1.5.5_linux_amd64.zip
unzip packer_1.5.5_linux_amd64.zip -d /usr/bin && rm -rf packer_1.5.5_linux_amd64.zip
packer version
Packer v1.5.5

La pasul packer version poate apărea o eroare, deoarece în sistemele bazate pe RedHat poate exista un pachet cu același nume.

which -a packer
/usr/sbin/packer

Pentru a rezolva, putem crea un symlink sau folosi calea absolută. /usr/bin/packer.

Acum avem nevoie de ovftool. link de descărcare. Descărcăm, punem pe server și instalăm:

chmod +x VMware-ovftool-4.4.0-15722219-lin.x86_64.bundle
./VMware-ovftool-4.4.0-15722219-lin.x86_64.bundle
Se extrage instalatorul VMware... gata.
Trebuie să acceptați acordul de licență pentru utilizatorul final al VMware OVF Tool pentru Linux pentru a continua.  Apăsați Enter pentru a continua.
ACORDUL DE LICENȚĂ PENTRU UTILIZATORUL FINAL VMWARE
Sunteți de acord? [da/nu]:da
Produsul este gata pentru a fi instalat.  Apăsați Enter pentru a începe
instalarea sau Ctrl-C pentru a anula.
Se instalează componenta VMware OVF Tool pentru Linux 4.4.0
    Se configurează...
[######################################################################] 100%
Instalarea a fost un success.

Continuăm.

Pe Git am pregătit tot ce este necesar.

git clone https://github.com/letnab/create-and-deploy-esxi.git && cd create-and-deploy-esxi

În folderul iso trebuie să plasați distribuția sistemului de operare. În cazul meu, este centos 7.

De asemenea, este necesar să editați fișierul centos-7-base.json:

variables: specificați datele proprii pentru conectare
iso_urls: specificați actualul
iso_checksum: suma de control a imaginii dvs. 

După toate modificările, lansăm construcția:

/usr/bin/packer build centos-7-base.json

Dacă totul este configurat corect, veți asista la procesul de instalare automată a sistemului de operare. Acest proces durează 7-8 minute în cazul meu.

După finalizarea cu succes, în folderul output-packer-centos7-x86_64 se va afla fișierul ova.

Instalăm Terraform:

curl -O https://releases.hashicorp.com/terraform/0.12.24/terraform_0.12.24_linux_amd64.zip
unzip terraform_0.12.24_linux_amd64.zip -d /usr/bin/ && rm -rf terraform_0.12.24_linux_amd64.zip
terraform version
Terraform v0.12.24

Deoarece Terraform nu are un provider pentru ESXi, trebuie să-l construim.

Instalăm go:

cd /tmp
curl -O https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.14.2.linux-amd64.tar.gz && rm -rf go1.14.2.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
go version
go version go1.14.2 linux/amd64

Apoi construim providerul:

go get -u -v golang.org/x/crypto/ssh
go get -u -v github.com/hashicorp/terraform
go get -u -v github.com/josenk/terraform-provider-esxi
export GOPATH="$HOME/go"
cd $GOPATH/src/github.com/josenk/terraform-provider-esxi
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags '-w -extldflags "-static"' -o terraform-provider-esxi_`cat version`
cp terraform-provider-esxi_`cat version` /usr/bin

Suntem aproape de final. Să descărcăm imaginea noastră.

Trecem în folder:

cd /root/create-and-deploy-esxi/centos7

În primul rând, edităm fișierul variables.tf. Trebuie să specificați conexiunea la serverul ESXi.

În fișierul network_config.cfg conține setările de rețea pentru viitoarea mașină virtuală. Le modificăm după nevoile noastre și lansăm comanda:

sed -i -e '2d' -e '3i "network": "'$(gzip < network_config.cfg| base64 | tr -d 'n')'",' metadata.json

Și în fișierul main.tf schimbați calea către fișierul ova, dacă este diferită.

Momentul adevărului.

terraform init
Inițializarea backend-ului...

Inițializarea plugin-urilor provider...

Următorii provideri nu au constrângeri de versiune în configurație,
astfel încât a fost instalată cea mai recentă versiune.

Pentru a preveni actualizările automate la noi versiuni majore care ar putea conține schimbări
brute, se recomandă adăugarea de constrângeri version = "..." la
blocurile provider corespunzătoare în configurație, cu șirurile de constrângere
sugestionate mai jos.

* provider.esxi: version = "~> 1.6"
* provider.template: version = "~> 2.1"

Terraform a fost inițializat cu succes!

Puteți începe acum să lucrați cu Terraform. Încercați să rulați "terraform plan" pentru a vedea
orice modificări necesare pentru infrastructura dvs. Toate comenzile Terraform
ar trebui să funcționeze acum.

Dacă vreodată setați sau modificați modulele sau configurația backend pentru Terraform,
re-rulați această comandă pentru a reinițializa directorul de lucru. Dacă uitați, alte
comenzi o vor detecta și vă vor aminti să faceți acest lucru dacă este necesar.

terraform plan
Reîmprospătând starea Terraform în memorie înainte de plan...
Starea reîmprospătată va fi utilizată pentru a calcula acest plan, dar nu va fi
persistată în stocarea locală sau remote.

data.template_file.Default: Reîmprospătând starea...
data.template_file.network_config: Reîmprospătând starea...

------------------------------------------------------------------------

Un plan de execuție a fost generat și este afișat mai jos.
Acțiunile resurselor sunt indicate cu următoarele simboluri:
  + creați

Terraform va efectua următoarele acțiuni:

  # esxi_guest.Default va fi creat
  + resource "esxi_guest" "Default" {
      + boot_disk_size         = (cunoscut după aplicare)
      + disk_store             = "datastore1"
      + guest_name             = "centos7-test"
      + guest_shutdown_timeout = (cunoscut după aplicare)
      + guest_startup_timeout  = (cunoscut după aplicare)
      + guestinfo              = {
          + "metadata"          = "base64text"
          + "metadata.encoding" = "gzip+base64"
          + "userdata"          = "base64text"
          + "userdata.encoding" = "gzip+base64"
        }
      + guestos                = (cunoscut după aplicare)
      + id                     = (cunoscut după aplicare)
      + ip_address             = (cunoscut după aplicare)
      + memsize                = "1024"
      + notes                  = (cunoscut după aplicare)
      + numvcpus               = (cunoscut după aplicare)
      + ovf_properties_timer   = (cunoscut după aplicare)
      + ovf_source             = "/root/create-and-deploy-esxi/output-packer-centos7-x86_64/packer-centos7-x86_64.ova"
      + power                  = "on"
      + resource_pool_name     = (cunoscut după aplicare)
      + virthwver              = (cunoscut după aplicare)

      + network_interfaces {
          + mac_address     = (cunoscut după aplicare)
          + nic_type        = (cunoscut după aplicare)
          + virtual_network = "VM Network"
        }
    }

Plan: 1 de adăugat, 0 de modificat, 0 de distrus.

------------------------------------------------------------------------

Notă: Nu ați specificat un parametru "-out" pentru a salva acest plan, astfel încât Terraform
nu poate garanta că exact aceste acțiuni vor fi efectuate dacă
"terraform apply" este rulat ulterior.

Final:

terraform apply

Dacă totul a fost făcut corect, atunci în 2-3 minute va fi desfășurată o nouă mașină virtuală din imaginea creată anterior.

Opțiunile de utilizare pentru toate acestea sunt limitate doar de imaginație.

Am vrut doar să împărtășesc realizările și să arăt principalele momente în lucrul cu aceste produse.

Vă mulțumesc pentru atenție!

P.S.: Aș fi bucuros să primesc critici constructive.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster