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定制)。

感谢您的阅读,祝您有美好的一天!


<<:  新手学习JavaScript:day29 - Todolist(2)

>>:  《Day28》Oracle Database的基础架构

第十五天:用 detekt 做静态分析

在现代开发工具的辅助下,大多数的编辑器或 IDE 都已经程序码自动完成的功能,写程序已经变得相对轻松...

Endpoint

我们用到的 API endpoint 只有一个,就是用来取得港铁机场快綫、东涌綫、屯马綫及将军澳綫最...

DAY 5:Thread-Per-Message Pattern,预备...发射!

在 DAY 2~DAY 4 我们使用到了 goroutine、lock、channel,主要目标在保...

D3-用 Swift 和公开资讯,打造投资理财的 Apps { 使用 Alamofire 套件进行 URLRequest }

现在的 App ,已经很少单纯只用到手机功能而没有网路功能的。 Alamofire 是 iOS 开发...

版本控制与结语-30天学会HTML+CSS,制作精美网站

终於来到了最後一章节,也算是蛮重要的「版本控制」 版本控制的好处是让你可以知道自己修改了什麽东西,方...