Terraform kullanarak vm ESXi'nin hızlı dağıtımı

Herkese merhaba, adım Ivan ve ben alkolik sistem yöneticisiyim (OPS).

Sizlere Terraform kullanarak ESXi üzerinde vCenter olmadan sanal makineleri nasıl dağıttığımı anlatmak istiyorum.

Çoğu zaman, şu veya bu uygulamayı test etmek için sanal makineleri dağıtmanız/yeniden oluşturmanız gerekir. Tembellik nedeniyle süreci otomatikleştirmeyi düşündüm. Aramam beni şirketin harika bir ürününe yönlendirdi Hashicorp, terraform.

Sanırım pek çok kişi Terraform'un ne olduğunu biliyor ama bilmeyenler için IasC konseptini kullanarak herhangi bir bulutu, altyapıyı veya hizmeti yönetmeye yönelik bir uygulamadır (Kod olarak altyapı).

ESXi'yi sanallaştırma ortamım olarak kullanıyorum. Oldukça basit, kullanışlı ve güvenilir.
Bir soru öngörüyorum.

VCenter Sunucusunu kullanabiliyorsanız neden terraform?

Tabii ki yapabilirsin, ama... Birincisi, bu ek bir lisanstır, ikincisi, bu ürün çok kaynak yoğundur ve ev sunucuma sığmaz ve üçüncüsü, becerilerinizi geliştirmek için bir fırsattır.

Intel NUC platformu sunucu görevi görür:

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

Ve böylece, ilk önce ilk şeyler.

Şimdilik esxi'yi yapılandıralım yani güvenlik duvarı ayarlarında VNC portunu açalım.

Varsayılan olarak dosya yazmaya karşı korumalıdır. Aşağıdaki manipülasyonları gerçekleştiriyoruz:

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

dosyanın sonuna aşağıdaki bloğu ekleyin:

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

Çıkıp kaydediyoruz. İzinleri geri değiştirin ve hizmeti yeniden başlatın:

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

Ana bilgisayar yeniden başlatılana kadar geçerlidir. Daha sonra bu manipülasyonun tekrarlanması gerekecektir.

Artık tüm işleri aynı sunucudaki sanal makinede yapacağım.

Özellikler:

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

Sonra ihtiyacımız var toptancı, aynı zamanda HashiCorp'un bir ürünüdür.

"Altın" görüntünün otomatik olarak birleştirilmesi gerekir. Gelecekte kullanacağımız şey.

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

Hareket halinde paketleyici versiyonu RedHat tabanlı aynı isimde bir paket içerebileceği için hata oluşabilir.

which -a packer
/usr/sbin/packer

Bunu çözmek için bir sembolik bağlantı oluşturabilir veya mutlak bir yol kullanabilirsiniz. /usr/bin/paketleyici.

Şimdi ovftool'a ihtiyacımız var indirme linki. İndirin, sunucuya koyun ve yükleyin:

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.

Hadi devam edelim.

Konser için ihtiyacım olan her şeyi hazırladım.

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

Klasöre iso işletim sistemi dağıtımını yüklemeniz gerekir. Benim durumumda centos 7.

Ayrıca dosyayı düzenlemeniz gerekiyor centos-7-base.json:

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

Tüm değişikliklerden sonra derlemeyi çalıştırın:

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

Her şey doğru şekilde yapılandırılmış ve belirtilmişse, işletim sisteminin otomatik kurulumunun bir resmini göreceksiniz. Bu işlem 7-8 dakikamı alıyor.

Klasörde başarıyla tamamlandıktan sonra çıktı-paketleyici-centos7-x86_64 bir ova dosyası olacak.

Terraform'u yükleyin:

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'un ESXi için bir sağlayıcısı olmadığından bir tane oluşturmanız gerekir.

Devam et:

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

Daha sonra sağlayıcıyı topluyoruz:

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

Bitiş çizgisindeyiz. Haydi imajımızı ortaya koyalım.

Klasöre gidin:

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

Öncelikle dosyayı düzenleyin değişkenler.tf. ESXi sunucusuna bir bağlantı belirtmeniz gerekir.

Dosyada network_config.cfg gelecekteki sanal makinenin ağ ayarlarını içerir. İhtiyaçlarımıza uyacak şekilde değiştiriyoruz ve tek satırı çalıştırıyoruz:

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

Peki, dosyada ana.tf farklıysa ova dosyasının yolunu kendi yolunuzla değiştirin.

Gerçek anı.

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.

Sona ermek:

terraform apply

Her şey doğru yapılırsa, 2-3 dakika içinde önceden oluşturulan görüntüden yeni bir sanal makine dağıtılacaktır.

Tüm bunları kullanma seçenekleri yalnızca sizin hayal gücünüzle sınırlıdır.

Sadece deneyimlerimi paylaşmak ve bu ürünlerle çalışırken ana noktaları göstermek istedim.

Teşekkürler!

Not: Yapıcı eleştiri almaktan memnuniyet duyarım.

Kaynak: habr.com