Deploy i shpejtë vm ESXi me Terraform

Përshëndetje, unë quhem Ivan dhe jam një administrator sistemesh (OPS) që ka probleme me alkoolin.

Do doja të flisja se si i vendos makinën virtuale në ESXi pa vCenter duke përdorur Terraform.

Shpesh më duhet të krijoj/rikrijoj virtuale për të testuar ndonjë aplikacion. për shkak të lenies mendova për automatizimin e procesit. Kërkimet e mia më çuan te një produkt të shkëlqyer nga hashicorp, terraform.

Mendoj se shumë janë të vetëdijshëm se çfarë është Terraform, dhe për ata që nuk e dinë, ky është një aplikacion për menaxhimin e çdo cloud-i, infrastrukture ose shërbimi duke përdorur konceptin IasC (Infrastruktura si kod).

Si mjedis virtualizimi përdor ESXi. Mjaft i thjeshtë, i përshtatshëm dhe i besueshëm.
E parashikoj pyetjen.

Pse terraform nëse mund të përdorësh vCenter Server?

Natyrisht, mundesh, por: Së pari, kjo do të ishte një licencë shtesë, së dyti, ky produkt është shumë kërkues ndaj burimeve dhe thjesht nuk do të mund të vendoset në serverin tim shtëpiak, dhe së treti, kjo është një mundësi për të përmirësuar aftësitë e mia.

Si server po shërben platforma Intel NUC:

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

Dhe tani, le të fillojmë nga fillimi.

Më parë le të konfigurojmë esxi, dhe specifikisht të hapim portin VNC në cilësimet e firewall-it.

Së pari, skedari është i mbrojtur nga shkrimi. Kryejmë veprimet e mëposhtme:

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

Shtojmë në fund të skedarit bllokun e mëposhtëm:

packer-vnc
  
    inbound
    tcp
    dst
    
      5900
      6000
    
  
  true
  true

Dalim, ruajmë. Ndryshojmë të drejtat dhe rinisim shërbimin:

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

Kjo është e vlefshme deri në rinisjen e hostit. Pas kësaj, do të duhet të përsërisim këtë veprim.

Më pas, të gjitha punët do t'i kryej në makinën virtuale në këtë server.

Karakteristikat:

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

Më pas do na nevojitet packer, gjithashtu një produkt i HashiCorp.

Kjo Ă«shtĂ« e nevojshme pĂ«r ndĂ«rtimin automatik tĂ« njĂ« imazhi ‘tĂ« artë’. I cili do tĂ« pĂ«rdoret nĂ« tĂ« ardhmen.

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

Në hapin packer version mund të ketë një gabim, pasi në RedHat-based mund të ndodhet një paketë me të njëjtin emër.

which -a packer
/usr/sbin/packer

Për të zgjidhur mund të krijoni një simlink, ose të përdorni rrugën absolute /usr/bin/packer.

Tani na nevojitet ovftool linku i shkarkimit. E shkarkojmë, e vendosim në server dhe e instalim:

chmod +x VMware-ovftool-4.4.0-15722219-lin.x86_64.bundle
./VMware-ovftool-4.4.0-15722219-lin.x86_64.bundle
Ekstraktimi i Installer VMware...përfundoi.
Duhet të pranoni Marrëveshjen e Licencës për Përdoruesin Fundor të VMware OVF Tool për Linux për të vazhduar.  Shtypni Enter për të vazhduar.
MARRËVESHJA E LICENCËS PËR PËRDORUESIN FUNDOR VMWARE
A pajtoheni? [po/jo]:po
Produkti është gati për t'u instaluar.  Shtypni Enter për të filluar
instalimin ose Ctrl-C për të anuluar. 
Instalimi i komponentit VMware OVF Tool për Linux 4.4.0
    Konfigurimi...
[######################################################################] 100%
Instalimi ishte i suksesshëm.

Të vazhdojmë.

Në git kam përgatitur gjithçka që na nevojitet.

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

Në dosjen iso duhet të vendosni distribucionin e sistemit operativ. Në rastin tim, kjo është centos 7.

Po ashtu, është e nevojshme të redaktoni skedarin centos-7-base.json:

variables: të specifikoni të dhënat tuaja për lidhjen
iso_urls: të specifikoni të dhënat aktuale
iso_checksum: kontrolli i imazhit tuaj 

Pas të gjitha ndryshimeve, nisim ndërtimin:

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

Nëse gjithçka është konfiguruar dhe specifikuar saktë, atëherë do të shihni procesin e instalimit automatizuar të sistemit operativ. Ky proces do të zgjaste 7-8 minuta për mua.

Pas përfundimit të suksesshëm, në dosjen output-packer-centos7-x86_64 do të gjendet skedari ova.

Instalojmë 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
tf -v
Terraform v0.12.24

Duke qenë se Terraform nuk ka provajder për ESXi, duhet ta krijojmë atë.

Instalo 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

Pastaj krijojmë provajderin:

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

Jemi në finish. Le të fillojmë të shpërndajmë imazhin tonë.

Kalojmë në dosjen:

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

Së pari, redaktojmë skedarin variables.tf. Duhet të specifikoni lidhjen me serverin ESXi.

Në skedar network_config.cfg do të përmbajë konfigurimet e rrjetit për makinat virtuale të ardhshme. I ndryshojmë sipas nevojave tona dhe nisim komandën e vetme:

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

Dhe në skedarin main.tf ndryshoni rrugën për skedarin ova në tuajën, nëse është e ndryshme.

Momenti i vërtetë.

terraform init
Duke initializing the backend...

Duke initializing provider plugins...

The following providers do not have any version constraints in configuration,
so the latest version was installed.

To prevent automatic upgrades to new major versions that may contain breaking
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings
suggested below.

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

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

terraform plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.

data.template_file.Default: Refreshing state...
data.template_file.network_config: Refreshing state...

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

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # esxi_guest.Default will be created
  + resource "esxi_guest" "Default" {
      + boot_disk_size         = (known after apply)
      + disk_store             = "datastore1"
      + guest_name             = "centos7-test"
      + guest_shutdown_timeout = (known after apply)
      + guest_startup_timeout  = (known after apply)
      + guestinfo              = {
          + "metadata"          = "base64text"
          + "metadata.encoding" = "gzip+base64"
          + "userdata"          = "base64text"
          + "userdata.encoding" = "gzip+base64"
        }
      + guestos                = (known after apply)
      + id                     = (known after apply)
      + ip_address             = (known after apply)
      + memsize                = "1024"
      + notes                  = (known after apply)
      + numvcpus               = (known after apply)
      + ovf_properties_timer   = (known after apply)
      + ovf_source             = "/root/create-and-deploy-esxi/output-packer-centos7-x86_64/packer-centos7-x86_64.ova"
      + power                  = "on"
      + resource_pool_name     = (known after apply)
      + virthwver              = (known after apply)

      + network_interfaces {
          + mac_address     = (known after apply)
          + nic_type        = (known after apply)
          + virtual_network = "VM Network"
        }
    }

Plan: 1 to add, 0 to change, 0 to destroy.

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

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.

Finish:

terraform apply

If everything is done correctly, a new virtual machine will be deployed in 2-3 minutes from the previously created image.

The usage options for all this are limited only by imagination.

I just wanted to share my developments and show the main points when working with these products.

Thank you for your attention!

P.S.: I would appreciate constructive criticism.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster