Déploiement rapide de VM ESXi à l'aide de Terraform

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

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

Il arrive souvent que je doive 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 produit remarquable de la société hashicorp, terraform.

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

Comme environnement de virtualisation, j'utilise ESXi. C'est assez simple, pratique et fiable.
Je prévois la question.

Pourquoi Terraform si l'on peut utiliser vCenter Server ?

On peut le faire, mais. Premièrement, c'est une licence supplémentaire, deuxièmement, ce produit est très gourmand en ressources et ne tiendra tout simplement pas sur mon serveur domestique, et troisièmement, c'est une occasion d'améliorer mes compétences.

La plateforme Intel NUC joue le rôle du serveur :

CPU : 2 processeurs x Intel(R) Core(TM) i3-4010U CPU @ 1,70 GHz
RAM : 8 Go
HDD : 500 Go
Version d'ESXi : ESXi-6.5.0-4564106-standard (VMware, Inc.)

Ainsi, faisons les choses dans l'ordre.

Pour l'instant, configurons ESXi, c'est-à-dire 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

Nous ajoutons le bloc suivant à la fin du fichier :

packer-vnc
  
    inbound
    tcp
    dst
    
      5900
      6000
    
  
  true
  true

Nous quittons, sauvegardons. Nous changeons les droits de retour et redémarrons le service :

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

Cela reste valable jusqu'au redémarrage de l'hôte. Après cela, il faudra répéter cette manipulation.

Ensuite, tout le travail sera effectué dans la machine virtuelle sur ce même serveur.

Caractéristiques :

OS : CentOS 7 x86_64 minimal
RAM : 1 Go
HDD : 20 Go
Selinux : désactivé
firewalld : désactivé

Ensuite, nous aurons besoin de packer, ainsi que du produit de la société HashiCorp.

Il est nécessaire pour la construction automatique de l'image "golden". 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

À l'étape packer version Une erreur peut survenir, car un paquet avec le même nom peut exister dans les distributions basées sur RedHat.

which -a packer
/usr/sbin/packer

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

Nous aurons désormais besoin de ovftool. lien de téléchargement. Téléchargez-le, placez-le sur le serveur et installez-le :

chmod +x VMware-ovftool-4.4.0-15722219-lin.x86_64.bundle
./VMware-ovftool-4.4.0-15722219-lin.x86_64.bundle
Extraction de l'installateur VMware...terminé.
Vous devez accepter l'accord de licence utilisateur final de VMware OVF Tool pour Linux pour continuer. Appuyez sur Entrée pour continuer.
ACCORD DE LICENCE UTILISATEUR FINAL VMWARE
Acceptez-vous ? [oui/non]: oui
Le produit est prêt à être installé. Appuyez sur Entrée pour commencer l'installation ou Ctrl-C pour annuler.
Installation du composant VMware OVF Tool pour Linux 4.4.0
    Configuration...
[######################################################################] 100%
L'installation a réussi.

Continuons.

Sur Git, j'ai préparé tout le nécessaire.

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

Dans le dossier iso vous devez placer le fichier d'installation du système d'exploitation. Dans mon cas, il s'agit de centos 7.

Il est également nécessaire de modifier le fichier centos-7-base.json:

variables: indiquer vos données de connexion
iso_urls: indiquer le lien actuel
iso_checksum: la somme de contrôle de votre image 

Après toutes les modifications, nous lançons la construction :

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

Si tout est correctement configuré et spécifié, vous verrez le processus d'installation automatique du système d'exploitation. Ce processus prend environ 7 à 8 minutes pour moi.

Après une installation réussie, le fichier ova se trouvera dans le dossier output-packer-centos7-x86_64 sera présent.

Nous installons 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
version de terraform
Terraform v0.12.24

Comme Terraform n'a pas de fournisseur pour ESXi, nous devons le créer.

Installons 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

Ensuite, nous construisons 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 sur la dernière ligne droite. 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 indiquer la connexion au serveur ESXi.

Dans le fichier network_config.cfg contiendra les paramètres réseau de la future machine virtuelle. Modifiez-les selon vos besoins et lancez la commande :

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

Et dans le fichier main.tf modifiez le chemin du fichier ova pour le vôtre, s'il est différent.

Le moment de vérité.

terraform init
Initialisation du backend...

Initialisation des plugins du fournisseur...

Les fournisseurs suivants n'ont aucune contrainte de version dans la configuration,
la dernière version a donc été installée.

Pour éviter les mises à jour automatiques vers de nouvelles versions majeures pouvant
contenir des changements disruptifs, il est recommandé d'ajouter des contraintes de version = "..."
dans les blocs de fournisseur correspondants dans la configuration, avec les chaînes de contraintes
suggérées ci-dessous.

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

Terraform a été initialisé avec succès !

Vous pouvez maintenant commencer à travailler avec Terraform. Essayez d'exécuter "terraform plan" pour voir
les changements nécessaires pour votre infrastructure. Toutes les commandes Terraform devraient maintenant fonctionner.

Si vous définissez ou modifiez des modules ou la configuration du backend pour Terraform,
réexécutez cette commande pour réinitialiser votre répertoire de travail. Si vous oubliez, d'autres
commandes le détecteront et vous rappelleront de le faire si nécessaire.

terraform plan
Rafraîchissement de l'état Terraform en mémoire avant le plan...
L'état rafraîchi sera utilisé pour calculer ce plan, mais ne sera pas
persisté dans le stockage d'état local ou distant.

data.template_file.Default: Rafraîchissement de l'état...
data.template_file.network_config: Rafraîchissement de l'état...

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

Un plan d'exécution a été généré et est montré ci-dessous.
Les actions sur les ressources sont indiquées par les symboles suivants :
  + créer

Terraform effectuera les actions suivantes :

  # esxi_guest.Default sera créé
  + resource "esxi_guest" "Default" {
      + boot_disk_size         = (connu après l'application)
      + disk_store             = "datastore1"
      + guest_name             = "centos7-test"
      + guest_shutdown_timeout = (connu après l'application)
      + guest_startup_timeout  = (connu après l'application)
      + guestinfo              = {
          + "metadata"          = "base64text"
          + "metadata.encoding" = "gzip+base64"
          + "userdata"          = "base64text"
          + "userdata.encoding" = "gzip+base64"
        }
      + guestos                = (connu après l'application)
      + id                     = (connu après l'application)
      + ip_address             = (connu après l'application)
      + memsize                = "1024"
      + notes                  = (connu après l'application)
      + numvcpus               = (connu après l'application)
      + ovf_properties_timer   = (connu après l'application)
      + ovf_source             = "/root/create-and-deploy-esxi/output-packer-centos7-x86_64/packer-centos7-x86_64.ova"
      + power                  = "on"
      + resource_pool_name     = (connu après l'application)
      + virthwver              = (connu après l'application)

      + network_interfaces {
          + mac_address     = (connu après l'application)
          + nic_type        = (connu après l'application)
          + virtual_network = "VM Network"
        }
    }

Plan : 1 à ajouter, 0 à changer, 0 à détruire.

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

Remarque : vous n’avez pas spécifié de paramètre "-out" pour enregistrer ce plan, donc Terraform
ne peut garantir que ces actions seront exactement effectuées si
"terraform apply" est ensuite exécuté.

Fin :

terraform apply

Si tout a été fait correctement, une nouvelle machine virtuelle sera déployée à partir de l'image précédemment créée dans 2 à 3 minutes.

Les utilisations de tout cela ne sont limitées que par votre imagination.

Je voulais simplement partager mes travaux et montrer les points essentiels lors de l'utilisation de ces produits.

Merci de votre attention !

P.S. : Je serais ravi de recevoir des critiques constructives.

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster