集成测试
Ansible 集成测试系统。
通过 playbook 对 playbook 进行测试。
某些测试可能需要凭据。凭据可通过 credentials.yml 指定。
某些测试可能需要 root 权限。
注意
每个新模块和插件都应该有集成测试,即使这些测试无法在 Ansible CI 基础设施上运行。在这种情况下,应在 别名文件中将测试标记为 unsupported 别名。
快速上手
强烈建议您安装并激活 argcomplete Python 包。它为 bash 中的 ansible-test 测试运行器提供了 Tab 键补全功能。
配置
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 ubuntu。运行 ansible-test integration --help 获取支持的容器镜像列表。您可以在输出的 target docker images 章节中找到它们。default 镜像用于 sanity 和单元测试,以及用于与平台无关的集成测试(如云模块测试)。
对于由我们的 CI 系统在 Fedora 34 容器中执行的所有 POSIX 平台测试,运行方式如下
ansible-test integration shippable/ --docker fedora
您也可以排除特定测试,例如针对单个模块的测试
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 fedora
Windows 测试
这些测试测试 winrm 连接插件和 Windows 模块。您需要定义一个包含远程 Windows 服务器的清单以用于测试,并启用 PowerShell Remoting 才能继续。
运行这些测试可能会导致您的 Windows 主机发生更改,因此请不要在生产/关键 Windows 环境中运行它们。
启用 PowerShell Remoting(通过远程桌面在 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 容器中运行所有针对 POSIX 平台的 CI 集成测试目标
ansible-test integration shippable/ --docker ubuntu
您也可以运行特定测试或选择不同的 Linux 发行版。例如,要在 Ubuntu 容器中运行 ping 模块的测试
ansible-test integration ping --docker ubuntu
容器镜像
容器镜像会定期更新。要查看当前的容器镜像列表
ansible-test integration --help
该列表位于 target docker images and supported python version 标题下。
云测试的其他配置
要运行某些测试,您必须在 tests/integration 目录中名为 cloud-config-aws.yml 或 cloud-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 playbook 可用于设置两个组
ansible-integration-ci 将应用运行任何未标记为 unsupported 的集成测试所需的策略,旨在镜像 Ansible CI 所使用的策略。
ansible-integration-unsupported 将应用运行标记为 unsupported 的集成测试所需的额外策略,包括管理 IAM 角色、用户和组的测试。
组创建后,您需要创建一个用户并将该用户设为这些组的成员。这些策略旨在尽量减少该用户的权限。请注意,虽然此策略将用户限制在一个区域,但这并不能完全限制用户(主要是由于 Amazon ARN 记法的限制)。用户仍然拥有查看账户定义的广泛权限,并且能够管理一些与测试无关的资源(例如,名称不同的 AWS lambda)。无论如何,都不应在主要生产账户中运行测试。
其他所需定义
除了安装策略并将其分配给运行测试的用户身份之外,还需要创建一个具有 lambda 基础执行权限的 lambda 角色 ansible_integration_tests。
网络测试
有关编写网络测试的指南,请参阅 资源模块集成测试。
更多信息
如果您想了解更多关于改进 Ansible 测试的计划,请加入 Ansible 社区论坛