这个文章要讲的是,PHP如何使用 VSphere的web-service-sdk 从内容库中的 ovf 模板创建虚拟机。需要注意的是,内容库是 VSphere 6.0 才有的功能,这篇文章基于 6.5。
这个 sdk api 没什么文档,你得看它提供的示例才能对它有所了解。有意思的是,整个示例就是一个 api,你可以通过传递参数给它来获取简单信息资源等操作,但是对于参数没有任何说明,只有靠猜。在这里向大家推荐一篇使用 vsphere-automation-sdk-python 自动创建虚拟机,里面详细的介绍了创建虚拟机所需的参数说明配置。
说实话,示例写的比较烂,坑很多。有些简单的GET请求需要加上参数、但是它不提供写参数的地方。有感于此,我就将我研究的东西写出来,让大家少走弯路吧。
首先还是要感谢我师父,没有他的帮助,至少要多少花一周时间。在此非常感谢!
话不多说了,进入主题:
首先我们用php的curl去操作web-service-sdk,关于culr的使用方法,请大家自己了解,这里就不多说。
首先拿到从ovf模板中创建vm虚拟机的api:
/com/vmware/vcenter/ovf/library-item/id:{ovf_library_item_id}?~action=deploy //api
这是一个post请求,需要传入多个参数:ovf_library_item_id, client_token, target, deployment_spec所有参数说明都在上面提到的那篇博文中有解释,这里就不累赘了。
值得一说的是target里面host_id、folder_id、resource_pool_id的三个是可选的,并不是需要全部填完,如果想要填完,那么三个参数必须正确即参数要在同一环境下,不然的话,就会报对象不支持操作。
直接上代码:
/*
**@从内容库中创建虚拟机
**$sid:要取的sessionid
**$baseUrl:获取平台信息基本地址
**$libraryItemId:内容库ID
**$hostId:宿主机ID
**$resorcePoolId:资源池ID
**$vmName:需要创建的虚拟机名称
*/
function createVM_ovf($sid,$baseUrl,$libraryItemId,$hostId,$resorcePoolId,$vmName){
$httpMethod = 'POST';
$isHead = 1;
$headInfo = array(
"Content-Type:application/json",
"Accept:application/json",
"vmware-api-session-id:$sid"
);
$url = $baseUrl."/com/vmware/vcenter/ovf/library-item/id:".$libraryItemId."?~action=deploy";
$arr = array(
"target" => array(
"host_id" => $hostId,
"resource_pool_id" => $resorcePoolId
),
"deployment_spec" => array(
"name" => $vmName,
"accept_all_EULA" => true //这里设置为false的话不知道能不能创建
)
);
$arr = json_encode($arr);
$this->setOptions($url, $httpMethod, $arr, 0, '', $isHead, $headInfo);
$res = $this->exCurl();
return $res;
}
$baseUrl = "https://vcenter/rest";
$libraryItemId = "331f7bc6-c702-4dcc-bc6b-19b506163e3c";
$hostId = "host-10";
$resorcePoolId = "resgroup-8";
$vmName = "isok";
$res = createVM_ovf($sid,$baseUrl,$libraryItemId,$hostId,$resorcePoolId,$vmName);
ovf_library_item_id的获取
/com/vmware/content/library/item //api
获取这玩意儿,废了不少时间,也是比较坑。官方说需要传入一个参数,却不给填参数的input,在这里老是报错。结果就是直接在api后面接上相应的参数即 /com/vmware/content/library/item?library_id=库id。也附上相应的代码
**@获取库ItemID列表
**$sid:要去的sessionid
**$libraryId:库id
**$url:获取库的地址
*/
function getLibraryItemList($sid, $baseUrl, $libraryId){
$params = array(
'item?library_id='.$libraryId
);
$libItemList = $this->getPlatformInfo($sid, $baseUrl, 'library', $params);
return $libItemList;
}
//调用
以上是我封装的类文件,如需要完整代码可以先进入其 码云主页下载。欢迎其他同学指正交流!!!!!!!!!!!!!!