集成测试

Ansible 集成测试系统。

针对剧本的测试,按剧本划分。

有些测试可能需要凭据。凭据可以在 credentials.yml 中指定。

有些测试可能需要 root 权限。

注意

每个新模块和插件都应该有集成测试,即使测试无法在 Ansible CI 基础设施上运行。在这种情况下,测试应该在 别名文件 中使用 unsupported 别名标记。

快速入门

强烈建议您安装并激活 argcomplete Python 包。它在 bash 中为 ansible-test 测试运行器提供制表符补全。

配置

ansible-test 命令

以下示例假设 bin/ 在您的 $PATH 中。一个简单的实现方法是使用 env-setup 命令初始化您的环境

source hacking/env-setup
ansible-test --help

您也可以使用完整路径调用 ansible-test

bin/ansible-test --help

integration_config.yml

创建您自己的 integration_config.yml 版本可以允许您设置一些可调参数,以帮助在您的环境中更好地运行测试。有些测试(例如,云测试)只有在提供访问凭据时才会运行。有关支持的凭据的更多信息,请参阅 tests/integration/ 目录中的各种 cloud-config-*.template 文件。

先决条件

某些测试假设 hg、svn 和 git 已安装,并且在路径中。一些测试(例如,针对 Amazon Web Services 的测试)需要单独的定义,这将在本文档的后面部分介绍。

(完整列表待定)

非破坏性测试

这些测试会修改子目录中的文件,但不会执行安装或删除软件包或子目录以外的内容。它们也不会重新配置或重启系统服务。

注意

在容器中运行集成测试

为了保护您的系统免受集成测试可能造成的任何潜在更改,并确保提供一组合理的依赖项,建议您始终使用 --docker 选项运行集成测试,例如 --docker ubuntu2204。通过运行 ansible-test integration --help 获取支持的容器镜像列表。您可以在输出的“目标 Docker 镜像”部分找到它们。default 镜像用于健全性和单元测试,以及用于云模块等平台无关的集成测试。

在 Fedora 34 容器中运行我们的 CI 系统执行的所有 POSIX 平台测试,如下所示

ansible-test integration shippable/ --docker fedora34

您也可以排除特定测试,例如针对单个模块的测试

ansible-test integration --exclude git

您也可以指定特定测试,例如针对单个模块的测试

ansible-test integration ping

您可以使用 -v 选项使输出更详细

ansible-test integration lineinfile -vvv

使用以下命令列出所有可用目标

ansible-test integration --list-targets

注意

Bash 用户

如果您使用的是 bash 以及 argcomplete,可以通过执行以下操作获得完整列表:ansible-test integration <tab><tab>

破坏性测试

这些测试允许安装和删除一些微不足道的软件包。您可能希望将它们专门用于虚拟环境,例如 Docker。它们不会重新格式化您的文件系统。

ansible-test integration destructive/ --docker fedora34

Windows 测试

这些测试会练习 winrm 连接插件和 Windows 模块。您需要定义一个带有远程 Windows Server 的库存来用于测试,并启用 PowerShell 远程处理才能继续。

运行这些测试可能会导致您的 Windows 主机发生更改,因此请不要在生产/关键 Windows 环境中运行它们。

启用 PowerShell 远程处理(在 Windows 主机上通过远程桌面运行)

Enable-PSRemoting -Force

定义 Windows 库存

cp inventory.winrm.template inventory.winrm
${EDITOR:-vi} inventory.winrm

运行我们的 CI 系统执行的 Windows 测试

ansible-test windows-integration -v shippable/

容器中的测试

如果您拥有安装了 Docker 或 Podman 的 Linux 系统,建议您使用 Ansible 持续集成 (CI) 系统使用的相同容器运行集成测试。

注意

Podman

默认情况下,只有在未安装 Docker CLI 时才会使用 Podman。如果您安装了 Docker,但希望使用 Podman,可以通过设置环境变量 ANSIBLE_TEST_PREFER_PODMAN 更改此行为。

注意

非 Linux 系统上的 Docker

不建议使用 Docker Engine 在非 Linux 主机(例如 macOS)上运行 Docker。根据用于测试的镜像,某些测试可能会失败。在运行 integration(而不是 network-integrationwindows-integration)时使用 --docker-privileged 选项可能会解决此问题。

运行集成测试

要为 POSIX 平台在 Ubuntu 18.04 容器中运行所有 CI 集成测试目标

ansible-test integration shippable/ --docker ubuntu1804

您也可以运行特定测试或选择不同的 Linux 发行版。例如,要在一个 Ubuntu 18.04 容器上运行针对 ping 模块的测试

ansible-test integration ping --docker ubuntu1804

容器镜像

容器镜像会定期更新。要查看当前的容器镜像列表

ansible-test integration --help

该列表位于 **目标 Docker 镜像和支持的 Python 版本** 标题下。

云测试的其他配置

要运行某些测试,您必须在 tests/integration 目录中提供一个名为 cloud-config-aws.ymlcloud-config-cs.ini 的文件中的访问凭据。相应的 .template 文件可用于语法帮助。更新的 AWS 测试现在使用 tests/integration/cloud-config-aws.yml 文件。

AWS 的 IAM 策略

Ansible 需要相当广泛的权限才能在 AWS 账户中运行测试。这些权限可以提供给一个专用的用户。在运行测试之前需要配置这些权限。

testing-policies

GitHub 存储库 mattclay/aws-terminator 包含两组用于所有现有 AWS 模块集成测试的策略。可以使用 hacking/aws_config/setup_iam.yml 剧本设置两个组

  • ansible-integration-ci 将具有应用的策略,这些策略对于运行任何未标记为 unsupported 的集成测试都是必需的,并且旨在镜像 Ansible 的 CI 使用的策略。

  • ansible-integration-unsupported 将具有应用的额外策略,这些策略对于运行标记为 unsupported 的集成测试是必需的,包括管理 IAM 角色、用户和组的测试。

创建完组后,您需要创建一个用户并将该用户添加到这些组中。这些策略旨在将用户的权限降至最低。请注意,虽然此策略将用户限制在一个区域,但这并不能完全限制用户(主要是因为 Amazon ARN 表示法的限制)。用户仍然可以查看帐户定义的广泛权限,并且还可以管理与测试无关的某些资源(例如,具有不同名称的 AWS Lambda 函数)。在任何情况下,都不应在主要生产帐户中运行测试。

其他必需定义

除了安装策略并将策略提供给运行测试的用户身份之外,还需要创建一个名为 ansible_integration_tests 的 Lambda 角色,该角色具有 Lambda 基本执行权限。

网络测试

有关编写网络测试的指南,请参阅 资源模块集成测试

了解更多信息

如果您想了解有关改进 Ansible 测试计划的更多信息,请加入 Ansible 社区论坛