在前几周,我谈论了很多有关Nutanix Calm DSL的内容。 与此相关的是,发布了Calm DSL的各种“主页” – Nutanix.dev上与该主题相关的所有文章的集合。
但是,今天,我们正在寻找完全不同的东西。 固然DSL确实在幕後大量使用了Nutanix API,但本文将着眼於每个自动化工作流程中可能包含的部分-创建VM。 但是为什麽呢? 我们以前没有谈论过吗? 是的,但是今天的示例会稍有不同–我们将使用Cloud-Init自定义该VM。
如果您不熟悉Cloud-Init,可以将其视为Windows Sysprep的大致等同形式,即可以在创建过程中创建和自定义Linux 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。
在现实世界中,如果不指定任何规格,创建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符合我们上面的规范。
至此,我们已经使用“外壳”方法(最小参数)和详细方法(扩展的虚拟机规格)创建了虚拟机。 我们还没有做的是使用Cloud-Init定制功能创建VM。 现在开始吧。
在生成请求之前,这是我们将用於请求的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用户数据执行以下任务:
请注意,SSH密钥已被删除并替换为“ ssh-rsa KEY”。 如果您打算按原样使用此有效负载,则需要用SSH公钥替换“ ssh-rsa KEY”。
值得注意的是,对於以下任何POST请求,API端点仍不会更改:
https://:9440/api/nutanix/v3/vms
再次更改的是随请求发送的JSON有效负载。 下面的有效负载与上一个请求中的有效负载相同,但增加了Cloud-Init来宾定制数据。
这是现在完整的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"
}
}
完成API请求,有效负载和客户定制数据後,我们可以发送请求。 单独创建VM的请求并不是很有趣,因此,我们将在启动VM时对其进行研究。 查看AHV VM控制台,以下是这些要点:
以下屏幕截图显示了VM引导和Cloud-Init运行:
使用API v3创建并使用Cloud-Init配置的VM
阅读本文的同时,我们完成了以下步骤:
使用这些方法,可以看到如何将Nutanix v3 API不仅用於创建VM,还可使用於行业认可的方法(例如Cloud-Init用於Linux VM定制)。
感谢您的阅读,祝您有美好的一天!
<<: 新手学习JavaScript:day29 - Todolist(2)
>>: 《Day28》Oracle Database的基础架构
在现代开发工具的辅助下,大多数的编辑器或 IDE 都已经程序码自动完成的功能,写程序已经变得相对轻松...
我们用到的 API endpoint 只有一个,就是用来取得港铁机场快綫、东涌綫、屯马綫及将军澳綫最...
在 DAY 2~DAY 4 我们使用到了 goroutine、lock、channel,主要目标在保...
现在的 App ,已经很少单纯只用到手机功能而没有网路功能的。 Alamofire 是 iOS 开发...
终於来到了最後一章节,也算是蛮重要的「版本控制」 版本控制的好处是让你可以知道自己修改了什麽东西,方...