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 je déploie des machines virtuelles sur ESXi sans vCenter en utilisant Terraform.

Bien souvent, il faut déployer/recréer des machines virtuelles afin de tester telle ou telle application. Par paresse, j'ai pensé à automatiser le processus. Ma recherche m'a conduit à un merveilleux produit de l'entreprise 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 utilisant le concept IasC (Infrastructure en tant que code).

J'utilise ESXi comme environnement de virtualisation. Assez simple, pratique et fiable.
J'anticipe une question.

Pourquoi terraformer quand 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 rentre tout simplement pas sur mon serveur domestique, et troisièmement, la possibilité de mettre à niveau les compétences.

La plateforme Intel NUC fait office de serveur :

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, les premières choses 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, sauvegardez. Modifiez les droits et redémarrez le service :

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

Réel jusqu'au redémarrage de l'hôte. Après cela, cette manipulation devra être répétée.

De plus, j'effectuerai tout le travail dans une machine virtuelle sur le même serveur.

Caractéristiques:

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

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

Il est nécessaire d'assembler automatiquement 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

En mouvement version packer une erreur peut se produire, car RedHat-based peut contenir un paquet portant le même nom.

which -a packer
/usr/sbin/packer

Pour la solution, vous pouvez créer un lien symbolique ou utiliser un chemin absolu /usr/bin/packer.

Maintenant, nous avons besoin d'ovftool lien de téléchargement. 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.

Nous passons à autre chose.

Sur le gith, j'ai préparé tout ce dont vous avez besoin.

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

Vers le dossier iso vous devez mettre le kit de distribution du système d'exploitation. Dans mon cas, il s'agit de centos 7.

Vous devez également modifier 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. Ce processus me prend 7-8 minutes.

Après avoir réussi dans le dossier sortie-packer-centos7-x86_64 ova sera localisé.

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 en créer un.

Nous mettons aller:

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.

Allons dans le dossier :

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

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

En fichier réseau_config.cfg contiennent les paramètres réseau de la future machine virtuelle. Modifiez selon vos besoins et exécutez le one-liner :

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

Eh bien, dans le dossier main.tf changez le chemin d'accès au 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.

Finir:

terraform apply

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

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

Je voulais juste partager les meilleures pratiques et montrer les points principaux lorsque l'on travaille avec ces produits.

Je vous remercie!

PS: Je serai heureux de critique constructive.

Source: habr.com

Ajouter un commentaire