Цель: хотим автоматизировать генерирование виртуалок из шаблона в 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