You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用pyVmomi创建ESXi 6.7顶级目录失败问题咨询

我来帮你拆解下这个问题,从功能限制、替代方案和可用库三个方面给你解答:

一、ESXi 6.7免费版的API权限限制问题

你遇到的RestrictedVersion错误核心原因是:ESXi 6.7免费版(vSphere Hypervisor)对部分API操作做了权限收紧,而6.5免费版还没限制这个动作。

虽然pyVmomi官方确实支持ESXi 6.7,但VMware在6.7版本的免费版中,把fileManager.MakeDirectory创建数据存储顶级目录的操作加入了付费版专属权限列表。也就是说,只有购买了vSphere Essentials及以上授权的ESXi主机,才能通过这个API创建顶级目录;免费版只能在已存在的目录下创建子目录。

二、创建数据存储目录的替代方案

既然官方API走不通,有两个可行的替代思路:

1. 预创建基础目录,脚本创建子目录

先手动在ESXi数据存储里建一个通用的顶级目录(比如VM_Storage),然后修改脚本,把要创建的目录放在这个预创建的目录下:

# 修改dirname的生成逻辑,加入预创建的基础目录
dirname = '[' + dso.info.name + '] VM_Storage/' + vm['name']
logger.info('Creating Directory {} on {}'.format( dirname, dso.info.name))
try:
    fmgr.MakeDirectory(name=dirname, datacenter=dco, createParentDirectories=True)  # 设为True自动创建中间目录
# 后续异常处理逻辑不变
except vim.fault.FileAlreadyExists as e:
    logger.info('Directory {} already exists on {} - {}'.format( dirname, dso.info.name, str(e)))
    return True
# ... 其他异常处理

这个方法的好处是不需要额外依赖,完全沿用原来的pyVmomi逻辑,只是调整了目录路径。

2. 通过SSH执行命令创建目录

ESXi免费版允许开启SSH服务,你可以用Python的paramiko库连接ESXi主机,直接执行Linux风格的mkdir命令创建目录:

import paramiko
import logging

logger = logging.getLogger(__name__)

def create_dir_via_ssh(esxi_host, esxi_user, esxi_pass, datastore_name, vm_name):
    # 构造数据存储的绝对路径
    datastore_path = f"/vmfs/volumes/{datastore_name}/{vm_name}"
    ssh_client = paramiko.SSHClient()
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        ssh_client.connect(esxi_host, username=esxi_user, password=esxi_pass)
        # 执行创建目录命令,-p参数确保父目录不存在时自动创建
        stdin, stdout, stderr = ssh_client.exec_command(f"mkdir -p {datastore_path}")
        error_msg = stderr.read().strip().decode()
        if error_msg:
            if "File exists" in error_msg:
                logger.info(f"Directory {datastore_path} already exists")
            else:
                logger.error(f"SSH create directory failed: {error_msg}")
                return False
        else:
            logger.info(f"Successfully created directory {datastore_path} via SSH")
        return True
    except Exception as e:
        logger.error(f"SSH connection or command failed: {str(e)}")
        return False
    finally:
        ssh_client.close()

# 调用示例
# create_dir_via_ssh("your-esxi-ip", "root", "your-password", dso.info.name, vm['name'])

注意:需要先在ESXi主机的管理界面开启SSH服务(主机->管理->服务->TSM-SSH),同时要注意密码的安全存储(比如用环境变量或密钥认证代替明文密码)。

三、支持ESXi 6.0及以上的其他Python库

除了pyVmomi,还有几个靠谱的选择:

  • vmware-vsphere-automation-sdk-python:VMware官方推出的新一代SDK,基于REST API,比pyVmomi的SOAP API更现代化,文档也更友好。它支持ESXi 6.0及以上版本,功能覆盖全面,但同样要注意免费版的API权限限制。
  • pyVmomi-community-samples:这是pyVmomi的社区脚本集合,里面有大量经过验证的实用脚本,包括文件管理、虚拟机部署等,可以直接参考或修改使用,节省开发时间。
  • govc:虽然是Go语言开发的命令行工具,但可以在Python中通过subprocess模块调用它。govc功能强大,支持ESXi 6.0+,免费版也能使用大部分核心功能,比如创建目录、克隆虚拟机等,上手成本很低。

内容的提问来源于stack exchange,提问作者Soumyajit

火山引擎 最新活动