Déploiement rapide vm ESXi avec Terraform

Bonjour à tous, je m'appelle Ivan et je suis administrateur du système alcoolique (OPS).

Je voudrais vous dire comment déployer des machines virtuelles sur ESXi sans vCenter en utilisant Terraform.

Très souvent, vous devez déployer / recréer des machines virtuelles pour tester telle ou telle application. En raison de la paresse, j'ai pensé à automatiser le processus. Mes recherches m'ont conduit à un merveilleux produit hashicorp , terraform .

Je pense que beaucoup de gens savent ce qu'est Terraform, et qui ne le sait pas, c'est une application pour gérer n'importe quel cloud, infrastructure ou service en utilisant le concept IasC ( Infrastructure as code ).

En tant qu'environnement de virtualisation, j'utilise ESXi. Assez simple, pratique et fiable.
Je prévois une question.
Pourquoi terraformer si vous pouvez utiliser vCenter Server?
Vous pouvez bien sûr, mais. Premièrement, il s'agit d'une licence supplémentaire, deuxièmement, ce produit est très gourmand en ressources et ne tient tout simplement pas sur mon serveur domestique, et troisièmement, la possibilité de mettre à niveau les compétences.

Le serveur est la plateforme Intel NUC:

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

Et donc, tout d'abord.

Pour l'instant, configurons esxi, à savoir, ouvrons le port VNC dans les paramètres du pare-feu.

Par défaut, le fichier est protégé en écriture. Nous effectuons les manipulations suivantes:

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

ajoutez le bloc suivant à la fin du fichier:

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

Quittez, enregistrez. Nous modifions les droits et redémarrons le service:

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

Dans ce cas, VNC est nécessaire pour se connecter à la machine virtuelle et spécifier le chemin d'accès au fichier kickstart.

En fait, avant de redémarrer l'hôte. Après cela, cette manipulation devra être répétée.

De plus, je vais effectuer tout le travail dans une machine virtuelle sur le même serveur.

Les caractéristiques:

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

Ensuite, nous avons besoin de packer , également un produit de HashiCorp.

Il est nécessaire pour l'assemblage automatique de l'image "dorée". Que nous utiliserons à l'avenir.

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

Une erreur peut se produire à l'étape de la version du packer , car un package portant le même nom peut être basé sur RedHat.

which -a packer
/usr/sbin/packer

Pour résoudre, vous pouvez créer un lien symbolique ou utiliser le chemin absolu / usr / bin / packer.

Maintenant, nous avons besoin du lien de téléchargement ovftool . Téléchargez, mettez sur le serveur et installez:

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.

Continuons.

Sur une gita, j'ai préparé tout ce dont j'avais besoin.

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

Dans le dossier iso , vous devez mettre la distribution du système d'exploitation. Dans mon cas c'est centos 7.

Il faut aussi éditer le fichier centos-7-base.json :

variables:     
iso_urls:  
iso_checksum:    

Après toutes les modifications, exécutez l'assembly:

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

Si tout est configuré et spécifié correctement, vous verrez une image de l'installation automatique du système d'exploitation.
packer-centos7-x86_64 output will be in this color.

==> packer-centos7-x86_64: Retrieving ISO
    packer-centos7-x86_64: Using file in-place: file:///root/create-and-deploy-esxi/iso/CentOS-7-x86_64-Minimal-1908.iso
==> packer-centos7-x86_64: Remote cache was verified skipping remote upload...
==> packer-centos7-x86_64: Creating required virtual machine disks
==> packer-centos7-x86_64: Building and writing VMX file
==> packer-centos7-x86_64: Starting HTTP server on port 8494
==> packer-centos7-x86_64: Registering remote VM...
==> packer-centos7-x86_64: Starting virtual machine...
    packer-centos7-x86_64: The VM will be run headless, without a GUI. If you want to
    packer-centos7-x86_64: view the screen of the VM, connect via VNC with the password "" to
    packer-centos7-x86_64: vnc://10.10.10.10:5900
==> packer-centos7-x86_64: Waiting 7s for boot...
==> packer-centos7-x86_64: Connecting to VM via VNC (10.10.10.10:5900)
==> packer-centos7-x86_64: Typing the boot command over VNC...
==> packer-centos7-x86_64: Waiting for SSH to become available...



Ce processus prend 7 à 8 minutes.

Une fois l'opération terminée, le fichier ova sera situé dans le dossier output-packer-centos7-x86_64 .

Installez 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

Étant donné que Terraform n'a pas de fournisseur pour ESXi, vous devez le créer.

Mettez-y:

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

Ensuite, nous collectons le fournisseur:

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

Nous sommes à la ligne d'arrivée. Allons déployer notre image.

Accédez au dossier:

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

Tout d'abord, modifiez le fichier variables.tf . Vous devez spécifier une connexion au serveur ESXi.

Le fichier network_config.cfg contient les paramètres réseau de la future machine virtuelle. Nous changeons selon nos besoins et gérons une ligne:

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

Eh bien, dans le fichier main.tf, changez le chemin du fichier ova par le vôtre, s'il est différent.

Le moment de vérité.

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.

La fin:

terraform apply

Si tout est fait correctement, après 2-3 minutes, une nouvelle machine virtuelle sera déployée à partir de l'image précédemment créée.

Les options pour utiliser tout cela ne sont limitées que par l'imagination.

Je voulais juste partager les meilleures pratiques et montrer les principaux points lors de l'utilisation de ces produits.

Merci de votre attention!

PS: Je me ferai un plaisir de faire des critiques constructives.

All Articles