Γρήγορη ανάπτυξη 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.

Προχωράμε.

Στο gith ετοίμασα όλα όσα χρειάζεστε.

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

Προσθέστε ένα σχόλιο