使用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




