VMware 模块开发指南

Ansible VMware 集合(位于 Galaxy,源代码 代码库)由 VMware 工作组维护。更多信息请参见 团队社区页面

使用您自己的基础设施进行测试

您可以将目标设置为常规 VMware 环境。本段将逐步说明如何自行运行测试套件。

需求

  • 2 台 ESXi 主机 (6.5 或 6.7)
    • 带 2 个网卡,第二个网卡应可用于测试

  • 一台 VCSA 主机

  • 一台 NFS 服务器

  • Python 依赖项

如果您想在虚拟机管理程序中部署测试环境,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_vm1test_vm2test_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