集成测试
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
文件。
先决条件
某些测试假设已安装 hg
、svn
和 git
,并且位于 PATH 中。某些测试(例如,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 用户
如果您使用的是带有 argcomplete
的 bash
,可以通过执行以下操作获得完整列表: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-integration
或 windows-integration
)时使用 --docker-privileged
选项可能会解决此问题。
运行集成测试
要在 Ubuntu 18.04 容器中运行所有 CI 集成测试目标(适用于 POSIX 平台)
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.yml
或 cloud-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 函数)。无论如何,都不应在主要的生产账户中运行测试。
其他所需定义
除了安装策略并将其赋予运行测试的用户身份外,还必须创建一个 lambda 角色 ansible_integration_tests,该角色具有 lambda 基本执行权限。
网络测试
有关编写网络测试的指导,请参见 资源模块集成测试。
了解更多信息
如果您想了解有关改进 Ansible 测试计划的更多信息,请加入 Ansible 社区论坛