Швидкий деплой vm ESXi за допомогою Terraform

Всім привіт мене звати Іван і я алкоголік системний адміністратор (OPS).

Я б хотів розповісти, як розгортаю віртуальні машини на ESXi без vCenter за допомогою Terraform.

Досить часто доводиться розгортати/перетворювати віртуалки, щоб протестувати той чи інший додаток. Через лінощі я подумав про автоматизацію процесу. Мої пошуки привели мене до чудового продукту компанії hashicorp, тераформа.

Думаю багато хто знає що таке Terraform, а хто не знає, це додаток для управління будь-якою хмарою, інфраструктурою або службою використовуючи концепцію IasC (Інфраструктура як код).

Як середовище віртуалізації я використовую ESXi. Досить проста, зручна та надійна.
Передбачаю питання.

Навіщо terraform якщо можна використовувати vCenter Server?

Можна, звичайно, але. По-перше, це додаткова ліцензія, по-друге, даний продукт дуже ресурсомісткий і просто не поміститься на моєму домашньому сервері, і по-третє, можливість прокачати скіли.

Як сервер виступає платформа 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

На кроці packer version може виникнути помилка, оскільки в RedHat-based може бути пакет з такою ж назвою.

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.

Рухаємось далі.

На гіті я підготував усе потрібне.

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, потрібно його зібрати.

Ставимо go:

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: буду радий конструктивній критиці.

Джерело: habr.com

Додати коментар або відгук