首页
/ Ansible(ansible-core)仓库导读:设计原则、代码结构、安装运行与开发测试全解

Ansible(ansible-core)仓库导读:设计原则、代码结构、安装运行与开发测试全解

2026-09-04 17:44:37作者:温艾琴Wonderful

本文基于 Ansible 仓库根目录的 README.md 展开,系统梳理这个"极简 IT 自动化平台"的设计原则、CLI 入口与安装方式、核心代码结构、开发环境搭建与 ansible-test 测试体系。读完本文,你将能够独立安装并运行当前仓库版本的 ansible-core,理解 lib/ansible/ 各子目录的职责划分,并掌握从 devel 分支拉取代码、搭建开发环境、执行 sanity/units/integration 三类测试的完整流程。

一、项目定位:无代理(Agentless)的 IT 自动化系统

README 对 Ansible 的定位非常明确:

Ansible is a radically simple IT automation system. It handles configuration management, application deployment, cloud provisioning, ad-hoc task execution, network automation, and multi-node orchestration.

即 Ansible 覆盖六大能力:配置管理、应用部署、云资源供给、临时(ad-hoc)任务执行、网络自动化和多节点编排,并特别强调它能轻松完成"带负载均衡的零停机滚动更新"这类复杂变更。

pyproject.toml 可以看到,当前仓库对应的发行名是 ansible-corename = "ansible-core"description = "Radically simple IT automation"),Python 版本要求为 >=3.13,分类器声明生产稳定(Development Status :: 5 - Production/Stable)。版本号由 setuptools 从源码动态读取,即 version = {attr = "ansible.release.__version__"},对应 lib/ansible/release.py 中的 __version__ = '2.22.0.dev0'——这表明当前仓库处于 2.22 的开发线(devel 分支)。

设计原则

README 列出了 9 条设计原则,它们解释了 Ansible 架构上的一系列取舍:

  • 安装极其简单,学习曲线尽可能平缓;
  • 快速并行地管理大量机器;
  • 无代理(agentless):不引入自定义 agent、不开额外端口,复用远端已有的 SSH 守护进程;
  • 用一种对机器和人类都友好的语言描述基础设施(即 YAML playbook + 类英语的模块参数);
  • 重视安全性,以及内容的可审计、可审查、可重写;
  • 新机器可以即时纳管,无需在远端预装任何软件;
  • 模块可以用任意动态语言开发,而不限于 Python;
  • 支持非 root 用户使用;
  • 目标是成为"最好用的 IT 自动化系统"。

这些原则在仓库中都有对应体现:模块通过 SSH 在远端执行、模块代码打包为 AnsiballZ 载荷(见下文代码结构部分)、lib/ansible/module_utils/ 中同时包含 Python、PowerShell(.psm1)与 C#(.cs)共享代码。

二、代码结构:从 README 到仓库布局

README 的 "Coding Guidelines" 一节指向仓库内 context/ 目录:"Development context for ansible-core can be found in the context/ directory"。context/code-structure.md 给出了主库 lib/ansible/ 的标准布局,与仓库实际目录一一对应:

目录 职责
lib/ansible/cli/ 各 CLI 入口实现(ansible、ansible-playbook 等)
lib/ansible/executor/ 任务执行引擎与策略(含 powershell/ 下的 PowerShell 支持)
lib/ansible/inventory/ 主机清单管理与解析
lib/ansible/modules/ 核心内置自动化模块
lib/ansible/module_utils/ 模块间共享工具(含 csharp/powershell/
lib/ansible/plugins/ 插件框架(过滤器、测试、lookup 等)
lib/ansible/vars/ 变量管理
lib/ansible/config/ 配置处理(内置默认配置为 lib/ansible/config/base.yml
lib/ansible/collections/ Ansible Collections 框架

其中几个关键约定值得注意(均出自 context/code-structure.md):

  • 模块是"工作单元",在远端执行lib/ansible/modules/ 下的模块会被打包发送到目标主机上运行,因此有严格的导入限制——modules/ 只能导入 module_utils/,而 module_utils/ 不能从外部导入,这正是它能被自包含打包的原因;
  • 插件扩展策略:新插件应放进 collection 而不是 ansible-core,core 团队很少接受进入核心的新插件;
  • 资源嵌入机制:需要跨 Python 版本运行的模块可用 EmbedManager.embed()(来自 ansible.module_utils.embed)把独立脚本打进 AnsiballZ 载荷,嵌入资源放在 lib/ansible/module_utils/_embed/

CLI 入口一览

pyproject.toml[project.scripts] 段定义了全部可执行入口,安装后即可在 PATH 中直接使用:

[project.scripts]
ansible = "ansible.cli.adhoc:main"
ansible-config = "ansible.cli.config:main"
ansible-console = "ansible.cli.console:main"
ansible-doc = "ansible.cli.doc:main"
ansible-galaxy = "ansible.cli.galaxy:main"
ansible-inventory = "ansible.cli.inventory:main"
ansible-playbook = "ansible.cli.playbook:main"
ansible-pull = "ansible.cli.pull:main"
ansible-vault = "ansible.cli.vault:main"
ansible-test = "ansible_test._util.target.cli.ansible_test_cli_stub:main"

可以看到每个入口都映射到 lib/ansible/cli/ 下的具体模块(如 ansible-playbook 对应 ansible/cli/playbook.py),唯一的例外是 ansible-test,它的实现位于测试包 test/lib/ansible_test/pyproject.toml[tool.setuptools.packages.find]libtest/lib 都列为包查找路径,因此 ansible_testansible 同属一个发行包)。

三、安装与运行

README 的 "Use Ansible" 一节给出两条路径,结合仓库文件可以落到具体操作:

方式一:安装发布版本

正式用户通过 pip 或各发行版包管理器安装已发布的 Ansible 版本(官方安装指南在仓库外维护,此处不展开)。适用前提是机器满足 pyproject.toml 声明的 Python >=3.13。运行期依赖在 requirements.txt 中声明,刻意保持"最宽松集合"(文件头注释说明只列必需包而非锁定版本):

jinja2 >= 3.1.0      # 3.1.0 修复了 native macro 支持
PyYAML >= 5.1        # 5.1 起支持 Python 3.8+
cryptography
packaging
resolvelib >= 0.8.0, < 2.0.0   # ansible-galaxy 的依赖解析器

其中 resolvelib 被注释特别标注为"0.x 版本跳级视为破坏性变更",是 ansible-galaxy 解析 collection 依赖的关键组件。

方式二:从源码运行(devel 分支)

README 指出高级用户可以直接运行 devel 分支(最新特性与修复,但更可能遇到破坏性变更)。仓库内 context/dev-environment.md 给出两种等价的开发环境搭建方式,并要求 POSIX 系统(Windows 需用 WSL):

方式 A:可编辑安装

pip install -e .

方式 B:source 环境脚本

source hacking/env-setup

hacking/env-setup 是一个 POSIX shell 脚本,其逻辑(从脚本源码可直接读出)为:

  1. 通过 $BASH_SOURCE(或 ksh/ash 兼容分支)定位脚本所在目录,导出 ANSIBLE_DEV_HOME 指向仓库根目录;
  2. prepend_path 函数把 仓库根/lib仓库根/test/lib 前置到 PYTHONPATH,把 仓库根/bin 前置到 PATHdocs/man 前置到 MANPATH(均已存在则跳过);
  3. 清理仓库内所有 *.pyc 缓存,避免旧字节码干扰开发;
  4. 支持 -q(静默)参数,并提示可用 -i 指定主机清单文件。

也就是说,不安装任何包、仅靠修改环境变量就能让 bin/ 下的 CLI 直接跑在 checkout 的代码上——这与 README "Power users 直接跑 devel 分支"的定位一致。

四、开发环境:分支模型与测试体系

分支信息

README 的 "Branch Info" 说明(与 context/contributing.md 相互印证):

  • devel 分支对应正在积极开发中的版本(当前即 2.22 开发线);
  • stable-2.X 分支对应稳定发布;
  • 提 PR 需基于 devel 创建分支并搭建开发环境(即上面的 pip install -e .source hacking/env-setup);
  • 所有 PR 一律指向 devel;bug 修复仅回溯到最新 stable,关键修复回溯到最新两个 stable,安全问题应通过安全渠道而非 GitHub issue 报告。

变更日志(Changelogs)

仓库内 changelogs/ 目录维护变更日志:发布时由 changelogs/fragments/ 中的碎片文件生成版本化的 CHANGELOG-vX.Y.rstdevel 分支上只有碎片(如 changelogs/fragments/ 下的 86986-validate-modules-positional-lookup.yml 等),不生成汇总 changelog;稳定分支则在发布后查看该分支的版本化文件。这对贡献者很重要:改动 devel 时应同步添加 changelog fragment。

用 ansible-test 跑三类测试

README 之外,context/running-tests.md 给出了完整的测试命令规范,全部统一使用 ansible-test(它支持在未安装状态下直接调用:bin/ansible-test sanity -v --docker default):

Sanity 测试(lint/静态检查,不需要 --docker)

# 运行全部 sanity 测试
ansible-test sanity -v
# 列出可用 sanity 测试
ansible-test sanity --list-tests
# 只跑特定测试
ansible-test sanity -v --test pep8 --test pylint
# 只针对指定文件(路径相对仓库根)
ansible-test sanity -v lib/ansible/modules/command.py
# 在容器中跑全量(覆盖最全)
ansible-test sanity -v --docker

注意:应针对变更集中的所有文件跑 sanity,而不只是正在编辑的文件。

Unit 测试

ansible-test units -v --docker
# 指定单测(target 位于 test/units/)
ansible-test units -v --docker test/units/modules/test_command.py
# 带覆盖率
ansible-test units -v --docker --coverage

Integration 测试

# 跑全部集成测试
ansible-test integration -v --docker ubuntu
# 跑指定 target(test/integration/targets/ 下的目录名)
ansible-test integration -v --docker ubuntu ping

容器选择规则:sanity/unit 用 --docker(默认 default 容器),integration 必须用发行版容器(如 --docker ubuntu--docker fedora),base/default 容器仅供 sanity/unit 使用;--docker 之后紧跟的非容器参数会被当作镜像名,需避免误用。隔离方式上优先 --docker(支持 Docker 或 Podman),容器不可用时退回 --venv,但后者下 unit 测试可能因宿主机环境差异而不稳定。

测试目录与主库结构互为镜像:test/units/ 对应单测、test/integration/targets/ 按"被测模块/功能"组织集成测试(如 test/integration/targets/git/test/integration/targets/ping/),只有模块真正跑在目标主机上,其余插件都在本地 ansible 进程内执行。

五、社区、贡献与许可

README 的 "Communication" 与 "Contribute to Ansible" 两节指明:答疑与社区互动以 Ansible 论坛(含 Get Help、Social Spaces、News & Announcements 等板块)和 Bullhorn 邮件通告为主渠道;贡献入口是向 devel 分支提 PR,较大改动应先与核心团队沟通以避免重复劳动。仓库内对应的本地文档是 context/contributing.md(贡献守则:变更保持聚焦、使用 GitHub 模板、在 issue 的 component 字段填仓库根相对路径)和 AGENTS.md(面向 AI Agent 的协作说明,与 context/ 目录互补——后者面向"人类与 Agent"通用的核心开发上下文)。

许可方面,README 声明项目采用 GNU General Public License v3.0 or later,全文见 COPYINGpyproject.tomllicense = "GPL-3.0-or-later",且 license-files 同时包含 licenses/ 目录下的多份第三方许可文本(Apache、BSD、MIT、PSF 等),对应打包进 AnsiballZ/_vendor 的第三方组件。

小结

回到 README 的核心信息:Ansible 是一个以 SSH 为传输、无代理、并行执行、用类英语语言描述基础设施的 IT 自动化平台。对开发者而言,当前仓库(ansible-core 2.22 开发线,Python ≥ 3.13)的典型工作流是:

  1. 拉取 devel 分支,pip install -e .source hacking/env-setup 搭建环境;
  2. context/code-structure.md 的布局在 lib/ansible/ 下定位 CLI、executor、modules、plugins 等模块;
  3. ansible-test sanity/units/integration 验证改动,并按 changelogs/ 的约定添加 changelog fragment;
  4. devel 分支提交 PR,遵循 context/contributing.md 的分支与回溯策略。

以上每一步都有仓库内的文件可以直接核对,建议以本文给出的相对路径为入口继续深入。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.12 K
2.72 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
904
1.82 K
docsdocs
暂无描述
Markdown
889
5.78 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
854
1.34 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
527
590
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.52 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.33 K
1.45 K
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
540
384
flutter_flutterflutter_flutter
本仓库是 Flutter SDK 与 Flutter Engine 的 OpenHarmony 适配版本,由 CPF-Flutter 团队维护。开发者可使用熟悉的 Flutter 技术栈开发 OpenHarmony 应用,3.35.7 及以后的适配版本可基于本仓库源码构建支持 OpenHarmony 的 Flutter Engine。
Dart
1.17 K
341