Implementazione rapida di vm ESXi cù Terraform

Ciao à tutti, mi chjamu Ivan è sò un amministratore di u sistema alcoolicu (OPS).

Vogliu dì cumu implementà e macchine virtuali in ESXi senza vCenter cù Terraform.

Piuttostu spessu, avete da implementà / ricreà e macchine virtuali per pruvà questa o quella applicazione. A causa di a pigrizia, aghju pensatu à automatizà u prucessu. A mo ricerca m'hà purtatu à un pruduttu maravigliu di a cumpagnia hashicorp, terraform.

Pensu chì parechje persone sà ciò chì Terraform hè, è chì ùn cunnosci micca, questa hè una applicazione per gestisce qualsiasi nuvola, infrastruttura o serviziu cù u cuncettu IasC (Infrastruttura cum'è codice).

Aghju utilizatu ESXi cum'è u mo ambiente di virtualizazione. Piuttostu simplice, convenientu è affidabile.
Aghju anticipatu una dumanda.

Perchè terraform quandu pudete aduprà vCenter Server?

Pudete di sicuru, ma. Prima, questu hè una licenza addiziale, in segundu, stu pruduttu hè assai intensivu di risorse è simpricimenti ùn si mette micca in u mo servitore di casa, è in terzu, a capacità di aghjurnà e cumpetenze.

A piattaforma Intel NUC agisce cum'è un servitore:

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

È cusì, prima cosa prima.

Per avà, cunfiguremu esxi, vale à dì, apre u portu VNC in i paràmetri di u firewall.

Per automaticamente, u schedariu hè prutettu da scrittura. Facemu i seguenti manipulazioni:

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

aghjunghje u seguente bloccu à a fine di u schedariu:

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

Esci, salvà. Cambia i diritti è riavvia u serviziu:

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

Attuali finu à chì l'ospite hè riavviatu. Dopu questu, sta manipulazione deve esse ripetuta.

In più, aghju realizatu tuttu u travagliu in una macchina virtuale nantu à u stessu servitore.

I caratteristiche tecniche:

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

Dopu, avemu bisognu packer, ancu un pruduttu di HashiCorp.

Hè necessariu assemble automaticamente l'imaghjini "d'oru". chì avemu aduprà in u futuru.

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

In muvimentu versione packer un errore pò accade, postu chì basatu in RedHat pò cuntene un pacchettu cù u stessu nome.

which -a packer
/usr/sbin/packer

Per a suluzione, pudete creà un ligame simbolicu, o aduprà una strada assoluta /usr/bin/packer.

Avà avemu bisognu di ovftool scaricare pùntanu. Scaricate, mette nantu à u servitore è installate:

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.

Andemu avanti.

In u gith aghju preparatu tuttu ciò chì avete bisognu.

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

À u cartulare grande, avete bisognu di mette u kit di distribuzione di u sistema upirativu. In u mo casu, questu hè centos 7.

Avete ancu bisognu di edità u schedariu. centos-7-base.json:

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

Dopu tutti i cambiamenti, eseguite l'assemblea:

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

Se tuttu hè cunfiguratu è specificatu currettamente, allora vi vede una foto di a stallazione automatica di u sistema operatore. Stu prucessu mi pigghia 7-8 minuti.

Dopu à u cumpletu successu in u cartulare output-packer-centos7-x86_64 u schedariu ova serà situatu.

Installa 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

Siccomu Terraform ùn hà micca un fornitore per ESXi, avete bisognu di custruisce unu.

Mettimu andà :

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

Dopu, cullemu u fornitore:

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

Semu à a fine. Andemu à sparghje a nostra maghjina.

Andemu à u cartulare:

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

Prima di tuttu, edità u schedariu variàbbili.tf. Avete bisognu di specificà una cunnessione à u servitore ESXi.

In u schedariu network_config.cfg cuntene i paràmetri di a rete di a futura macchina virtuale. Cambia à i vostri bisogni è eseguite u one-liner:

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

Ebbè, in u schedariu principale.tf cambià u percorsu à u schedariu ova à u vostru propiu, se diversu.

U mumentu di a verità.

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.

Finitura:

terraform apply

Se tuttu hè fattu bè, allora in 2-3 minuti una nova macchina virtuale serà implementata da l'imaghjina fatta prima.

L'usi per tuttu questu sò limitati solu da a vostra imaginazione.

Vuliu solu sparte e migliori pratiche è mustrà i punti principali quandu u travagliu cù questi prudutti.

Grazie per l'attenzione!

PS: Seraghju cuntentu di critiche constructive.

Source: www.habr.com

Add a comment