Бързо разгръщане на vm ESXi с помощта на Terraform

Здравейте, аз съм Иван и съм системен администратор (OPS).

Бих искал да споделя как разгръщам виртуални машини на ESXi без vCenter с помощта на Terraform.

Доста често се налага да разгръщам/пересъздавам виртуални машини, за да тествам определено приложение. В резултат на мързела си, помислих за автоматизация на процеса. Търсенията ми ме отведоха до отличния продукт на компанията hashicorp, terraform.

Мисля, че много хора знаят какво е 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 версия: 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

добавяме следния блок към края на файла:

packer-vnc
  
    inbound
    tcp
    dst
    
      5900
      6000
    
  
  true
  true

Изход, запазваме. Връщаме правата обратно и перезареждаме услугата:

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

Актуално до рестартиране на хоста. След това, тази манипулация ще трябва да се повтори.

По-нататък цялата работа ще върша във виртуалната машина на същия сървър.

Характеристики:

OS: Centos 7 x86_64 минимален
RAM: 1GB
HDD: 20GB
Selinux: изключен
firewalld: изключен

Следва ни е необходим packer, също продукт на компанията 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-базирани системи може да съществува пакет с такова име.

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
Извличане на VMware инсталатора... готово.
Трябва да приемете лицензіонното споразумение за компонента VMware OVF Tool за Linux, за да продължите. Натиснете Enter, за да продължите.
VMWARE ЛИЦЕНЗИОННО СПОРАЗУМЕНИЕ ЗА КРАЙНИ ПОЛЗВАТЕЛИ
Съгласни ли сте? [да/не]:да
Продуктът е готов да бъде инсталиран. Натиснете Enter, за да започнете инсталацията или Ctrl-C, за да отмените.
Инсталиране на компонента VMware OVF Tool за Linux 4.4.0
    Конфигуриране...
[######################################################################] 100%
Инсталацията завърши успешно.

Продължаваме напред.

На Git подготових всичко необходимо.

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

Първо редактираме файла variables.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
Инициализация бэкенда...

Инициализация плагинов провайдера...

Следующие провайдеры не имеют ограничений по версиям в конфигурации,
поэтому была установлена последняя версия.

Чтобы предотвратить автоматическое обновление до новых основных версий, которые могут содержать
ломающие изменения, рекомендуется добавить ограничения version = "..." к соответствующим блокам провайдера в конфигурации,
с предложенными ниже строками ограничений.

* provider.esxi: version = "~> 1.6"
* provider.template: version = "~> 2.1"

Terraform успешно инициализирован!

Теперь вы можете начать работать с Terraform. Попробуйте запустить "terraform plan", чтобы увидеть
любые изменения, которые требуются для вашей инфраструктуры. Все команды Terraform
должны теперь работать.

Если вы когда-либо устанавливаете или изменяете модули или конфигурацию бэкенда для Terraform,
повторно выполните эту команду, чтобы переинициализировать ваш рабочий каталог. Если вы забудете,
другие команды обнаружат это и напомнят вам об этом, если это будет необходимо.

terraform plan
Обновление состояния Terraform в памяти перед планом...
Обновлённое состояние будет использоваться для расчёта этого плана, но не будет
сохранено в локальном или удалённом хранилище состояния.

data.template_file.Default: Обновление состояния...
data.template_file.network_config: Обновление состояния...

------------------------------------------------------------------------

Был сгенерирован план выполнения, который показан ниже.
Действия с ресурсами обозначены следующими символами:
  + создать

Terraform выполнит следующие действия:

  # esxi_guest.Default будет создан
  + ресурс "esxi_guest" "Default" {
      + размер_диска_загрузки       = (известно после применения)
      + хранилище_дисков             = "datastore1"
      + имя_гостя                    = "centos7-test"
      + тайм-аут_выключения_гостя   = (известно после применения)
      + тайм-аут_включения_гостя    = (известно после применения)
      + информация_о_госте           = {
          + "метаданные"          = "base64text"
          + "кодировка.метаданные" = "gzip+base64"
          + "пользовательские_данные" = "base64text"
          + "кодировка.пользовательские_данные" = "gzip+base64"
        }
      + операционная_система        = (известно после применения)
      + id                          = (известно после применения)
      + ip_адрес                   = (известно после применения)
      + размер_памяти              = "1024"
      + заметки                     = (известно после применения)
      + количество_vCPU            = (известно после применения)
      + таймер_ovf_properties      = (известно после применения)
      + источник_ovf               = "/root/create-and-deploy-esxi/output-packer-centos7-x86_64/packer-centos7-x86_64.ova"
      + питание                    = "включено"
      + имя_пула_ресурсов         = (известно после применения)
      + версия_виртуализации       = (известно после применения)

      + сетевые_интерфейсы {
          + mac_адрес        = (известно после применения)
          + тип_nic         = (известно после применения)
          + виртуальная_сеть = "VM Network"
        }
    }

План: 1 для добавления, 0 для изменения, 0 для удаления.

------------------------------------------------------------------------

Примечание: Вы не указали параметр "-out" для сохранения этого плана, поэтому Terraform
не может гарантировать, что именно эти действия будут выполнены при последующем запуске "terraform apply".

Завершение:

terraform apply

Если все сделано правильно, то через 2-3 минуты будет развёрнута новая виртуальная машина из ранее созданного образа.

Варианты использования всего этого ограничены только фантазией.

Я просто хотел поделиться разработками и показать основные моменты при работе с этими продуктами.

Спасибо за внимание!

P.S.: буду рад конструктивной критике.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster