集成测试

Ansible 集成测试系统。

针对 playbook 的测试,按 playbook 分类。

某些测试可能需要凭据。可以使用 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 文件。

先决条件

某些测试假定安装了 hgsvngit,并且位于路径中。某些测试(例如,Amazon Web Services 的测试)需要单独的定义,这些定义将在本文档的后面部分介绍。

(完整列表待定)

非破坏性测试

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

注意

在容器中运行集成测试

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

如下所示,运行我们的 CI 系统在 Fedora 34 容器中执行的所有 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 用户

如果您使用带有 argcompletebash,可以通过以下操作获取完整列表:ansible-test integration <tab><tab>

破坏性测试

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

ansible-test integration destructive/ --docker fedora34

Windows 测试

这些测试使用 winrm 连接插件和 Windows 模块。您需要定义一个包含远程 Windows 服务器的清单以用于测试,并启用 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 账户中运行测试。这些权限可以提供给专用用户。在运行测试之前需要配置这些权限。

测试策略

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

  • ansible-integration-ci 将应用运行任何未标记为 unsupported 的集成测试所需的策略,并且旨在镜像 Ansible 的 CI 使用的策略。

  • ansible-integration-unsupported 将应用运行标记为 unsupported 的集成测试所需的附加策略,包括管理 IAM 角色、用户和组的测试。

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

其他所需定义

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

网络测试

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

了解更多信息

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