云原生后端开发工具微服务【免费下载链接】operator-sdkSDK for building Kubernetes applications. Provides high level APIs, useful abstractions, and project scaffolding.项目地址https://gitcode.com/gh_mirrors/op/operator-sdk点击查看免费下载导读本文以 operator-sdk 的官方 Ansible Operator 测试指南为核心系统讲解如何使用 Molecule 对基于 Ansible 的 Operator 进行单元级与端到端测试。你将掌握default、cluster、test-local三个 Molecule 场景的结构与运行方式、各场景可调的环境变量参数以及如何为 Operator 的 role 编写 Ansible 任务并配合verify.yml中的断言完成自动化验证。读完本文你可以直接在自己的 Ansible Operator 项目中搭建可复现、可进 CI 的 Molecule 测试体系。准备工作环境依赖与项目结构在开始使用 Molecule 测试之前需要确认以下环境就绪已安装最新版本的 operator-sdk本仓库即 operator-sdk 源码与文档所在仓库安装说明 提供了详细指引Docker 已安装并处于运行状态Molecule v3.0Ansible v2.9Python Kubernetes client即kubernetesPython 包供 Ansible 的kubernetes.core.k8s模块与 lookup 使用一个已初始化且包含molecule目录的 Ansible Operator 项目。注意如果你用旧版本 operator-sdk 初始化项目可以新建一个临时 dummy 项目把其中的molecule目录拷贝过来。拷贝时务必使用相同的api-version和kind生成 dummy 项目否则部分生成文件需要手工修改才能工作。项目顶层结构应如下所示. ├── config ├── Dockerfile ├── Makefile ├── molecule ├── playbooks ├── PROJECT ├── requirements.yml ├── roles └── watches.yamlrequirements.yml中声明的 Ansible 内容也需要安装可执行ansible-galaxy collection install -r requirements.yml从项目结构可以看出molecule目录与roles、playbooks、watches.yaml平级它是整套测试的载体。快速入门文档 会带你创建出这样一个具备molecule目录的初始项目。Molecule 场景测试的组织单元打开项目的molecule目录可以看到四个子目录default、test-local、cluster和templates。其中前三个目录各自包含一组文件共同构成一个 Molecule 的scenario场景templates目录则存放被多个场景共同使用的 Jinja 模板用于配置 Kubernetes 集群最典型的是operator.yaml.j2用来渲染 Operator 的 Deployment 清单。每个场景的基本文件结构如下. ├── molecule.yml ├── prepare.yml ├── converge.yml └── verify.yml各文件职责molecule.ymlMolecule 的配置文件。它定义使用哪个 driver 来搭建环境及相应配置、lint 规则以及一系列其他选项。Molecule 配置项的完整说明参见其官方 configuration 文档。prepare.yml一个 Ansible playbook在场景搭建过程中只运行一次。可以放入任意 Ansible 逻辑用于对测试环境做一次性配置例如创建 Operator 将要监听的集群级CustomResourceDefinition。converge.yml包含场景核心逻辑的 Ansible playbook。在普通 Molecule 场景中它通常 import 并运行对应的 role而在 Ansible Operator 中它主要用于创建将 Operator 部署进 Kubernetes 所需的资源。verify.yml存放验证任务的 Ansible playbook用于断言集群状态符合预期。下面逐一拆解三个场景的结构与用途。default 场景角色/playbook 的快速开发回路default场景面向 Ansible role 或 playbook 的开发阶段它在 Operator 上下文之外直接运行角色。执行命令为molecule test或molecule converge该场景没有对应的operator-sdk命令。molecule/default ├── molecule.yml ├── prepare.yml ├── converge.yml └── verify.ymlmolecule.yml指示 Molecule 使用 docker driver 启动一个 Kubernetes-in-DockerKIND容器默认把 API 暴露在主机的 9443 端口同时指定若干 inventory 与环境变量供prepare.yml和converge.yml使用。prepare.yml确保存在一个正确连接 KIND 集群且映射到对应端口的 kubeconfig并在测试开始前等待 Kubernetes API 变为可用。converge.ymlimport 并运行你的 role 或 playbook。verify.yml放置验证任务确认集群状态符合预期。可调参数环境变量运行 Molecule 前通过设置环境变量即可改变运行行为default场景支持的参数如下环境变量默认值用途KUBE_VERSION1.17要部署的 Kubernetes 版本TEST_CLUSTER_PORT9443宿主机上暴露 Kubernetes API 的端口TEST_OPERATOR_NAMESPACEosdk-test运行 role 时使用的命名空间cluster 场景对接现有集群的端到端测试cluster场景对现有集群运行 Operator 的端到端测试。前提是 Operator 镜像对集群可见已推送到集群可拉取的 registry。该场景会先把 CRD、RBAC 和 Operator 部署进集群然后创建 CustomResource 实例并执行断言确认 Operator 做出了正确响应。执行命令为molecule test或molecule converge同样没有对应的operator-sdk命令。molecule/cluster ├── molecule.yml ├── create.yml ├── prepare.yml ├── converge.yml ├── verify.yml └── destroy.ymlmolecule.yml使用 delegated driver不额外拉起任何基础设施。create.ymlno-op 占位文件但必须存在delegated driver 才能正常工作。prepare.yml确保 CRD、命名空间和 RBAC 资源已存在于集群中。converge.yml基于molecule/templates/operator.yaml.j2模板创建 Operator 的 Deployment。verify.yml放置验证任务。默认会创建一个 Custom Resource 并等待 reconciliation 成功完成同时附带一个示例断言。destroy.yml运行结束时确保命名空间、RBAC 资源和 CRD 被删除。可调参数环境变量cluster场景支持的参数如下环境变量默认值用途OPERATOR_IMAGE无必填部署 Operator 到集群时使用的镜像OPERATOR_PULL_POLICYAlways部署 Operator 时使用的镜像拉取策略KUBECONFIG~/.kube/config被测集群 kubeconfig 的路径TEST_OPERATOR_NAMESPACEosdk-test运行 role 时使用的命名空间test-local 场景无需外部集群与 registry 的完整 E2Etest-local场景运行完整的端到端测试但不需要现有集群或外部 registry可在允许运行特权容器的 CI 环境如 Travis中直接使用。它会拉起 Kubernetes-in-Docker 集群、构建 Operator、将其部署进集群然后创建 CustomResource 实例并执行断言。执行命令为molecule test -s local或使用molecule converge -s test-local运行后保留环境方便继续调试。molecule/test-local ├── molecule.yml ├── prepare.yml ├── converge.yml └── verify.ymlmolecule.yml使用 docker driver 启动 KIND 容器并把项目根目录挂载进去API 暴露在主机的 10443 端口同时指定若干 inventory 与环境变量。其配置与default场景非常相似。prepare.yml先运行default场景的prepare.yml确保 kubeconfig 存在、API 就绪再运行cluster场景的prepare.yml配置集群的 CRD 与 RBAC。converge.yml连接到 KIND 容器利用挂载的项目根目录构建 Operator——这让 Operator 无需推送到外部 registry 即可被集群使用随后基于molecule/templates/operator.yaml.j2模板确保集群中存在一份全新的 Operator 部署。verify.yml直接运行cluster场景的verify.yml因为test-local与cluster场景的主要差异在于部署方式而非 Operator 的行为。可调参数环境变量test-local场景支持的参数如下环境变量默认值用途KUBE_VERSION1.17要部署的 Kubernetes 版本TEST_CLUSTER_PORT10443宿主机上暴露 Kubernetes API 的端口TEST_OPERATOR_NAMESPACEosdk-test部署 Operator 及相关资源的命名空间converge 与 test开发期两种命令的选择开发测试时最常用的两个 Molecule 命令是molecule test和molecule converge二者行为差异显著molecule test执行完整循环——拉起集群、prepare、运行任务、最后销毁环境。适合一次性的完整验证结果干净、无残留。molecule converge更适合迭代式开发两次运行之间环境会保留。缺点是如果测试过程中把环境搞坏了可能引发意外问题此时执行molecule destroy即可重置环境。从源码仓库的文档佐证看这套场景布局在项目演进中发生过调整旧版布局为cluster、default、test-local三个平级场景加templates/operator.yaml.j2模板新版布局则收敛为default含create.yml、destroy.yml、kustomize.yml与tasks/目录加kind场景的结构详见 Ansible Operator 迁移指南。迁移指南同时强调新版molecule.yml中需要在provisioner.host_vars.localhost下配置如下host_varshost_vars: localhost: ansible_python_interpreter: {{ ansible_playbook_python }} config_dir: ${MOLECULE_PROJECT_DIRECTORY}/config其中ansible_python_interpreter确保使用 playbook 相同的 Python 解释器执行本地任务config_dir指向项目config目录供 kustomize 等步骤定位资源清单。若你在老版本项目上迁移测试这些字段是必须对齐的。编写测试从添加任务到添加断言以operator-sdk new生成的默认 Operator 为例它初始不做任何事因此先添加一个 Ansible 任务让 Operator 产生可验证的行为。本例创建一个带单个 key 的简单 ConfigMap。将任务添加到roles/example/tasks/main.yml--- # tasks file for exampleapp - name: create Example configmap kubernetes.core.k8s: definition: apiVersion: v1 kind: ConfigMap metadata: name: test-data namespace: {{ ansible_operator_meta.namespace }} data: hello: world要点说明这里使用kubernetes.core.k8s模块声明式创建资源这也是 Operator 内部 reconcile 时驱动资源状态变更的同一套机制ansible_operator_meta.namespace由 Operator 运行时注入参见 信息流与 watches 文档 中对ansible_operator_meta的说明保证 ConfigMap 创建在 Operator 正在处理的资源所在命名空间namespace字段不写死、而是取自元数据使测试与真实运行语义一致。接下来为上述行为补充断言。在molecule/cluster/verify.yml中添加一个对应断言并附上 debug 消息以观察 ConfigMap 内容--- - name: Verify hosts: localhost connection: local tasks: - debug: varcm vars: cm: {{ lookup(kubernetes.core.k8s, api_versionv1, kindConfigMap, namespacenamespace, resource_nametest-data) }} - assert: that: cm.data.hello world vars: cm: {{ lookup(kubernetes.core.k8s, api_versionv1, kindConfigMap, namespacenamespace, resource_nametest-data) }}说明connection: local配合hosts: localhost验证任务在本地执行通过 kubeconfig 访问集群lookup(kubernetes.core.k8s, ...)是 Ansible 的 Kubernetes lookup 插件按api_version、kind、namespace、resource_name实时读取资源对象assert模块检查cm.data.hello world即 Operator 创建出来的 ConfigMap 数据是否符合任务定义。现在 Operator 有了实际功能也有了对行为的断言执行下面命令即可验证一切正常molecule test -s local这条命令会走通test-local场景拉起 KIND 集群 → preparekubeconfig CRD/RBAC→ 构建并部署 Operator → 创建 CR → 执行 verify 断言 → 销毁环境。Ansible 的assert与fail模块assert与fail模块是为 Ansible Operator 测试添加断言与失败条件时最实用的两个模块assert对that表达式求值表达式为假时任务失败并终止 playbook常用于资源状态符合预期类检查fail显式使任务失败可携带自定义msg适合表达不应出现的负向条件或提前终止场景。结合上文verify.yml中的用法它们可以轻松覆盖正向期望与负向期望两类断言正向用assert校验资源字段取值负向用fail或配合assert取反在出现意外状态时立即暴露问题。把 Molecule 测试接入开发与 CI 流程综合三个场景的特性推荐的使用路径是开发角色逻辑时用default场景 molecule converge环境常驻、迭代迅速本地或 CI 中跑完整验证时用test-localmolecule test -s local无需外部集群和 registry适合 Travis 等允许特权容器的 CI有现成集群、且 Operator 镜像已推送时用cluster场景贴近生产部署形态务必通过OPERATOR_IMAGE指定镜像每次完整跑完后用molecule destroy清理环境molecule test会自动清理converge不会。另外注意default场景的KUBE_VERSION默认值 1.17 是文档编写时代的默认值实际取值应以你当前 operator-sdk 与 Molecule 版本生成的molecule.yml为准升级 SDK 时场景布局会变化default/kind双场景取代旧三场景请参照迁移指南 同步更新测试文件。总结Molecule 为 Ansible Operator 提供了从角色级快速验证到集群内端到端验证的完整测试阶梯default场景在 Operator 上下文之外直接运行角色cluster场景把 Operator 真正部署到现有集群并执行断言test-local场景则在 KIND 容器内完成构建 部署 验证全流程且不依赖外部 registry。配合molecule.yml的环境变量参数、prepare.yml/converge.yml/verify.yml的分工以及assert/fail模块的断言能力你可以用极少的额外设施为 Ansible Operator 建立一套可在本地与 CI 中重复执行的自动化测试体系。更深入的知识如角色脚手架、watches 配置、信息流可继续查阅仓库内的 scaffolding 参考文档 与 watches 参考文档。赞分享云原生后端开发工具微服务【免费下载链接】operator-sdkSDK for building Kubernetes applications. Provides high level APIs, useful abstractions, and project scaffolding.项目地址https://gitcode.com/gh_mirrors/op/operator-sdk点击查看免费下载相关推荐Windows终极优化神器一个工具搞定所有系统烦恼小白也能变专家Windows终极优化神器一个工具搞定所有系统烦恼小白也能变专家 你是否曾经面对新电脑时感到手足无措安装软件、调整设置、优化系统、修复问题……这些原本需要桌面应用运维使用Ansible Molecule测试KubeVirt虚拟机的完整指南使用Ansible Molecule测试KubeVirt虚拟机的完整指南 概述 你是否在为Ansible角色Role或Playbook的KubernetesMolecule 项目使用教程Ansible 自动化测试的终极指南Molecule 项目使用教程Ansible 自动化测试的终极指南 还在为Ansible playbook的测试而烦恼吗面对复杂的部署环境和难以复现的bug上一篇Xinference 部署 Qwen2.5-OmniOmni 全模态模型的启动命令、引擎选择与源码级请求链路下一篇阴阳师自动化脚本OAS20任务智能托管与高效游戏管理解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考