iT邦幫忙

0
鐵人賽 神助攻 Nutanix

Nutanix API v3 – 搭配 Cloud-Init 創建一個 Linux VM

https://ithelp.ithome.com.tw/upload/images/20201013/20129565hFDIEbmY1T.png

在前幾週,我談論了很多有關Nutanix Calm DSL的內容。 與此相關的是,發布了Calm DSL的各種“主頁” – Nutanix.dev上與該主題相關的所有文章的集合。

但是,今天,我們正在尋找完全不同的東西。 固然DSL確實在幕後大量使用了Nutanix API,但本文將著眼於每個自動化工作流程中可能包含的部分-創建VM。 但是為什麼呢? 我們以前沒有談論過嗎? 是的,但是今天的示例會稍有不同–我們將使用Cloud-Init自定義該VM。

如果您不熟悉Cloud-Init,可以將其視為Windows Sysprep的大致等同形式,即可以在創建過程中創建和自定義Linux VM。

建立一個 Shell VM

儘管在使用Nutanix v3 API創建虛擬機的基礎上還有其他現有材料,但我將再次快速進行介紹。 希望這將有助於社區入門並在一篇文章中全部使用Cloud-Init。

首先,在下面查看Nutanix v3 API POST請求和JSON有效負載–它會創建僅具有必需參數的基本VM。

https://:9440/api/nutanix/v3/vms

與此請求一起,我們需要發送一個JSON負載,該負載指定創建VM時所需的必需參數。

{
    "spec": {
        "name": "vm_from_v3_api",
        "resources": {}
    },
    "metadata": {
        "kind": "vm"
    }
}

該請求的重點如下:

  • 將創建一個名為“vm_from_v3_api”的新VM。
  • 我們尚未指定虛擬機規格,例如vCPU,每個vCPU的核心數,RAM,存儲空間等。v3 API內置了一些合理的默認值,儘管這些默認值仍然允許創建VM。
  • 我們已指定要創建的實體的“kind”為“vm”。

暫時無需執行此請求-我們將擴展這個想法,並創建一個更有用的VM。

建立一個detail VM

在現實世界中,如果不指定任何規格,創建VM可能並不過分有用。通常,VM將需要執行某種任務,無論是Web服務器,數據庫服務器,還是目前無法想像的任何數量的任務。每種類型的服務器都可能會根據其功能製定某種推薦規格-現在讓我們看看如何實現。

首先,Nutanix v3 API端點與上面使用的端點完全相同-在最簡單的級別上,我們仍在做相同的事情,即發送API POST請求以創建新的VM。

https://:9440/api/nutanix/v3/vms

但是,其他區別立即開始–與該請求一起發送的JSON有效負載比我們以前使用的要詳細得多。

{
	"spec":{
		"name":"{{vm_name}}",
		"resources":{
			"power_state":"ON",
			"num_vcpus_per_socket":1,
			"num_sockets":1,
			"memory_size_mib":1024,
			"disk_list":[{
				"device_properties":{
					"device_type":"DISK",
					"disk_address": {
						"device_index": 0,
						"adapter_type": "SCSI"
					}
				},
				"data_source_reference": {
					"kind": "image",
					"uuid": "{{cloud_init_image_uuid_pc}}"
				}
			},
			{
				"device_properties":{
					"device_type":"CDROM"
				}
			}],
			"nic_list":[{
				"nic_type":"NORMAL_NIC",
				"is_connected":true,
				"ip_endpoint_list":[{
					"ip_type":"DHCP"
				}],
				"subnet_reference":{
					"kind":"subnet",
					"name":"{{subnet_name}}",
					"uuid":"{{subnet_uuid}}"
				}
			}],
			"guest_tools":{
				"nutanix_guest_tools":{
					"state":"ENABLED",
					"iso_mount_state":"MOUNTED"
				}
			}
		},
		"cluster_reference":{
			"kind":"cluster",
			"name":"{{cluster_name}}",
			"uuid":"{{cluster_uuid}}"
		}
	},
	"api_version":"3.1.0",
	"metadata":{
		"kind":"vm"
	}
}

以下是此請求的重點-請用與您的環境匹配的值替換{{placeholder}}變量。

  • 創建一個名稱與第一個請求相同的VM,即“ vm_from_v3_api”
  • 使用1個vCPU,每個vCPU 1個內核,1GiB RAM配置VM
  • 從設備索引0添加一個SCSI磁盤,該磁盤從Prism Central映像克隆,UUID匹配“ {{cloud_init_image_uuid_pc}}”
    • 重要說明– Prism Element(API v2.0)和Prism Central(API v3)存儲具有不同UUID的圖像。 請結合以上有效負載使用Prism Central映像UUID。
  • 使用1x NIC配置VM,並連接到{{subnet_name}}和{{subnet_uuid}}指定的AHV網絡
  • 指定虛擬機應駐留在{{cluster_name}}和{{cluster_uuid}}指定的群集上
  • 創建後打開虛擬機電源

現在發送此請求將導致VM符合我們上面的規範。

以"Cloud-Init"的方式建立一個VM

至此,我們已經使用“外殼”方法(最小參數)和詳細方法(擴展的虛擬機規格)創建了虛擬機。 我們還沒有做的是使用Cloud-Init定制功能創建VM。 現在開始吧。

Cloud-Init Data

在生成請求之前,這是我們將用於請求的Cloud-Init YAML數據。

#cloud-config
users:
  - name: nutanix
    ssh-authorized-keys:
      - ssh-rsa KEY
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo
    shell: /bin/bash

packages:
  - httpd

上面的Cloud-Init用戶數據執行以下任務:

  • 創建一個名為“ nutanix”的用戶並授予其SUDO訪問權限
  • 將“ nutanix”用戶添加到“ sudo”組
  • 將“ nutanix”用戶的shell設置為/ bin / bash
  • 安裝“ httpd”軟件包。 這樣做只是為了使Cloud-Init花費更長的時間。 否則,Cloud-Init可以很快完成。

請注意,SSH密鑰已被刪除並替換為“ ssh-rsa KEY”。 如果您打算按原樣使用此有效負載,則需要用SSH公鑰替換“ ssh-rsa KEY”。

建立API Request

值得注意的是,對於以下任何POST請求,API端點仍不會更改:

https://:9440/api/nutanix/v3/vms

再次更改的是隨請求發送的JSON有效負載。 下面的有效負載與上一個請求中的有效負載相同,但增加了Cloud-Init來賓定制數據。

  • Cloud-Init來賓定制部分以“ guest_customization”開頭
  • 參數“ cloud_init”和“ user_data”指示AHV使用Cloud-Init Config Drive v2規範配置VM並使用以下用戶數據。 請注意,“ user_data”必須以base64編碼格式提供。 為此目的存在許多公共工具。 https://www.base64encode.org/。

這是現在完整的JSON有效負載,包括來賓定制數據。

{
	"spec":{
		"name":"{{vm_name}}",
		"resources":{
			"power_state":"ON",
			"num_vcpus_per_socket":1,
			"num_sockets":1,
			"memory_size_mib":1024,
			"disk_list":[{
				"device_properties":{
					"device_type":"DISK",
					"disk_address": {
						"device_index": 0,
						"adapter_type": "SCSI"
					}
				},
				"data_source_reference": {
					"kind": "image",
					"uuid": "{{cloud_init_image_uuid_pc}}"
				}
			},
			{
				"device_properties":{
					"device_type":"CDROM"
				}
			}],
			"nic_list":[{
				"nic_type":"NORMAL_NIC",
				"is_connected":true,
				"ip_endpoint_list":[{
					"ip_type":"DHCP"
				}],
				"subnet_reference":{
					"kind":"subnet",
					"name":"{{subnet_name}}",
					"uuid":"{{subnet_uuid}}"
				}
			}],
			"guest_tools":{
				"nutanix_guest_tools":{
					"state":"ENABLED",
					"iso_mount_state":"MOUNTED"
				}
			},
			"guest_customization": {
				"cloud_init": {
					"user_data": "I2Nsb3VkLWNvbmZpZwp1c2VyczoKICAtIG5hbWU6IG51dGFuaXgKICAgIHNzaC1hdXRob3JpemVkLWtleXM6CiAgICAgIC0gc3NoLXJzYSBLRVkKICAgIHN1ZG86IFsnQUxMPShBTEwpIE5PUEFTU1dEOkFMTCddCiAgICBncm91cHM6IHN1ZG8KICAgIHNoZWxsOiAvYmluL2Jhc2gKCnBhY2thZ2VzOgogIC0gaHR0cGQ="
				},
				"is_overridable": false
			}
		},
		"cluster_reference":{
			"kind":"cluster",
			"name":"{{cluster_name}}",
			"uuid":"{{cluster_uuid}}"
		}
	},
	"api_version":"3.1.0",
	"metadata":{
		"kind":"vm"
	}
}

傳送 Request

完成API請求,有效負載和客戶定制數據後,我們可以發送請求。 單獨創建VM的請求並不是很有趣,因此,我們將在啟動VM時對其進行研究。 查看AHV VM控制台,以下是這些要點:

  • 已創建虛擬機,名稱為“ cloudinit_vm_from_api”(這與以前有所不同,但可以滿足您的需要)
  • AHV使用Config Drive v2配置配置了新VM,然後打開了VM的電源
  • Cloud-Init“接受”並完成了我們的Cloud-Init YAML規範中指定的說明

以下屏幕截圖顯示了VM引導和Cloud-Init運行:

https://ithelp.ithome.com.tw/upload/images/20201013/20129565UBBO7Shpce.png
使用API v3創建並使用Cloud-Init配置的VM

總結

閱讀本文的同時,我們完成了以下步驟:

  • 重新學習如何使用Nutanix v3 API創建基本的Shell VM
  • 在Shell VM有效負載之上構建,並創建具有指定配置(CPU,RAM,從映像複製)的VM
  • 使用Cloud-Init來賓定制數據擴展了詳細的VM負載

使用這些方法,可以看到如何將Nutanix v3 API不僅用於創建VM,還可使用於行業認可的方法(例如Cloud-Init用於Linux VM定制)。

感謝您的閱讀,祝您有美好的一天!


尚未有邦友留言

立即登入留言