Hurtig deployment af vm ESXi med Terraform

Hej alle, mit navn er Ivan, og jeg er en systemadministrator (OPS) alkoholiker.

Jeg vil gerne tale om, hvordan jeg deployer virtuelle maskiner på ESXi uden vCenter ved hjælp af Terraform.

Ofte skal jeg deploye/genskabe virtuelle maskiner for at teste en given applikation. Af faulhed overvejede jeg at automatisere processen. Mine søgninger førte mig til et fantastisk produkt fra virksomheden hashicorp, terraform.

Jeg tror mange ved, hvad Terraform er, men for dem, der ikke ved det, er det et program til at administrere enhver cloud, infrastruktur eller service ved hjælp af IasC-konceptet (Infrastruktur som kode).

Som virtualiseringsmiljø bruger jeg ESXi. Ret enkelt, praktisk og pålideligt.
Jeg forudser spørgsmålet.

Hvorfor Terraform, hvis man kan bruge vCenter Server?

Det kan man selvfølgelig, men. For det første, det er en ekstra licens, for det andet, dette produkt er meget ressourcekrævende og vil simpelthen ikke kunne være på min hjemme-server, og for det tredje muligheden for at forbedre mine færdigheder.

Serveren er Intel NUC platformen:

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

Og så, lad os tage det hele i rækkefølge.

Lad os først konfigurere ESXi, specifikt åbne VNC-porten i firewallindstillingerne.

Som standard er filen skrivebeskyttet. Vi laver følgende manipulationer:

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

vi tilføjer følgende blok til slutningen af filen:

packer-vnc
  
    inbound
    tcp
    dst
    
      5900
      6000
    
  
  true
  true

Vi afslutter, gemmer. Ændrer rettighederne tilbage, og genstarter tjenesten:

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

Gælder indtil hosten genstartes. Efter det skal denne manipulation gentages.

Fremover vil jeg udføre alt arbejde i en virtuel maskine på denne samme server.

Specifikationer:

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

Derefter har vi brug for packer, også et produkt fra HashiCorp.

Det er nødvendigt til automatisk opbygning af et "guld" billede. Som vi vil bruge i fremtiden.

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

På trinnet packer version Der kan opstå en fejl, da der i RedHat-baserede systemer muligvis findes en pakke med det samme navn.

which -a packer
/usr/sbin/packer

For at løse dette kan man oprette et symlink eller bruge en absolut sti. /usr/bin/packer.

Nu har vi brug for ovftool. download link. Downloader, lægger det på serveren og installerer:

chmod +x VMware-ovftool-4.4.0-15722219-lin.x86_64.bundle
./VMware-ovftool-4.4.0-15722219-lin.x86_64.bundle
Uddrager VMware Installer...færdig.
Du skal acceptere VMware OVF Tool komponentens for Android-bruger
Licensaftale for at fortsætte. Tryk Enter for at fortsætte.
VMWARE BRUGER LICENSE AFTALE
Accepterer du? [yes/no]:yes
Produktet er klar til installation. Tryk Enter for at begynde
installationen eller Ctrl-C for at annullere.
Installerer VMware OVF Tool komponent til Linux 4.4.0
    Konfigurerer...
[######################################################################] 100%
Installationen var succesfuld.

Lad os gå videre.

På Git har jeg forberedt alt det nødvendige.

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

I mappen iso man skal placere distributionsfilen til operativsystemet. I mit tilfælde er det centos 7.

Det er også nødvendigt at redigere filen centos-7-base.json:

variables: angiv dine data til forbindelse
iso_urls: angiv aktuel
iso_checksum: checksum for dit billede 

Efter alle ændringerne starter vi bygningen:

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

Hvis alt er konfigureret korrekt, vil du se billedet af den automatiske installation af operativsystemet. Denne proces tager mig 7-8 minutter.

Efter vellykket afslutning vil der være en mappe output-packer-centos7-x86_64 hvor ova-filen vil befinde sig.

Vi installerer 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

Da Terraform ikke har en udbyder til ESXi, skal den samles.

Installerer 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

Herefter samler vi udbyderen:

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

Vi er ved at være færdige. Lad os begynde at distribuere vores billede.

Lad os gå til mappen:

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

Først redigerer vi filen variables.tf. Vi skal angive forbindelsen til ESXi-serveren.

I filen network_config.cfg vil indeholde netværksindstillingerne for den kommende virtuelle maskine. Ændre dem efter behov og køre en enkelt linje:

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

Og i filen main.tf ændrer vi stien til ova-filen til vores, hvis den er anderledes.

Det er det afgørende øjeblik.

terraform init
Initialiserer backend...

Initialiserer udbyderplugins...

De følgende udbydere har ikke nogen versionsbegrænsninger i konfigurationen,
så den nyeste version blev installeret.

For at forhindre automatiske opgraderinger til nye hovedversioner, der kan indeholde breaking
ændringer, anbefales det at tilføje version = "..." begrænsninger til de
tilsvarende udbyderblokke i konfigurationen, med de foreslåede begrænsningsstrenge nedenfor.

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

Terraform er blevet succesfuldt initialiseret!

Du kan nu begynde at arbejde med Terraform. Prøv at køre "terraform plan" for at se
eventuelle ændringer, der er nødvendige for din infrastruktur. Alle Terraform-kommandoer
bør nu fungere.

Hvis du nogensinde sætter eller ændrer moduler eller backend-konfiguration for Terraform,
skal du køre denne kommando igen for at geninitialisere din arbejdsmappe. Hvis du glemmer det, vil andere
kommandoer opdage det og minde dig om at gøre det, hvis det er nødvendigt.

terraform plan
Opdaterer Terraform-tilstand i hukommelsen inden plan...
Den opdaterede tilstand vil blive brugt til at beregne denne plan, men vil ikke blive
beholdt i lokal eller fjern tilstandslager.

data.template_file.Default: Opdaterer tilstand...
data.template_file.network_config: Opdaterer tilstand...

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

En udførelsesplan er blevet genereret og vises nedenfor.
Ressourcehandlinger er angivet med følgende symboler:
  + opret

Terraform vil udføre de følgende handlinger:

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

      + network_interfaces {
          + mac_address     = (kendt efter anvendelse)
          + nic_type        = (kendt efter anvendelse)
          + virtual_network = "VM Network"
        }
    }

Plan: 1 tilføjelse, 0 ændringer, 0 ødelæggelser.

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

Bemærk: Du specificerede ikke en "-out" parameter til at gemme denne plan, så Terraform
kan ikke garantere, at præcis disse handlinger vil blive udført, hvis
"terraform apply" senere køres.

Afslutning:

terraform apply

Hvis alt er gjort korrekt, vil en ny virtuel maskine blive udrullet fra det tidligere gjorte image om 2-3 minutter.

Mulighederne for at bruge alt dette er kun begrænset af fantasien.

Jeg ville bare dele mine erfaringer og vise de væsentlige punkter ved arbejde med disse produkter.

Tak for opmærksomheden!

P.S.: Jeg vil være glad for konstruktiv kritik.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster