Автоматическое генерирование виртуалок в esxi

    Цель: хотим автоматизировать генерирование виртуалок из шаблона в vcenter, используя какую-либо систему управления конфигурациями (ansible) или утилиту управления облачными ресурсами (terraform). Что получим в итоге - развернутую виртуалку и основное ради чего это затевалось - ее ip адрес. В документации по обоим продуктам все в принципе расписано, просто скомпоную в одном месте + некоторые свои пометки.

 

Даем примерные минимальные права для пользователя vcenter, чтобы можно было деплоить виртуалки из шаблона:

Datastore: Allocate space, Browse Datastore

Network: Assign Network

Resource: Assign vm to resource pool

vApp:  Add virtual machine

Virtual Machine:

     Configuration: все кроме, Query Fault Tolerance Compatibility, Raw device, remove disk, Host usb device, swapfile placement, unlock VM, upgrade VM compatibility

     Inventory: Create from existing, register

     Provision: allow disk access, allow VM downloaded, allow VM files uploaded, customize,  deploy template, mark as VM, modify customization optimization, promote disks

 

1) terraform

    Chef, Puppet, Ansible, and SaltStack are all “configuration management” tools, which means they are designed to install and manage software on existing servers. CloudFormation and Terraform are “orchestration tools”, which means they are designed to provision the servers themselves, leaving the job of configuring those servers to other tools.

Решил попробовать данную утилиту, очень даже ничего... Плюс в том, что не требует установки и зависимостей, просто качается бинарник. Создаем указанные файлы в какой-либо папке

cat deploy_vm.tf 

provider "vsphere" {
  user           = "${var.vcenter_username}"
  password       = "${var.vcenter_password}"
  vsphere_server = "${var.vcenter_ip}"

allow_unverified_ssl = true

}
resource "vsphere_virtual_machine" "web" {
  name   = "${var.guest_name}"
  vcpu   = 1
  memory = 1024
#fix error: "vsphere_virtual_machine.web: Customization of the guest operating system 'rhel6_64Guest' is not supported in this configuration"
skip_customization =  true

  disk {
    template = "${var.template["centos"]}"
    type = "thin"
     datastore = "${var.datastore}"
  }

   network_interface {
     label = "${var.network}"
  }
}

  "vsphere_virtual_machine" - это resource type, который собственно и сделает то, что мы хотим; "web" - произвольный resource name

Второй файл

 cat variables.tf 
variable "vcenter_username" {}
variable "vcenter_password" {}
variable "vcenter_ip" {}
variable "guest_name" {}
variable "template" { type = "map" }
variable "datastore" {}
variable "network" {}

 Третий файл

cat terraform.tfvars 
vcenter_username = "user"
vcenter_password = "pass"
vcenter_ip = "ip_address"
guest_name = "terraform-test"
template = {
   debian = "TemplateDebian8.9-amd64"
   centos = "TemplateCentos7.3-amd64"
}
datastore = "name_datastore"
network = "VM Network 123"

 

 В файле terraform.tfvars переменная template - это словарь с ключами debian и centos и значениями, совпадающим с именем шаблонов виртуальных машин в vcenter, переменные datastore и network - соответственно название datastore, куда будет разворачиваться шаблон виртуалки и название сети, в которой окажется сетевой адаптер виртуальной машины.

 Потом далее запускаем 3 команды находясь  в этой папке:

terraform plan - посмотреть что будет сделано
terraform apply - применить изменения
terraform show - посмотреть что получили (особенно полученный ip адрес, если для указанной сети VM Network 123 есть dhcp)

Некоторы возможные проблемы:

--- На шаблонной виртуалке обязательно должны быть установлены vmware tools, иначе при terraform apply виртуалка создатся, но потом будет вечно

vsphere_virtual_machine.web: Still creating... (16m40s elapsed)
vsphere_virtual_machine.web: Still creating... (16m50s elapsed)
.....

Видимо terraform ждет информацию по полученному ip адресу для виртуалки, без установленных tools это не получается сделать

--- Если при terraform plan утилита напишет, что указанного шаблона не существует, хотя 100% он есть, то надо в vcenter указанный шаблон Remove from Inventory, потом Add to inventory ( зайти в datastore, хранящий шаблон, ПКМ на файл с расширением wtx -add to inventory)

--- Чтобы сгенерировать новую ВМ с новым именем, необходимо удалить файл terraform.tfstate, иначе terraform посчитает, что необходимо текущую сгенерированную виртуалку потушить и создать новую.

2) Тоже самое можно сделать через  ansible, пробуем

 Пример:

cat vcenter.yml 
---
- hosts: 127.0.0.1
  connection: local
  tasks:
   - include_vars: variables.yml
   - name: deploy VM from template
     vsphere_guest:
        vcenter_hostname: "{{ vcenter_ip }}"
        username: "{{ vcenter_username }}"
        password: "{{ vcenter_password }}"
        validate_certs: no

        esxi: 
          datacenter: test
          hostname: "{{ esxi_host }}"
        
        guest: "{{ guest_name }}"
        from_template: yes
        template_src: "{{ template.debian }}"

   - vsphere_guest:
       vcenter_hostname: "{{ vcenter_ip }}"
       username: "{{ vcenter_username }}"
       password: "{{ vcenter_password }}"
       guest: "{{ guest_name }}"
       validate_certs: no
       vmware_guest_facts: yes

  Файл с переменными variables.yml содержит критичные учетные данные, поэтому желательно создать его шифрованным:

 Редактирование файла:

ansible-vault edit variables.yml

vcenter_ip: IP
vcenter_username: USER
vcenter_password: PASS
esxi_host: IP2
guest_name: vm-test
template:
   debian: TemplateDebian8.9-amd64
   centos: TemplateCentos7.3-amd64
   freebsd: TemplateFreeBSD10.1

  Запуск playbook:

ansible-playbook -i hosts.esxi --ask-vault-pass vcenter.yml

 

 

 

 

 

 

 

 

Please publish modules in offcanvas position.