AnsiblePilot 是一个基于 Qt/C++ 的 Ansible 可视化批量运维工具,用来把常用的 Ansible 操作做成图形界面,方便不会频繁敲命令的人快速执行批量上传、批量部署、批量命令和连通性测试。
当前程序支持以下功能:
- 自动扫描 Ansible 文件:扫描工作目录下的
*.yaml、*.yml、hosts、my_hosts、*.ini。 - 批量部署:选择已有 playbook,例如
ansible.yaml、ansible-start.yaml、ansible-redeploy.yaml后执行。 - Ping 测试:调用
ansible -m ping检查目标主机连通性。 - 批量执行命令:通过
shell、command、service、systemd等模块批量执行命令。 - 批量上传:通过 Ansible
copy模块把本地文件或目录上传到远端服务器。 - 常用操作:服务管理、系统信息、进程与日志、文件操作、软件包等可视化按钮,无需手写 playbook。
- 外部终端执行:通过系统默认终端运行 Ansible,避免 GUI 进程环境限制影响 Ansible。
- 执行日志同步:外部终端执行时,同步显示 Ansible 标准输出、错误输出和退出码。
- 并发执行:每次点击执行都会启动一个独立的外部终端,使用各自独立的脚本/日志/状态/PID 文件,互不干扰;GUI 同时监控多个任务的状态。
- 运行历史:日志区上方的
运行历史Tab 会按时间记录每次执行的命令、退出码和成功/失败状态,可双击行复制命令到剪贴板。 - 停止任务:
停止当前任务按钮会读取每个正在运行任务的 PID,向其进程组发送TERM/KILL信号,连同终端中的 ansible 子进程一起结束。 - 命令预览:执行前展示即将执行的命令。
推荐使用 Qt Creator 打开项目。
步骤如下:
-
打开 Qt Creator。
-
选择
File -> Open File or Project。 -
打开项目文件:
AnsiblePilot.pro -
选择可用的 Qt Kit。
-
点击
Build -> Run qmake。 -
点击
Build -> Build Project。 -
编译成功后点击运行。
如果你的系统已经配置好 qmake 和编译器,可以在项目目录执行:
qmake AnsiblePilot.pro
make程序本身只是图形界面,真正执行任务仍然依赖系统中的 ansible 和 ansible-playbook 命令。
确认 Linux 系统中命令可用:
ansible --version
ansible-playbook --version程序执行 Ansible 时会优先使用系统默认终端。
建议确认默认终端可用:
x-terminal-emulator --version也可以查看系统默认终端:
update-alternatives --list x-terminal-emulator程序会依次尝试:
x-terminal-emulator
mate-terminal
gnome-terminal
konsole
xfce4-terminal
xterm
Ansible 批量操作依赖 SSH 登录远端服务器。
请确保:
-
当前 Linux 主机能 SSH 到目标服务器。
-
Inventory 文件中的用户配置正确,例如:
[web] 172.10.10.11 ansible_ssh_user=root 172.10.10.12 ansible_ssh_user=root
-
如果没有配置免密登录,可以在界面的“额外参数”里填写:
--ask-pass -
如果需要 sudo/become 密码,可以填写:
--ask-become-pass
程序主界面分为三部分:
Ansible 项目的根目录。
例如:
/home/user/ansible
点击 选择目录 可以切换目录。
切换后点击 刷新扫描,程序会重新扫描 playbook 和 inventory 文件。
Ansible 主机清单文件。
常见文件名:
hosts
my_hosts
程序会自动扫描,也可以手动点击 选择 Inventory。
如果系统存在:
/etc/ansible/hosts
程序启动时会优先加入并默认选择这个 Inventory。工作目录中的 hosts、my_hosts、*.ini 也会同时加入下拉框。
要执行的 Ansible 主机组。
例如:
web
all
如果你的 inventory 是:
[web]
172.10.10.11 ansible_ssh_user=root这里就填写:
web
限制只对部分主机执行。
例如只执行某台机器:
172.10.10.11
或者限制某个组:
web
等价于命令行参数:
--limit 172.10.10.11填写额外的 Ansible 参数。
常用示例:
-vv
--ask-pass
--ask-become-pass
--check
也可以组合:
-vv --ask-pass --ask-become-pass
如果你不熟悉 playbook,请优先使用 常用操作 标签页。所有按钮内部都会自动转换为标准 Ansible ad-hoc 命令,命令本身会同步显示在日志区域,方便你对照学习。
- 输入服务名(如
sshd、nginx)。 - 点击 启动服务 / 停止服务 / 重启服务 / 查看状态。
等价命令:
ansible -i hosts web -m systemd -a "name=sshd state=restarted"
ansible -i hosts web -m shell -a "systemctl status sshd --no-pager"一键查看:
- 磁盘
df -h - 内存
free -h - 运行时间
uptime - 主机名 / 内核
hostname && uname -a - CPU 负载
top -b -n1 | head -20 - 当前登录用户
who
- 进程:填关键字 → 查看进程 / 杀进程(
pkill -f)。 - 日志:填日志路径 + 行数 →
Tail末尾 N 行;填关键字 →Grep查找。
等价命令示例:
ansible -i hosts web -m shell -a "ps -ef | grep -v grep | grep nginx"
ansible -i hosts web -m shell -a "tail -n 200 /var/log/messages"
ansible -i hosts web -m shell -a "grep -n -- ERROR /var/log/messages | tail -n 200"- 下载:远端 → 本地,使用
fetch模块。 - 删除:远端文件或目录,使用
file state=absent。 - 建目录:使用
file state=directory。 - 改权限:使用
file mode=...。
- 输入包名后选择
apt 安装/卸载、yum 安装/卸载或 自动识别(package模块)。
等价命令:
ansible -i hosts web -m package -a "name=vim state=present"打开 批量部署 标签页。
步骤:
- 在基础配置里选择
工作目录。 - 选择
Inventory。 - 填写
主机组,例如web。 - 在 Playbook 下拉框中选择要执行的 YAML 文件。
- 检查下方
命令预览。 - 点击
执行选中 Playbook。 - 程序会打开外部终端执行任务。
- 在日志区域查看同步输出和退出码。
常见 playbook:
ansible.yaml
ansible-start.yaml
ansible-delete.yaml
ansible-redeploy.yaml
ansible-check-agent.yaml
对应命令类似:
ansible-playbook -i hosts ansible-redeploy.yaml点击 Ping 测试 会执行类似命令:
ansible -i hosts web -m ping如果返回 pong,说明连通性正常。
打开 批量命令 标签页。
模块选择:
shell
参数输入:
ps -ef | grep serveragent点击 批量执行命令。
等价命令:
ansible -i hosts web -m shell -a "ps -ef | grep serveragent"模块选择:
command
参数输入:
hostname等价命令:
ansible -i hosts web -m command -a "hostname"查看进程:
ps -ef | grep serveragent查看目录:
ls -l /root/work/missionschedulingsoftware/查看磁盘:
df -h查看服务状态:
systemctl status sshd打开 批量上传 标签页。
步骤:
- 点击
选择本地文件/目录。 - 选择要上传的程序文件或目录。
- 填写远端路径。
- 检查命令预览。
- 点击
批量上传。
默认远端路径:
/root/work/missionschedulingsoftware/
等价命令:
ansible -i hosts web -m copy -a "src=本地路径 dest=/root/work/missionschedulingsoftware/"任务执行时会打开外部终端,同时 GUI 下方日志区域会同步显示:
- Ansible 标准输出
- Ansible 错误输出
- 任务退出码
每次执行都会在系统临时目录下生成一组独立的辅助文件,文件名以 时间戳-PID-序号 区分,避免并发任务互相覆盖,例如:
/tmp/ansible-pilot-run-1778946713184-11986-0.sh # 终端脚本
/tmp/ansible-pilot-output-1778946713184-11986-0.log # 同步日志
/tmp/ansible-pilot-status-1778946713184-11986-0.txt # 退出码状态文件
/tmp/ansible-pilot-pid-1778946713184-11986-0.txt # 终端脚本 PID(停止任务时使用)
退出码一般含义:
0:成功- 非
0:失败或部分失败
日志区上方有 命令预览 / 运行历史 两个 Tab。运行历史中每一行对应一次外部终端执行:
- 时间:任务开始时间。
- 命令:完整的 ansible 命令字符串。
- 退出码:任务结束后写入。
- 状态:
运行中/成功/失败/未知。
操作:
- 双击行将命令复制到剪贴板。
复制选中命令、清空历史按钮位于表格下方。
点击 停止当前任务 按钮,程序会读取所有正在运行任务对应的 PID 文件,依次向各自进程组发送 SIGTERM,1 秒后再发 SIGKILL 兜底,把外部终端里的脚本及其下的 ansible 子进程一起终止。运行历史中对应的行会被标记为失败。
如果你只想停止某一个终端,也可以直接在该终端窗口里按 Ctrl+C。
原因:系统 PATH 中没有 ansible。
解决:请在当前 Linux 系统安装 Ansible,并确保 ansible、ansible-playbook 在 PATH 中。
如果外部终端中提示找不到命令,请检查终端环境:
echo $PATH
which ansible
which ansible-playbook常见原因:
- Inventory 用户名不对。
- SSH 密钥未配置。
- 远端服务器不可达。
- 防火墙或网络不通。
可以先在命令行测试:
ssh root@172.10.10.11可以检查:
- Inventory 路径是否选对。
- 主机组是否填写正确。
- 目标服务器 IP 是否正确。
- SSH 是否能登录。
请重点查看日志中的:
FAILED
fatal
stderr
然后根据错误修改 playbook 或远端环境。
检查:
- 本地路径是否存在。
- 远端目标目录是否存在。
- 远端用户是否有写权限。
如果日志中出现:
ERROR! Unable to use multiprocessing, this is normally caused by lack of access to /dev/shm
说明 Ansible 依赖的 Python multiprocessing 无法创建共享内存或 semaphore。常见原因是 /dev/shm 中堆积了 sem.mp-*、mp-* 残留信号量,累计到一定数量后新进程创建 SemLock 会被拒绝。
请在普通终端中手动检查并清理:
ls -ld /dev/shm
ls /dev/shm/sem.mp-* 2>/dev/null | wc -l
rm -f /dev/shm/sem.mp-* /dev/shm/mp-*
python3 -c "import multiprocessing as mp; q=mp.Queue(); q.put('ok'); print(q.get())"正常情况下 Python 命令应输出:
ok
如果手动清理后仍报错,可能是命名空间或 AppArmor 限制,建议从普通终端启动 AnsiblePilot,或重启系统。
第一次使用建议按这个顺序:
- 选择工作目录。
- 点击
刷新扫描。 - 选择 Inventory。
- 主机组填写
web。 - 点击
Ping 测试。 - Ping 成功后再执行 playbook 或批量命令。
- 每次执行前先看
命令预览。 - 执行后看日志确认结果。
-
工作目录选择 Ansible 根目录。
-
Inventory 选择
hosts或对应目录下的my_hosts。 -
主机组填写
web。 -
Playbook 选择:
ansible-redeploy.yaml -
点击
执行选中 Playbook。
-
打开
批量命令。 -
模块选择
shell。 -
参数填写:
ps -ef | grep serveragent -
点击
批量执行命令。
-
打开
批量上传。 -
选择本地程序目录。
-
远端路径填写:
/root/work/missionschedulingsoftware/ -
点击
批量上传。