使用 Ansible 和 Docker 从源码构建并部署最新的 open-vm-tools
Source: Dev.to
为什么使用此角色?
在 VMware 上运行 Linux 虚拟机时,发行版提供的 open‑vm‑tools 包往往落后上游 1–2 年。这可能导致:
| 功能 | 发行版包 | 此角色 |
|---|---|---|
| 版本 | 落后数月/数年 | 始终为最新上游版本 |
| VMCI 套接字支持 | 常常缺失 | 已编译进 |
| CVE 补丁 | 取决于发行版的回溯 | 上游修复随发布 |
| 多发行版支持 | 一次只能一个 | Ubuntu、Debian、RHEL、Rocky、Fedora、SUSE 等 |
该角色在隔离的 Docker 容器中构建最新的 open‑vm‑tools,生成干净的 .deb/.rpm 包,并在不污染 Ansible 控制节点的情况下将其部署到你的整批机器上。
构建软件包
构建在 Docker 容器中进行——每个发行版一个容器——因此你的主机保持干净。
# 为所有受支持的发行版构建
./build-all.sh
# 为单个发行版构建(例如 Rocky 9)
./build-all.sh --target rocky9
# 固定特定的上游版本
./build-all.sh --version 12.5.0
输出的(.deb 和 .rpm)文件会放在 output/,并自动复制到 files/,供 Ansible 使用。
安装角色
ansible-galaxy install giuliosavini.vmware_tools_builder
清单示例
[debian]
srv-web01 ansible_host=10.0.0.1
srv-web02 ansible_host=10.0.0.2
[rhel]
srv-app01 ansible_host=10.0.0.10
[all:vars]
ansible_user=root
运行剧本
ansible-playbook -i inventory.ini playbook.yml
角色行为
角色自动处理三种情况——无需条件变量:
| 当前状态 | 操作 |
|---|---|
| 未安装 open‑vm‑tools | 全新安装 |
| 已存在发行版的 open‑vm‑tools | 移除它,安装自定义构建 |
| 已存在先前的自定义构建 | 原地升级 |
对每台主机,角色执行 preflight → deploy → post‑install → diagnose → verify。如果 vmtoolsd 启动失败,会收集日志并在报告失败前尝试自动恢复。
支持的发行版
| 发行版 | 构建方式 | 部署方式 |
|---|---|---|
| Ubuntu 22.04+ | Docker 容器 | Ansible (apt) |
| Debian 12+ | Docker 容器 | Ansible (apt) |
| RHEL / Rocky / Alma 9 | Docker 容器 | Ansible (yum) |
| RHEL / Rocky / Alma 8 | Docker 容器 | Ansible (yum) |
| Fedora | Docker 容器 | Ansible (yum) |
| SUSE / openSUSE | — | Ansible (zypper) |
示例剧本
- name: Deploy custom open-vm-tools
hosts: all
become: true
gather_facts: true
roles:
- role: giuliosavini.vmware_tools_builder
vmtools_remove_standard: true
vmtools_diagnose_on_failure: true
要求
- 构建主机上安装 Docker(仅用于编译软件包)
- 控制节点上安装 Ansible 2.12+
- 能够 SSH 访问目标机器
不需要特殊的构建依赖或污染的环境。
结论
如果你管理 VMware 基础设施并且厌倦了过时的客机工具,试试这个角色吧。该角色已在 Ansible Galaxy 上发布,源码托管在 GitHub。
- GitHub:
- Ansible Galaxy: