VMware 模块开发指南
Ansible VMware 集合(位于 Galaxy,源代码 代码库)由 VMware 工作组维护。更多信息请参见 团队社区页面。
使用您自己的基础设施进行测试
您可以将目标设置为常规 VMware 环境。本段将逐步说明如何自行运行测试套件。
需求
如果您想在虚拟机管理程序中部署测试环境,VMware 或 Libvirt 都可以很好地工作。
NFS 服务器配置
您的 NFS 服务器必须公开以下目录结构
$ tree /srv/share/
/srv/share/
├── isos
│ ├── base.iso
│ ├── centos.iso
│ └── fedora.iso
└── vms
2 directories, 3 files
在 Linux 系统上,您可以使用以下导出文件通过 NFS 公开目录
$ cat /etc/exports
/srv/share 192.168.122.0/255.255.255.0(rw,anonuid=1000,anongid=1000)
注意
通过此配置,所有新文件将由 UID 和 GID 为 1000/1000 的用户拥有。调整配置以匹配您的用户的 UID/GID。
可以使用以下命令启用服务
$ sudo systemctl enable --now nfs-server
配置您的安装
准备一个描述您的设置的配置文件。该文件应命名为 test/integration/cloud-config-vcenter.ini,并基于 test/lib/ansible_test/config/cloud-config-vcenter.ini.template。例如,如果您已使用 vmware-on-libvirt 部署您的实验室
[DEFAULT]
vcenter_username: [email protected]
vcenter_password: !234AaAa56
vcenter_hostname: vcenter.test
vmware_validate_certs: false
esxi1_hostname: esxi1.test
esxi1_username: root
esxi1_password: root
esxi2_hostname: test2.test
esxi2_username: root
esxi2_password: root
使用 HTTP 代理
支持在 HTTP 代理后面托管测试基础设施。您可以使用以下两个额外的键指定代理服务器的位置
vmware_proxy_host: esxi1-gw.ws.testing.ansible.com
vmware_proxy_port: 11153
此外,您可能需要调整以下 var 文件 的变量以匹配您的实验室的配置。如果您使用 vmware-on-libvirt 来准备您的实验室,则无需更改任何内容。
运行测试套件
配置完成后,您可以使用以下命令触发运行
source hacking/env-setup
VMWARE_TEST_PLATFORM=static ansible-test integration --python 3.7 vmware_host_firewall_manager
vmware_host_firewall_manager
是要测试的模块的名称。
vmware_guest
比任何其他测试角色都要大得多,而且相当慢。您可以在 main.yml 中启用或禁用其一些测试剧本。
单元测试
VMware 模块的单元测试覆盖率有限。您可以使用以下命令运行测试套件
source hacking/env-setup
ansible-test units --venv --python 3.7 '.*vmware.*'
代码风格和最佳实践
带有 ESXi 的 datacenter 参数
datacenter
参数默认不应使用 ha-datacenter
。这是因为用户可能没有意识到 Ansible 会默默地将目标设置为错误的数据中心。
esxi_hostname 不应为必填项
根据 ESXi 或 vCenter 提供的功能,某些模块可以与两者无缝协同工作。在这种情况下,esxi_hostname
参数应为可选参数。
if self.is_vcenter():
esxi_hostname = module.params.get('esxi_hostname')
if not esxi_hostname:
self.module.fail_json("esxi_hostname parameter is mandatory")
self.host = self.get_all_host_objs(cluster_name=cluster_name, esxi_host_name=esxi_hostname)[0]
else:
self.host = find_obj(self.content, [vim.HostSystem], None)
if self.host is None:
self.module.fail_json(msg="Failed to find host system.")
示例应使用完全限定的集合名称 (FQCN)
在模块文档中使用 FQCN 作为示例。例如,您应该使用 community.vmware.vmware_guest
而不是 vmware_guest
。
这样,示例就不会依赖于剧本的 collections
指令。
功能测试
编写新的测试
如果您正在编写新的集成测试集合,除了标准 Ansible 集成测试 流程之外,还有一些 VMware 特定的注意事项。
测试套件使用一组位于 prepare_vmware_tests 角色中的常用预定义变量。通过在测试开始时导入该角色,会自动创建此处定义的资源
- import_role:
name: prepare_vmware_tests
vars:
setup_datacenter: true
这将为您提供一个可立即使用的集群、数据中心、数据存储、文件夹、交换机、dvswitch、ESXi 主机和虚拟机。
无需创建过多资源
大多数情况下,无需使用 with_items
来创建多个资源。避免使用它可以加快测试执行速度,并简化随后的清理工作。
VM 名称应可预测
如果需要在测试期间创建新的虚拟机,可以使用 test_vm1
、test_vm2
或 test_vm3
。这样,系统会自动为您清理这些虚拟机。
避免在测试手册中使用常见的样板代码
从 Ansible 2.10 开始,测试套件使用 modules_defaults 模块。此模块允许我们预初始化 VMware 模块的以下默认键:
主机名 (hostname)
用户名 (username)
密码 (password)
验证证书 (validate_certs)
例如,以下代码块:
- name: Add a VMware vSwitch
community.vmware.vmware_vswitch:
hostname: '{{ vcenter_hostname }}'
username: '{{ vcenter_username }}'
password: '{{ vcenter_password }}'
validate_certs: 'no'
esxi_hostname: 'esxi1'
switch_name: "boby"
state: present
应该简化为:
- name: Add a VMware vSwitch
community.vmware.vmware_vswitch:
esxi_hostname: 'esxi1'
switch_name: "boby"
state: present
排版约定
命名规范
我们在文档中力求遵守以下规则:
VMware,而不是 VMWare 或 vmware
ESXi,而不是 esxi 或 ESXI
vCenter,而不是 vcenter 或 VCenter