Snel implementeren van vm ESXi met Terraform

Hallo allemaal, mijn naam is Ivan en ik ben een alcoholist systeembeheerder (OPS).

Ik zou je willen vertellen hoe ik virtuele machines op ESXi implementeer zonder vCenter met behulp van Terraform.

Heel vaak moet u virtuele machines implementeren / opnieuw maken om deze of gene applicatie te testen. Vanwege luiheid dacht ik erover om het proces te automatiseren. Mijn zoektocht leidde me naar een prachtig product van het bedrijf hashicorp, terraform.

Ik denk dat veel mensen weten wat Terraform is, en wie niet weet, dit is een applicatie voor het beheren van elke cloud, infrastructuur of service met behulp van het IasC-concept (Infrastructuur als code).

Ik gebruik ESXi als mijn virtualisatieomgeving. Heel eenvoudig, handig en betrouwbaar.
Ik anticipeer op een vraag.

Waarom terraform als u vCenter Server kunt gebruiken?

Dat kan natuurlijk, maar. Ten eerste is dit een extra licentie, ten tweede is dit product zeer arbeidsintensief en past het simpelweg niet op mijn thuisserver, en ten derde de mogelijkheid om vaardigheden te upgraden.

Het Intel NUC-platform fungeert als een server:

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.)

En dus, de eerste dingen eerst.

Laten we voorlopig esxi instellen, namelijk de VNC-poort openen in de firewall-instellingen.

Het bestand is standaard tegen schrijven beveiligd. We voeren de volgende manipulaties uit:

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

voeg het volgende blok toe aan het einde van het bestand:

<service id="1000">
  <id>packer-vnc</id>
  <rule id="0000">
    <direction>inbound</direction>
    <protocol>tcp</protocol>
    <porttype>dst</porttype>
    <port>
      <begin>5900</begin>
      <end>6000</end>
    </port>
  </rule>
  <enabled>true</enabled>
  <required>true</required>
</service>

Afsluiten, opslaan. Wijzig de rechten terug en start de service opnieuw:

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

Actueel totdat de host opnieuw wordt opgestart. Daarna zal deze manipulatie moeten worden herhaald.

Verder zal ik al het werk uitvoeren in een virtuele machine op dezelfde server.

Productspecificaties:

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

Vervolgens hebben we nodig packer, ook een product van HashiCorp.

Het is nodig om automatisch de "gouden" afbeelding samen te stellen. die we in de toekomst zullen gebruiken.

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

Onderweg packer versie er kan een fout optreden, aangezien op RedHat gebaseerd een pakket met dezelfde naam kan bevatten.

which -a packer
/usr/sbin/packer

Voor de oplossing kunt u een symlink maken of een absoluut pad gebruiken /usr/bin/packer.

Nu hebben we ovftool nodig download link. Downloaden, op de server zetten en installeren:

chmod +x VMware-ovftool-4.4.0-15722219-lin.x86_64.bundle
./VMware-ovftool-4.4.0-15722219-lin.x86_64.bundle
Extracting VMware Installer...done.
You must accept the VMware OVF Tool component for Linux End User
License Agreement to continue.  Press Enter to proceed.
VMWARE END USER LICENSE AGREEMENT
Do you agree? [yes/no]:yes
The product is ready to be installed.  Press Enter to begin
installation or Ctrl-C to cancel. 
Installing VMware OVF Tool component for Linux 4.4.0
    Configuring...
[######################################################################] 100%
Installation was successful.

We gaan verder.

Op de gitaar heb ik alles voorbereid wat je nodig hebt.

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

Naar map iso u moet de distributiekit van het besturingssysteem plaatsen. In mijn geval is dit centos 7.

U moet het bestand ook bewerken. centos-7-base.json:

variables: указать свои данные для подключения
iso_urls: указать актуальный
iso_checksum: чексумма вашего образа 

Voer na alle wijzigingen de assembly uit:

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

Als alles correct is geconfigureerd en opgegeven, ziet u een afbeelding van de automatische installatie van het besturingssysteem. Dit proces kost me 7-8 minuten.

Na succesvolle afronding in de map uitvoer-packer-centos7-x86_64 ova-bestand zal worden gevonden.

Terraform installeren:

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

Aangezien Terraform geen provider voor ESXi heeft, moet u er een bouwen.

We zetten aan de slag:

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

Vervolgens verzamelen we de provider:

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

We zijn bij de finish. Laten we ons imago gaan uitrollen.

Laten we naar de map gaan:

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

Bewerk eerst het bestand variabelen.tf. U moet de verbinding met de ESXi-server specificeren.

In bestand netwerk_config.cfg bevatten de netwerkinstellingen van de toekomstige virtuele machine. Verander naar uw behoeften en voer de oneliner uit:

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

Wel in het dossier hoofd.tf verander het pad naar het ova-bestand naar uw eigen pad, indien anders.

Het moment van de waarheid.

terraform init
Initializing the backend...

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.

Af hebben:

terraform apply

Als alles correct is gedaan, wordt binnen 2-3 minuten een nieuwe virtuele machine geïmplementeerd vanuit de eerder gemaakte afbeelding.

Het gebruik van dit alles wordt alleen beperkt door uw verbeeldingskracht.

Ik wilde alleen de best practices delen en de belangrijkste punten laten zien bij het werken met deze producten.

Bedankt voor de aandacht!

PS: Ik zal blij zijn met opbouwende kritiek.

Bron: www.habr.com

Voeg een reactie