Αναπτύξτε γρήγορα το VM ESXi με το Terraform

Γεια σε όλους, με λένε Ιβάν και είμαι διαχειριστής συστήματος αλκοολούχων (OPS).

Θα ήθελα να σας πω πώς αναπτύσσω εικονικές μηχανές στο ESXi χωρίς vCenter χρησιμοποιώντας Terraform.

Αρκετά συχνά είναι απαραίτητο να αναπτυχθούν/αναδημιουργηθούν εικονικές μηχανές προκειμένου να δοκιμαστεί αυτή ή η άλλη εφαρμογή. Λόγω τεμπελιάς, σκέφτηκα να αυτοματοποιήσω τη διαδικασία. Η αναζήτησή μου με οδήγησε σε ένα υπέροχο προϊόν της εταιρείας hashicorp, τεραφόρμα.

Νομίζω ότι πολλοί άνθρωποι γνωρίζουν τι είναι το Terraform, και για όσους δεν το γνωρίζουν, είναι μια εφαρμογή για τη διαχείριση οποιουδήποτε cloud, υποδομής ή υπηρεσίας χρησιμοποιώντας την ιδέα IasC (Η υποδομή ως κωδικός).

Χρησιμοποιώ το ESXi ως περιβάλλον εικονικοποίησης. Αρκετά απλό, βολικό και αξιόπιστο.
Προβλέπω μια ερώτηση.

Γιατί terraform αν μπορείτε να χρησιμοποιήσετε τον διακομιστή vCenter;

Φυσικά και είναι δυνατόν, αλλά. Πρώτον, είναι μια πρόσθετη άδεια, δεύτερον, αυτό το προϊόν είναι πολύ εντάσεως πόρων και απλά δεν ταιριάζει στον οικιακό διακομιστή μου και τρίτον, η δυνατότητα αναβάθμισης δεξιοτήτων.

Η πλατφόρμα 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.)

Λοιπόν, ας τα πάρουμε όλα με τη σειρά.

Προς το παρόν, ας διαμορφώσουμε το esxi, δηλαδή να ανοίξουμε τη θύρα VNC στις ρυθμίσεις του τείχους προστασίας.

Από προεπιλογή, το αρχείο προστατεύεται από εγγραφή. Πραγματοποιούμε τους παρακάτω χειρισμούς:

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

προσθέτουμε το ακόλουθο μπλοκ στο τέλος του αρχείου:

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

Έξοδος, αποθήκευση. Αλλάζουμε τα δικαιώματα πίσω και επανεκκινούμε την υπηρεσία:

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

Ισχύει μέχρι να επανεκκινηθεί ο κεντρικός υπολογιστής. Στη συνέχεια, αυτός ο χειρισμός θα πρέπει να επαναληφθεί.

Από εδώ και πέρα, θα κάνω όλη τη δουλειά σε μια εικονική μηχανή στον ίδιο διακομιστή.

Χαρακτηριστικά:

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

Στη συνέχεια θα χρειαστούμε συσκευαστής, επίσης προϊόν της HashiCorp.

Χρειάζεται για την αυτόματη συναρμολόγηση της «χρυσής» εικόνας. Το οποίο θα χρησιμοποιήσουμε στο μέλλον.

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

Εν κινήσει έκδοση συσκευασίας ενδέχεται να προκύψει σφάλμα επειδή μπορεί να υπάρχει ένα πακέτο με το ίδιο όνομα στο RedHat.

which -a packer
/usr/sbin/packer

Για να το λύσετε αυτό, μπορείτε να δημιουργήσετε έναν συμβολικό σύνδεσμο ή να χρησιμοποιήσετε μια απόλυτη διαδρομή. /usr/bin/packer.

Τώρα χρειαζόμαστε ovftool κατεβάζω σύνδεσμος. Κατεβάστε, βάλτε τον στον διακομιστή και εγκαταστήστε:

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.

Ας προχωρήσουμε.

Έχω ετοιμάσει όλα τα απαραίτητα στο Gita.

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

Σε φάκελο ισο πρέπει να εγκαταστήσετε τη διανομή του λειτουργικού συστήματος. Στην περίπτωσή μου είναι centos 7.

Είναι επίσης απαραίτητο να επεξεργαστείτε το αρχείο centos-7-base.json:

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

Μετά από όλες τις αλλαγές, εκτελούμε την κατασκευή:

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

Εάν όλα έχουν ρυθμιστεί και καθοριστεί σωστά, θα δείτε μια εικόνα της αυτόματης εγκατάστασης του λειτουργικού συστήματος. Αυτή η διαδικασία μου παίρνει 7-8 λεπτά.

Μετά την επιτυχή ολοκλήρωση στο φάκελο output-packer-centos7-x86_64 θα βρεθεί το αρχείο ova.

Εγκαταστήστε το 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

Εφόσον η Terraform δεν έχει πάροχο για ESXi, πρέπει να δημιουργήσετε έναν.

Βάζουμε τέρμα:

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

Στη συνέχεια συγκεντρώνουμε τον πάροχο:

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

Είμαστε στη γραμμή του τερματισμού. Πάμε να ξεδιπλώσουμε την εικόνα μας.

Μεταβείτε στο φάκελο:

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

Πρώτα απ 'όλα, επεξεργαστείτε το αρχείο μεταβλητές.tf. Πρέπει να καθορίσετε μια σύνδεση με τον διακομιστή ESXi.

Στο αρχείο network_config.cfg περιέχει ρυθμίσεις δικτύου για τη μελλοντική εικονική μηχανή. Το αλλάζουμε για να ταιριάζει στις ανάγκες μας και λανσάρουμε το one-liner:

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

Λοιπόν, στο αρχείο κύρια.τφ αλλάξτε τη διαδρομή προς το αρχείο ova στο δικό σας εάν είναι διαφορετικό.

Η στιγμή της αλήθειας.

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.

Φινίρισμα:

terraform apply

Εάν όλα γίνονται σωστά, τότε σε 2-3 λεπτά θα αναπτυχθεί μια νέα εικονική μηχανή από την εικόνα που δημιουργήθηκε προηγουμένως.

Οι επιλογές για τη χρήση όλων αυτών περιορίζονται μόνο από τη φαντασία σας.

Ήθελα απλώς να μοιραστώ την εμπειρία μου και να δείξω τα κύρια σημεία κατά την εργασία με αυτά τα προϊόντα.

Ευχαριστώ για την προσοχή!

ΥΓ: Θα εκτιμούσα την εποικοδομητική κριτική.

Πηγή: www.habr.com