توسعه سریع vm ESXi با Terraform

سلام به همه، نام من ایوان است و من یک مدیر سیستم الکلی (OPS) هستم.

من می خواهم به شما بگویم که چگونه ماشین های مجازی را در ESXi بدون vCenter با استفاده از Terraform مستقر کنم.

اغلب، برای آزمایش این یا آن برنامه، باید ماشین های مجازی را مستقر یا دوباره ایجاد کنید. به دلیل تنبلی، به فکر خودکار کردن فرآیند افتادم. جستجوی من به محصول فوق العاده این شرکت منجر شد hashicorp, terraform.

من فکر می کنم بسیاری از مردم می دانند Terraform چیست، و چه کسی نمی داند، این یک برنامه کاربردی برای مدیریت هر ابر، زیرساخت یا سرویس با استفاده از مفهوم IasC است (زیرساخت به عنوان کد).

من از ESXi به عنوان محیط مجازی سازی خود استفاده می کنم. بسیار ساده، راحت و قابل اعتماد.
من یک سوال را پیش بینی می کنم

وقتی می‌توانید از سرور vCenter استفاده کنید، چرا terraform؟

شما البته می توانید، اما. اولاً این یک مجوز اضافی است، ثانیاً این محصول بسیار پرمخاطب است و به سادگی روی سرور خانگی من نمی گنجد و سوم اینکه توانایی ارتقاء مهارت ها را دارد.

پلت فرم 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

برای راه حل، می توانید یک Symlink ایجاد کنید، یا از یک مسیر مطلق استفاده کنید /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

به پوشه ISO شما باید کیت توزیع سیستم عامل را قرار دهید. در مورد من، این 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 شامل تنظیمات شبکه ماشین مجازی آینده است. به نیازهای خود تغییر دهید و تک لاینر را اجرا کنید:

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

خوب، در پرونده main.tf اگر متفاوت است، مسیر فایل 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 دقیقه یک ماشین مجازی جدید از تصویر ساخته شده قبلی مستقر می شود.

استفاده از همه اینها فقط با تخیل شما محدود می شود.

من فقط می خواستم بهترین روش ها را به اشتراک بگذارم و نکات اصلی را هنگام کار با این محصولات نشان دهم.

از توجه شما متشکرم

PS: از انتقاد سازنده خوشحال خواهم شد.

منبع: www.habr.com

اضافه کردن نظر