Бързо внедряване на 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 minimal
RAM: 1GB
HDD: 20GB
Selinux: disable
firewalld: disable

След това ще ни трябва 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, за да продължите.
SPОРАЗУМЕНИЕ ЗА ЛИЦЕНЗ С НАЧАЛЕН ПОТРЕБИТЕЛ
Съгласни ли сте? [да/не]: да
Продуктът е готов за инсталиране. Натиснете 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
tf 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" {
      + размер_boot_disk         = (известно после применения)
      + диск_хранилища           = "datastore1"
      + имя_гостя               = "centos7-test"
      + время_выключения_гостя = (известно после применения)
      + время_включения_гостя  = (известно после применения)
      + guestinfo              = {
          + "metadata"          = "base64text"
          + "metadata.encoding" = "gzip+base64"
          + "userdata"          = "base64text"
          + "userdata.encoding" = "gzip+base64"
        }
      + guestos                = (известно после применения)
      + id                     = (известно после применения)
      + ip_address             = (известно после применения)
      + размер_памяти          = "1024"
      + заметки                = (известно после применения)
      + количество_в_ЦПУ       = (известно после применения)
      + ovf_properties_timer   = (известно после применения)
      + ovf_source             = "\/root\/create-and-deploy-esxi\/output-packer-centos7-x86_64\/packer-centos7-x86_64.ova"
      + питание                = "включено"
      + имя_пул_ресурсов      = (известно после применения)
      + virthwver              = (известно после применения)

      + сетевые_интерфейсы {
          + mac_address     = (известно после применения)
          + тип_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