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 中启用或禁用其某些测试 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_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