Ansible Deploy Pro 教程:Go + Ansible 批量运维部署平台

Ansible Deploy Pro 是一个基于 Go + Ansible 的企业级批量运维部署平台。它把 Ansible 的能力包装成一个带 Web 界面的服务:主机清单、SSH 密钥、Playbook 模板、文件分发、批量命令和实时任务日志都集中在一个页面里完成,不用再为每台机器手写 Inventory、也不用在终端里盯着 ansible-playbook 的输出翻屏。对于需要同时管理几十上百台服务器的运维团队,这类平台的价值在于把重复操作标准化、可审计、可复用。

一、项目简介

Ansible Deploy Pro 的后端用 Go 编写,前端是静态页面(web/dist/index.html),服务通过 HTTP API 对外提供能力,底层调用本地安装的 Ansible 执行 Playbook。部署形态很简单:一个二进制文件 + 一个配置文件 + 一个数据目录,跑起来就是一个完整的运维控制台。

平台的核心设计思路是“把 Ansible 的工作流搬进浏览器”:主机信息存在 hosts.json,分组存在 groups.json,SSH 私钥集中放在 inventory/ssh_keys/,Playbook 放在 playbooks/ 目录,模板库内置 20 多个常用场景。执行任务时,后端生成对应的 ansible-playbook 调用,通过 SSE(Server-Sent Events)把实时日志推到浏览器,任务可随时取消、可按名称、ID、Playbook 或主机检索。

  • 技术栈:Go(后端服务与 HTTP API)、Ansible(执行引擎)、静态前端(暗色玻璃拟态界面)
  • 数据存储:JSON 文件(hosts.json、groups.json),无外部数据库依赖
  • 默认端口:8080,可通过启动参数修改
  • 开源协议:MIT License

二、功能特性

功能模块能力说明入口
主机管理密码 / SSH 密钥双认证,连接测试,分组管理主机列表页 / /api/hosts
SSH 密钥库集中管理 SSH 私钥,自动识别指纹密钥库 / /api/sshkeys
Playbook 管理在线编辑、变量解析、执行选项配置Playbook 页 / /api/playbooks
模板中心20+ 预置模板,一键创建 Playbook模板中心 / /api/templates
文件分发批量分发文件或文本内容到远程主机文件分发 / /api/files/distribute
命令执行批量并行 / 串行执行命令,快捷命令命令执行 / /api/hosts 相关接口
任务中心SSE 实时日志流,进度追踪,任务取消任务中心 / /api/tasks/:id/stream
任务检索按名称、ID、Playbook 或主机搜索,结合状态筛选并显示匹配数量任务中心搜索框
仪表盘主机状态概览、任务统计、系统信息首页 / /api/system/info

值得单独说明的是任务检索:当任务数量变多之后,靠翻页找任务既慢又容易漏。平台支持按任务名称、任务 ID、关联的 Playbook 或目标主机搜索,再叠加状态筛选(如运行中、成功、失败、已取消),搜索结果会直接显示匹配数量,先定位再处理,排障效率高很多。

三、适用场景

  • 批量部署中间件:新机器批量装 Docker、Nginx、MySQL、Redis,用模板中心一键下发,比逐台 SSH 快一个数量级。
  • 批量巡检与基线检查:用 check-system.yml、check-cpu-mem-disk.yml 这类 Playbook 定期采集系统信息和资源使用率,输出统一格式的结果。
  • 配置变更与补丁:update-packages.yml 批量升级软件包,配合任务中心看每台机器的实时输出,出问题立刻取消任务。
  • 安全加固:安全加固模板统一做 SSH 加固、防火墙配置和 fail2ban 部署,避免每台机器配置漂移。
  • 小团队的轻量 CMDB 入口:主机清单、分组、密钥集中管理,十几到几百台机器的规模下,不用上重型 CMDB 也能管得住。

不适用场景也要说清楚:它不适合替代 Jenkins、GitLab CI 做持续交付流水线,也不适合做大规模 CMDB(主机数据存在 JSON 文件里,几千台机器时检索和并发写入会吃力)。它的定位是“运维日常操作的控制台”,而不是全能平台。

四、系统架构与目录结构

服务是单体架构:Go 程序提供 HTTP 服务和前端静态文件,收到执行请求后调用本地 ansible-playbook 子进程,输出通过 SSE 实时推送给浏览器。主机、分组、密钥等数据以 JSON 文件持久化,没有引入数据库,部署和备份都很简单。

ansible-deploy/
├── cmd/
│   └── main.go                    # 主程序入口
├── config/
│   └── config.yaml                # 配置文件
├── internal/
│   ├── handlers/
│   │   └── handlers.go            # HTTP 处理器
│   ├── models/
│   │   └── models.go              # 数据模型
│   └── services/
│       ├── ansible.go             # Ansible 核心服务
│       ├── config.go              # 配置加载
│       └── templates.go           # Playbook 模板库
├── web/dist/
│   └── index.html                 # 前端界面
├── playbooks/                     # Playbook 目录
├── inventory/                     # 资产清单
│   ├── hosts.json                 # 主机数据
│   ├── groups.json                # 分组数据
│   └── ssh_keys/                  # SSH 密钥存储
└── README.md

数据流向很直观:浏览器调 /api/* 接口,后端 handlers 处理请求,services/ansible.go 负责组装 ansible-playbook 命令并执行,执行输出写入任务记录,同时通过 /api/tasks/:id/stream 以 SSE 推送。模板库(templates.go)里是 20 多个预置模板的定义,部署时先渲染成 Playbook 再执行。

五、安装部署

部署需要三样东西:Go 工具链、Ansible、SSH 客户端。README 要求 Go 1.21,Ansible 通过 pip 安装。建议把平台装在一台专门的运维跳板机或管理节点上,不要和业务服务混部。

# 1. 安装 Go(示例为 Go 1.21,可按需换更新版本)
curl -fsSL https://go.dev/dl/go1.21.linux-amd64.tar.gz | tar -C /usr/local -xzf -
export PATH=$PATH:/usr/local/go/bin
go version

# 2. 安装 Ansible
pip install ansible
ansible --version

# 3. 安装 SSH 客户端
apt install openssh-client  # Debian/Ubuntu
# yum install openssh-clients  # RHEL/CentOS/Rocky
# 4. 构建
cd ansible-deploy
go mod tidy
go build -o ansible-deploy cmd/main.go

# 5. 启动(默认端口 8080)
./ansible-deploy

# 自定义端口和配置文件
./ansible-deploy -port 9000 -config /path/to/config.yaml

# 浏览器打开 http://localhost:8080

仓库中还提供 scripts/install.sh 安装脚本(README 未说明其用法,使用前请先阅读脚本内容确认它会安装哪些依赖、做哪些系统改动)。生产环境建议用 systemd 托管服务,参考下面的单元文件。

# /etc/systemd/system/ansible-deploy.service
cat > /etc/systemd/system/ansible-deploy.service << 'EOF'
[Unit]
Description=Ansible Deploy Pro
After=network.target

[Service]
Type=simple
User=ops
WorkingDirectory=/opt/ansible-deploy
ExecStart=/opt/ansible-deploy/ansible-deploy -port 8080
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now ansible-deploy
systemctl status ansible-deploy --no-pager

六、配置详解

配置分两部分:命令行启动参数和 config.yaml。启动参数控制监听地址与端口,config.yaml 控制 Ansible 执行行为。两者要分开理解,出了问题先看是哪一层。

# 启动参数
./ansible-deploy -port 9000 -config /path/to/config.yaml
./ansible-deploy -bind 192.168.1.10 -port 8080  # 修改监听地址(默认仅 127.0.0.1)
# config/config.yaml 示例
# 以下三项省略时分别使用默认值:30 秒、10、json
ssh_timeout: 30        # SSH 连接超时时间(秒)
max_parallelism: 10    # 并发执行的主机数上限
callback_plugin: json  # Ansible 回调插件
  • ssh_timeout:默认 30 秒。目标主机网络较差或跨机房时适当调大,避免还没连上就超时;设为负数会阻止启动。
  • max_parallelism:默认 10。批量执行时同时操作的主机数。机器多、操作轻量(如采集信息)时可以调大;操作涉及重启服务或写磁盘时建议保持 10 左右,避免目标端被打爆。负数会阻止启动。
  • callback_plugin:默认 json。Ansible 的回调插件决定执行结果的输出格式,json 便于后端解析进度和结果。
  • 启动校验:负数超时 / 并发数以及无效 YAML 会阻止启动;如果找不到配置文件,服务会回退到默认配置继续启动——这个行为要留意,改了配置却不生效时,先确认 -config 指向的路径是否真的存在。

七、主机与 SSH 密钥管理

主机是平台操作的基本单位。添加主机时支持密码认证和 SSH 密钥认证两种方式,生产环境强烈建议用密钥认证:密码存在 hosts.json 里本身就有泄露风险,而且密码认证在批量场景下还容易触发目标机的登录失败锁定。

# 生成一对专用密钥(不要复用个人日常使用的密钥)
ssh-keygen -t ed25519 -C "ansible-deploy" -f ~/.ssh/ansible-deploy
# 把公钥分发到目标主机
ssh-copy-id -i ~/.ssh/ansible-deploy.pub user@192.168.1.101

# 通过 API 添加主机(示例)
curl -s -X POST http://localhost:8080/api/hosts \
  -H 'Content-Type: application/json' \
  -d '{"name":"web-01","host":"192.168.1.101","port":22,"user":"ops","auth_type":"key","key_name":"ansible-deploy","groups":["web"]}' | python3 -m json.tool

# 测试连接
curl -s -X POST http://localhost:8080/api/hosts/test/1 | python3 -m json.tool

# 查看主机列表
curl -s http://localhost:8080/api/hosts | python3 -m json.tool

密钥库的使用要点:私钥通过 /api/sshkeys 集中上传,平台自动识别指纹,添加主机时直接引用密钥名称,不用每次粘贴私钥内容。密钥文件落在 inventory/ssh_keys/ 目录下,这个目录的权限和备份要重点看——它丢了,所有主机的免密登录都要重建;它泄露了,所有主机都面临风险。建议把 inventory/ 目录整体纳入备份,并且不要把真实私钥和 hosts.json 提交进 Git。

主机分组按业务维度划分最实用,比如 web、db、cache、k8s-node,或者按环境分 prod-web、staging-web。执行 Playbook 时按分组选择目标,分组即资产边界,误操作的影响范围也先被分组框住。

八、Playbook 与模板中心实战

模板中心是新手最快上手的入口:20 多个预置模板覆盖系统管理、Web 服务、数据库、容器化、DevOps、安全加固和监控告警七大类,选模板、填参数、一键创建 Playbook,不用从零写 YAML。

分类模板说明
系统管理系统包更新、系统信息采集、资源监控检查、日志清理、时间同步(NTP)日常巡检与基线维护
Web 服务部署 Nginx、部署 Apache安装配置 Web 服务与反向代理
数据库部署 MySQL、部署 Redis、部署 PostgreSQL数据库安装与基础优化
容器化部署 Docker、部署 PortainerDocker CE、镜像加速、容器管理面板
DevOps部署 Node.js、部署 Python 应用、数据备份应用运行环境与定时备份
安全加固安全加固、SSL 证书部署SSH 加固、防火墙、fail2ban、Let's Encrypt
监控告警部署 Node Exporter、部署 GrafanaPrometheus 指标采集与可视化面板

以“部署 Nginx”为例:模板中心创建后生成一个可编辑的 Playbook,核心逻辑就是下面这段 YAML——先装包、再下发配置、最后确保服务处于运行状态并开机自启。理解这个结构后,改模板就是改这三个环节。

# 示例:部署 Nginx 的 Playbook 核心逻辑
- name: 部署 Nginx
  hosts: web
  become: true
  tasks:
    - name: 安装 Nginx
      package:
        name: nginx
        state: present

    - name: 下发站点配置
      template:
        src: nginx-site.conf.j2
        dest: /etc/nginx/conf.d/site.conf
      notify: 重载 Nginx

    - name: 确保 Nginx 运行并开机自启
      service:
        name: nginx
        state: started
        enabled: true

  handlers:
    - name: 重载 Nginx
      service:
        name: nginx
        state: reloaded
# 通过 API 执行 Playbook(示例)
curl -s -X POST http://localhost:8080/api/playbooks/execute \
  -H 'Content-Type: application/json' \
  -d '{"playbook":"deploy-nginx.yml","hosts":["web-01","web-02"],"extra_vars":{"server_name":"demo.local"}}' | python3 -m json.tool

# 查看 Playbook 内容
curl -s http://localhost:8080/api/playbooks/deploy-nginx.yml/content

# 从模板创建 Playbook
curl -s -X POST http://localhost:8080/api/templates/deploy \
  -H 'Content-Type: application/json' \
  -d '{"template_id":"deploy-nginx","name":"deploy-nginx-prod.yml"}' | python3 -m json.tool

写 Playbook 的几条经验:变量能参数化的不要写死(比如 server_name、端口、版本号走 extra_vars);涉及重启服务的步骤一律用 handlers,只在配置真正变化时才触发;先在单台 staging 机器上跑通,再扩大到整个分组;执行前用平台的连接测试确认目标主机都在线,避免跑到一半才发现一半机器连不上。

九、文件分发与批量命令

不是所有操作都值得写一个 Playbook。改一行配置、分发一个脚本、批量查一个版本号,用文件分发和批量命令更快。文件分发支持直接传文件内容或指定本地文件,批量命令支持并行和串行两种模式。

# 文件分发:把本地脚本批量推到目标主机
curl -s -X POST http://localhost:8080/api/files/distribute \
  -H 'Content-Type: application/json' \
  -d '{"hosts":["web-01","web-02"],"dest_path":"/usr/local/bin/check-disk.sh","content":"#!/bin/bash\ndf -h | awk '\''$5+0 > 80 {print \"磁盘告警: \" $0}'\''\n","mode":"0755"}' | python3 -m json.tool

# 批量执行命令:并行采集各机器的系统版本
curl -s -X POST http://localhost:8080/api/playbooks/execute \
  -H 'Content-Type: application/json' \
  -d '{"playbook":"check-system.yml","hosts":["web-01","web-02","db-01"]}' | python3 -m json.tool

并行和串行的选择标准很简单:只读操作(采集信息、查版本、看日志)用并行,越快越好;写操作(改配置、重启服务、升级软件包)优先用串行或小批量并行,一旦某台出问题立刻停下来,不会把故障扩散到整个分组。max_parallelism 这个配置项就是控制并行度的上限,批量操作前先根据操作的风险等级调好它。

十、任务中心与实时日志

每次执行都会生成一个任务,任务中心展示任务列表、状态和进度。执行过程中的输出通过 SSE 实时推送到浏览器,不用反复刷新页面;任务支持取消,取消后后端会尝试终止对应的 ansible-playbook 进程。

# 查看任务列表
curl -s http://localhost:8080/api/tasks | python3 -m json.tool

# 查看单个任务详情
curl -s http://localhost:8080/api/tasks/42 | python3 -m json.tool

# 实时订阅任务日志(SSE 流,输出持续推送直到任务结束)
curl -s -N http://localhost:8080/api/tasks/42/stream

# 取消一个正在运行的任务
curl -s -X DELETE http://localhost:8080/api/tasks/42 | python3 -m json.tool

排障时先看任务中心再看目标机器:任务详情里能看到每台主机的执行结果、失败的 task 名称和 Ansible 返回的错误信息。常见失败原因就几类:SSH 连不上(密钥或端口问题)、become 提权失败(sudo 配置)、Playbook 变量未定义、目标机缺少依赖包。按这个顺序排查,多数问题十分钟内能定位。

十一、常见问题

  • 启动后打不开页面?先确认服务是否在监听:ss -tlnp | grep 8080,再确认防火墙放行了端口。服务默认只监听 127.0.0.1,本机以外的浏览器打不开是正常的,见第十二节的安全建议。
  • 改了 config.yaml 不生效?先确认启动时 -config 指向的路径是否正确;找不到配置文件时服务会静默回退到默认配置,这是最常见的坑。
  • Playbook 执行报变量未定义?检查执行时是否传了 extra_vars,以及 Playbook 里变量名拼写是否一致。平台的变量解析在执行前做一次校验,但动态生成的变量名查不出来。
  • 任务一直卡在运行中?可能是目标主机 SSH 挂起(网络抖动或主机负载过高),先看任务日志最后输出在哪一步,再到目标机上检查对应进程;必要时取消任务后调大 ssh_timeout 重试。
  • 主机连接测试失败?先在管理节点上手动 ssh 目标机验证密钥和端口,再检查目标机的 sshd 配置和防火墙。密码认证的主机还要确认账号没有被 fail2ban 封禁。
  • 执行速度很慢?检查 max_parallelism 是否太小,以及目标主机的 DNS 反向解析是否超时(Ansible 收集 facts 时会解析主机名,DNS 有问题会显著拖慢)。

十二、安全与运维建议

这是最重要的一节。Ansible Deploy Pro 默认只监听 127.0.0.1,并且 README 明确说明:目前应用没有内置登录认证,不要把管理端口直接映射到公网。这个平台能对所有纳管主机执行任意命令,一旦暴露就等于把所有服务器的 root 权限交了出去。

# 本地使用:直接访问
./ansible-deploy -port 8080
# 打开 http://localhost:8080

# 远程使用:SSH 端口转发(推荐)
ssh -L 8080:127.0.0.1:8080 user@server
# 然后访问本机 http://localhost:8080

# 如确需修改监听地址(仍无内置认证,务必配合反向代理的认证与 HTTPS)
./ansible-deploy -bind 192.168.1.10 -port 8080
  • 团队使用:在前方配置带身份认证和 HTTPS 的反向代理(Nginx + basic auth 或 OIDC),并限制只有管理网段能访问。
  • 机密管理:主机清单和 Playbook 里不要写真实密码和私钥,改用 SSH 密钥与 Ansible Vault 管理机密。Vault 加密的变量文件可以这样处理:ansible-vault encrypt vars/secrets.yml,执行时传入 vault 密码。
  • 备份:定期备份 inventory/(hosts.json、groups.json、ssh_keys/)和 playbooks/ 目录,丢了密钥目录就要逐台重建免密登录。
  • 审计:任务中心保留了执行记录,定期检查谁在什么时候对哪些主机执行了什么操作,尤其是生产分组的操作。
  • 版本管理:Playbook 建议放进 Git 管理,改动先走评审再同步到 playbooks/ 目录,不要直接在生产环境的平台上改完就跑。

另外说明一点:仓库文件清单里还有 internal/auth/(auth.go、captcha.go、handlers.go)与 web/dist/login.html,README 没有说明这些文件的启用方式。按 README 的说法,当前版本没有内置登录认证,上面给出的安全建议(本机监听、SSH 隧道、反向代理认证)是应当遵守的做法;如果后续版本启用了内置认证,以官方 README 更新为准。

总结:Ansible Deploy Pro 的定位很清晰——给中小规模运维团队一个开箱即用的批量操作台。主机、密钥、模板、任务四件事管好了,日常的部署、巡检、变更、加固就都有了统一入口。先把它跑在跳板机上,纳管几台 staging 机器跑通模板,再逐步推广到生产分组,是最稳妥的上线路径。

发表回复

后才能评论