集成测试

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文件。

先决条件

一些测试假设已安装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选项可能会解决此问题。

运行集成测试

要在Ubuntu 18.04容器中运行所有针对POSIX平台的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 社区论坛