[Программирование] Как импортировать существующие виртуальные машины VMWare в Terraform (перевод)
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Будущих учащихся на курсе "Infrastructure as a code in Ansible", а также всех желающих приглашаем принять участие в открытом вебинаре на тему "Управление Kubernetes при помощи Kubespray".
И по устоявшейся традиции делимся с вами переводом полезной статьи.
Terraform — это потрясающее средство для автоматизации управления инфраструктурой. Все параметры вашей инфраструктуры можно записать в виде кода, который будет обслуживаться соответствующей группой. Это означает, что ваша инфраструктура будет прозрачной и не будет подвержена неожиданным изменениям.Первоначально опубликовано в блоге techbeatly; там же доступны другие статьи по теме.Читайте также: Программа обучения и советы по прохождению экзамена HashiCorp Certified Terraform Associate.Возможно, вы уже знаете, что в Terraform можно импортировать существующую инфраструктуру, после чего дальнейшее управление этой инфраструктурой осуществляется уже в Terraform. В целом это вполне обыкновенный процесс для облачной инфраструктуры, однако я заметил, что некоторые инженеры сталкиваются с трудностями при импорте имеющихся у них виртуальных машин VMWare. Поэтому я написал это краткое руководство о том, как импортировать существующие виртуальные машины VMWare в Terraform. Продемонстрировано это будет на примере импорта одной виртуальной машины.Шаг 1. Получение сведений о существующей виртуальной машине из VMWare vCenterВыполните вход в VMWare vCenter и найдите данные виртуальной машины. Вам потребуются такие данные, как центр обработки данных, папка виртуальной машины, имя виртуальной машины, ЦП, память, диск и т. д.Если у вашей виртуальной машины есть особые параметры конфигурации, например дополнительные диски, дополнительные сетевые адаптеры или нестандартные аппаратные характеристики, обязательно укажите их в коде Terraform.Шаг 2. Создание кода Terraform для существующей виртуальной машиныВ Terraform нет возможности импортировать существующую инфраструктуру в код Terraform. Вместо этого приходится писать конфигурацию Terraform, соответствующую имеющейся инфраструктуре, и импортировать ее.Ниже приведен код Terraform, который я написал для виртуальной машины со следующим путем и именем: /DC1/vm/DEV/DEV2.См. содержимое файла vmware-import-vm.tf.
provider "vsphere" {
user = var.vsphere_user
password = var.vsphere_password
vsphere_server = var.vsphere_server
# If you have a self-signed cert
allow_unverified_ssl = true
}
data "vsphere_datacenter" "dc" {
name = "DC1"
}
data "vsphere_datastore" "datastore" {
name = "datastore1"
datacenter_id = data.vsphere_datacenter.dc.id
}
data "vsphere_compute_cluster" "cluster" {
name = "AZ1"
datacenter_id = data.vsphere_datacenter.dc.id
}
data "vsphere_network" "network" {
name = "VM Network"
datacenter_id = data.vsphere_datacenter.dc.id
}
resource "vsphere_virtual_machine" "vm" {
name = "DEV2"
resource_pool_id = data.vsphere_compute_cluster.cluster.resource_pool_id
datastore_id = data.vsphere_datastore.datastore.id
wait_for_guest_net_timeout = 0
wait_for_guest_ip_timeout = 0
# only if you DO NOT want to wait for an IP address
wait_for_guest_net_routable = false
num_cpus = 1
memory = 2048
#guest_id = "other3xLinux64Guest"
network_interface {
network_id = data.vsphere_network.network.id
}
disk {
label = "disk0"
size = 20
thin_provisioned = false
}
}
Я также объявил несколько переменных для передачи учетных данных VMWare.
$ cat variables.tf
variable "vsphereuser" {}
variable "vspherepassword" {}
В этом примере я передаю свои учетные данные VMWare vCenter с помощью переменных среды (см. пример ниже).
$ export TFVARvsphereuser='Administrator@lab.local'
$ export TFVARvspherepassword='mypassword'
Шаг 3. Инициализация кода TerraformКогда код будет готов, его нужно будет инициализировать с помощью команды terraform init, которая проверит среду и установит необходимые плагины и провайдеры.
$ terraform init
Initializing the backend...
Initializing provider plugins...
- Finding latest version of hashicorp/vsphere...
- Installing hashicorp/vsphere v1.24.2...
- Installed hashicorp/vsphere v1.24.2 (signed by HashiCorp)
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, we recommend adding version constraints in a required_providers block
in your configuration, with the constraint strings suggested below.
* hashicorp/vsphere: version = "~> 1.24.2"
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:
$ terraform show
No state.
Да, мы пока еще не выполнили запуск.Примечание. Что произойдет, если я выполню команду terraform apply? Все просто, система попытается выделить ресурсы для виртуальной машины, но эта попытка завершится ошибкой. Система сообщит, что виртуальная машина с именем DEV2 уже существует. Как бы то ни было, в данном примере это не наш случай.Шаг 4. Импорт виртуальной машины в состояние TerraformИтак, теперь все готово к импорту имеющейся у нас виртуальной машины в состояние Terraform.
$ terraform import vsphere_virtual_machine.vm /DC1/vm/DEV/DEV2
vsphere_virtual_machine.vm: Importing from ID "/DC1/vm/DEV/DEV2"...
vsphere_virtual_machine.vm: Import prepared!
Prepared vsphere_virtual_machine for import
vsphere_virtual_machine.vm: Refreshing state... [id=4219040f-5842-ba52-b7e4-cd9064c1f36c]
Import successful!
The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.
Готово, теперь наша виртуальная машина — часть состояния Terraform, и ей можно управлять из Terraform, выполняя такие операции, как добавление нового интерфейса, нового жесткого диска и т. д.Это можно проверить, выполнив команду terraform show еще раз.
$ terraform show
# vsphere_virtual_machine.vm:
resource "vsphere_virtual_machine" "vm" {
boot_delay = 0
boot_retry_delay = 10000
boot_retry_enabled = false
change_version = "2020-11-03T08:33:13.180937Z"
cpu_hot_add_enabled = false
cpu_hot_remove_enabled = false
cpu_limit = -1
cpu_performance_counters_enabled = false
cpu_reservation = 0
cpu_share_count = 1000
cpu_share_level = "normal"
custom_attributes = {}
datastore_id = "datastore-13"
efi_secure_boot_enabled = false
enable_disk_uuid = false
enable_logging = true
ept_rvi_mode = "automatic"
extra_config = {}
firmware = "bios"
folder = "DEV"
force_power_off = true
guest_id = "rhel7_64Guest"
guest_ip_addresses = []
hardware_version = 14
host_system_id = "host-12"
hv_mode = "hvAuto"
id = "4219040f-5842-ba52-b7e4-cd9064c1f36c"
ide_controller_count = 2
imported = true
latency_sensitivity = "normal"
memory = 2048
memory_hot_add_enabled = false
memory_limit = -1
memory_reservation = 0
memory_share_count = 20480
memory_share_level = "normal"
migrate_wait_timeout = 30
moid = "vm-47"
name = "DEV2"
nested_hv_enabled = false
num_cores_per_socket = 1
num_cpus = 1
pci_device_id = []
poweron_timeout = 300
reboot_required = false
resource_pool_id = "resgroup-8"
run_tools_scripts_after_power_on = true
run_tools_scripts_after_resume = true
run_tools_scripts_before_guest_reboot = false
run_tools_scripts_before_guest_shutdown = true
run_tools_scripts_before_guest_standby = true
sata_controller_count = 1
scsi_bus_sharing = "noSharing"
scsi_controller_count = 1
scsi_type = "pvscsi"
shutdown_wait_timeout = 3
swap_placement_policy = "inherit"
sync_time_with_host = false
tags = []
uuid = "4219040f-5842-ba52-b7e4-cd9064c1f36c"
vapp_transport = []
vmware_tools_status = "guestToolsRunning"
vmx_path = "DEV2/DEV2.vmx"
wait_for_guest_ip_timeout = 0
wait_for_guest_net_routable = true
wait_for_guest_net_timeout = 5
cdrom {
client_device = false
datastore_id = "datastore-13"
device_address = "sata:0:0"
key = 16000
path = "ISO/rhel-server-7.7-x86_64-dvd.iso"
}
disk {
attach = false
controller_type = "scsi"
datastore_id = "datastore-13"
device_address = "scsi:0:0"
disk_mode = "persistent"
disk_sharing = "sharingNone"
eagerly_scrub = false
io_limit = -1
io_reservation = 0
io_share_count = 1000
io_share_level = "normal"
keep_on_remove = true
key = 2000
label = "disk0"
path = "DEV2/DEV2.vmdk"
size = 20
thin_provisioned = false
unit_number = 0
uuid = "6000C29b-c4f0-764a-9054-a042931350c4"
write_through = false
}
}
ЗаключениеЕсли вы планируете управлять конфигурацией внутри операционной системы виртуальной машины, помните о том, что нужно использовать соответствующие средства выделения ресурсов (provisioners).Подробные сведения см. в документации по ресурсу vsphere_virtual_machine.Полный код приведен на GitHub в репозитории terraform-vmware-demos.
Узнать подробнее о курсе "Infrastructure as a code in Ansible".
Зарегистрироваться на открытый урок на тему "Управление Kubernetes при помощи Kubespray".
ЗАБРАТЬ СКИДКУ
===========
Источник:
habr.com
===========
===========
Автор оригинала: Gini
===========Похожие новости:
- [SaaS / S+S, C#, IT-компании] UiPath release notes: последние апдейты и акцент на работе в облаках
- [JavaScript, Программирование, Node.JS] Дино (Deno): Создать API для отдыха с помощью JWT (перевод)
- [Программирование, Git, Dart, Microsoft Azure] Когда твой код стал общим: история от дебюта до эндшпиля
- [JavaScript, Программирование, TypeScript] Кастомизация компонентов Ant Design и оптимизация бандла
- [Программирование, Управление персоналом, Карьера в IT-индустрии] Почему сеньоры ненавидят собеседования с кодингом, и что компании должны использовать вместо них (перевод)
- [Программирование, Мозг, Здоровье] Зачем мне психотерапевт?
- [Программирование] Вышла версия 6.0 интегрированной среды разработки Qt
- [Программирование, Разработка игр] Реализация паттерна проектирования (перевод)
- [Разработка веб-сайтов, JavaScript, Программирование] Сниппет, расширение для VSCode и CLI. Часть 2
- [Программирование, Kotlin] Проверка на равенство в Kotlin (перевод)
Теги для поиска: #_programmirovanie (Программирование), #_ansible, #_terraform, #_automation, #_vmware, #_iac, #_infrastructure_as_a_code, #_blog_kompanii_otus._onlajnobrazovanie (
Блог компании OTUS. Онлайн-образование
), #_programmirovanie (
Программирование
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 14:30
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Будущих учащихся на курсе "Infrastructure as a code in Ansible", а также всех желающих приглашаем принять участие в открытом вебинаре на тему "Управление Kubernetes при помощи Kubespray".
И по устоявшейся традиции делимся с вами переводом полезной статьи. provider "vsphere" {
user = var.vsphere_user password = var.vsphere_password vsphere_server = var.vsphere_server # If you have a self-signed cert allow_unverified_ssl = true } data "vsphere_datacenter" "dc" { name = "DC1" } data "vsphere_datastore" "datastore" { name = "datastore1" datacenter_id = data.vsphere_datacenter.dc.id } data "vsphere_compute_cluster" "cluster" { name = "AZ1" datacenter_id = data.vsphere_datacenter.dc.id } data "vsphere_network" "network" { name = "VM Network" datacenter_id = data.vsphere_datacenter.dc.id } resource "vsphere_virtual_machine" "vm" { name = "DEV2" resource_pool_id = data.vsphere_compute_cluster.cluster.resource_pool_id datastore_id = data.vsphere_datastore.datastore.id wait_for_guest_net_timeout = 0 wait_for_guest_ip_timeout = 0 # only if you DO NOT want to wait for an IP address wait_for_guest_net_routable = false num_cpus = 1 memory = 2048 #guest_id = "other3xLinux64Guest" network_interface { network_id = data.vsphere_network.network.id } disk { label = "disk0" size = 20 thin_provisioned = false } } $ cat variables.tf
variable "vsphereuser" {} variable "vspherepassword" {} $ export TFVARvsphereuser='Administrator@lab.local'
$ export TFVARvspherepassword='mypassword' $ terraform init
Initializing the backend... Initializing provider plugins... - Finding latest version of hashicorp/vsphere... - Installing hashicorp/vsphere v1.24.2... - Installed hashicorp/vsphere v1.24.2 (signed by HashiCorp) 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, we recommend adding version constraints in a required_providers block in your configuration, with the constraint strings suggested below. * hashicorp/vsphere: version = "~> 1.24.2" 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 show
No state. $ terraform import vsphere_virtual_machine.vm /DC1/vm/DEV/DEV2
vsphere_virtual_machine.vm: Importing from ID "/DC1/vm/DEV/DEV2"... vsphere_virtual_machine.vm: Import prepared! Prepared vsphere_virtual_machine for import vsphere_virtual_machine.vm: Refreshing state... [id=4219040f-5842-ba52-b7e4-cd9064c1f36c] Import successful! The resources that were imported are shown above. These resources are now in your Terraform state and will henceforth be managed by Terraform. $ terraform show
# vsphere_virtual_machine.vm: resource "vsphere_virtual_machine" "vm" { boot_delay = 0 boot_retry_delay = 10000 boot_retry_enabled = false change_version = "2020-11-03T08:33:13.180937Z" cpu_hot_add_enabled = false cpu_hot_remove_enabled = false cpu_limit = -1 cpu_performance_counters_enabled = false cpu_reservation = 0 cpu_share_count = 1000 cpu_share_level = "normal" custom_attributes = {} datastore_id = "datastore-13" efi_secure_boot_enabled = false enable_disk_uuid = false enable_logging = true ept_rvi_mode = "automatic" extra_config = {} firmware = "bios" folder = "DEV" force_power_off = true guest_id = "rhel7_64Guest" guest_ip_addresses = [] hardware_version = 14 host_system_id = "host-12" hv_mode = "hvAuto" id = "4219040f-5842-ba52-b7e4-cd9064c1f36c" ide_controller_count = 2 imported = true latency_sensitivity = "normal" memory = 2048 memory_hot_add_enabled = false memory_limit = -1 memory_reservation = 0 memory_share_count = 20480 memory_share_level = "normal" migrate_wait_timeout = 30 moid = "vm-47" name = "DEV2" nested_hv_enabled = false num_cores_per_socket = 1 num_cpus = 1 pci_device_id = [] poweron_timeout = 300 reboot_required = false resource_pool_id = "resgroup-8" run_tools_scripts_after_power_on = true run_tools_scripts_after_resume = true run_tools_scripts_before_guest_reboot = false run_tools_scripts_before_guest_shutdown = true run_tools_scripts_before_guest_standby = true sata_controller_count = 1 scsi_bus_sharing = "noSharing" scsi_controller_count = 1 scsi_type = "pvscsi" shutdown_wait_timeout = 3 swap_placement_policy = "inherit" sync_time_with_host = false tags = [] uuid = "4219040f-5842-ba52-b7e4-cd9064c1f36c" vapp_transport = [] vmware_tools_status = "guestToolsRunning" vmx_path = "DEV2/DEV2.vmx" wait_for_guest_ip_timeout = 0 wait_for_guest_net_routable = true wait_for_guest_net_timeout = 5 cdrom { client_device = false datastore_id = "datastore-13" device_address = "sata:0:0" key = 16000 path = "ISO/rhel-server-7.7-x86_64-dvd.iso" } disk { attach = false controller_type = "scsi" datastore_id = "datastore-13" device_address = "scsi:0:0" disk_mode = "persistent" disk_sharing = "sharingNone" eagerly_scrub = false io_limit = -1 io_reservation = 0 io_share_count = 1000 io_share_level = "normal" keep_on_remove = true key = 2000 label = "disk0" path = "DEV2/DEV2.vmdk" size = 20 thin_provisioned = false unit_number = 0 uuid = "6000C29b-c4f0-764a-9054-a042931350c4" write_through = false } } Узнать подробнее о курсе "Infrastructure as a code in Ansible".
Зарегистрироваться на открытый урок на тему "Управление Kubernetes при помощи Kubespray". ЗАБРАТЬ СКИДКУ =========== Источник: habr.com =========== =========== Автор оригинала: Gini ===========Похожие новости:
Блог компании OTUS. Онлайн-образование ), #_programmirovanie ( Программирование ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 14:30
Часовой пояс: UTC + 5