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 中启用或禁用其某些测试 playbook。
单元测试
VMware 模块的单元测试覆盖率有限。您可以使用以下命令运行测试套件
source hacking/env-setup
ansible-test units --venv --python 3.7 '.*vmware.*'
代码风格和最佳实践
ESXi 的数据中心参数
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
。
这样,示例就不依赖于 playbook 的 collections
指令。
功能测试
编写新测试
如果您要编写新的集成测试集合,除了标准的 Ansible 集成测试 流程之外,还需要注意一些特定于 VMware 的事项。
测试套件使用一组常见的预定义变量,这些变量位于 prepare_vmware_tests 角色中。通过在测试开始时导入该角色,将自动创建那里定义的资源
- import_role:
name: prepare_vmware_tests
vars:
setup_datacenter: true
这将为您提供一个可随时使用的集群、数据中心、数据存储、文件夹、交换机、dvswitch、ESXi 主机和虚拟机。
无需创建太多资源
在大多数情况下,没有必要使用 with_items
来创建多个资源。通过避免它,您可以加快测试执行速度并简化后续的清理工作。
虚拟机名称应该是可预测的
如果您需要在测试期间创建新的虚拟机,可以使用 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