【技术文档摘要】: MCP Ansible Server
高级Ansible模型上下文协议(MCP)服务器,用Python编写,提供Ansible工具用于清单、剧本、角色和项目工作流。
快速开始
git clone https://github.com/bsahane/mcp-ansible.git
cd mcp-ansible
# 创建并激活Python虚拟环境
python3 -m venv .venv
source .venv/bin/activate
# 通过requirements.txt安装依赖
python -m pip install -U pip
pip install -r requirements.txt
# (可选)本地安装项目包
pip install -e .
# 运行MCP服务器
python src/ansible_mcp/server.py
需求
设置
cd /Users/bsahane/Developer/cursor/mcp-ansible
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -U pip
pip install "mcp[cli]>=1.2.0" "PyYAML>=6.0.1" "ansible-core>=2.16.0"
pip install -e .
运行服务器
python src/ansible_mcp/server.py
Cursor配置(/Users/bsahane/.cursor/mcp.json)
{
"mcpServers": {
"ansible-mcp": {
"command": "python",
"args": [
"/Users/bsahane/Developer/cursor/mcp-ansible/src/ansible_mcp/server.py"
],
"env": {
"MCP_ANSIBLE_PROJECT_ROOT": "/Users/bsahane/GitLab/projectAIOPS/mcp-ansible-server",
"MCP_ANSIBLE_INVENTORY": "/Users/bsahane/GitLab/projectAIOPS/mcp-ansible-server/inventory/hosts.ini",
"MCP_ANSIBLE_PROJECT_NAME": "projectAIOPS"
}
}
}
}
Claude for Desktop配置
添加到~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"ansible-mcp": {
"command": "python",
"args": [
"/Users/bsahane/Developer/cursor/mcp-ansible/src/ansible_mcp/server.py"
],
"env": {
"MCP_ANSIBLE_PROJECT_ROOT": "/Users/bsahane/GitLab/projectAIOPS/mcp-ansible-server",
"MCP_ANSIBLE_INVENTORY": "/Users/bsahane/GitLab/projectAIOPS/mcp-ansible-server/inventory/hosts.ini",
"MCP_ANSIBLE_PROJECT_NAME": "projectAIOPS"
}
}
}
}
工具(名称)
核心Ansible工具:
本地库存套件(无AAP/AWX):
高级故障排除套件:
基础工具:
智能诊断:
自动化及自我修复:
网络与安全:
性能与监控:
环境变量(可选)
示例(Claude工具)
列出库存中的主机:
运行简单的剧本:
临时ping本地主机:
构建一个角色:
注册一个项目并运行项目剧本:
本地库存套件示例
通过ansible.cfg解析多个库存(合并group_vars/host_vars):
解析特定扩展名的库存文件:
从库存中ping一组:
注意事项
参考
以下是所有工具的简短描述、最少参数、您可以在MCP UI中询问的一个示例问题以及一个样本答案。
create-playbook: 从YAML字符串或对象创建Ansible剧本文件
{ "playbook": [{"hosts":"all","tasks":[{"debug":{"msg":"hi"}}]}] }
{ "path": "/tmp/playbook_x.yml", "bytes_written": 123, "preview": "- hosts: all..." }validate-playbook: 检查剧本语法
{ "playbook_path": "/abs/playbook.yml" }
{ "ok": true, "rc": 0 }ansible-playbook: 运行一个剧本
{ "playbook_path": "/abs/playbook.yml", "inventory": "localhost," }
{ "ok": true, "rc": 0, "stdout": "PLAY [all]..." }ansible-task: 运行一个临时模块
{ "host_pattern": "localhost", "module": "ping", "inventory": "localhost," }
{ "ok": true, "stdout": "pong" }ansible-role: 通过临时剧本执行一个角色
{ "role_name": "myrole", "hosts": "localhost", "inventory": "localhost," }
{ "ok": true, "rc": 0 }create-role-structure: 构建角色目录树
{ "base_path": "/tmp", "role_name": "demo" }
{ "created": [".../tasks/main.yml", ...], "role_path": "/tmp/demo" }ansible-inventory: 列出库存中的主机和组
{ "inventory": "/abs/inventory" }
{ "hosts": ["host01"], "groups": {"web": ["host01"]} }register-project: 注册一个Ansible项目以便重用
{ "name": "proj", "root": "/abs/project", "make_default": true }
{ "path": "~/.config/mcp-ansible/config.json", "projects": ["proj"] }list-projects: 显示已注册的项目
{}{ "default": "proj", "projects": {"proj": {"root": "/abs"}} }project-playbooks: 发现项目根下的剧本
{ "project": "proj" }
{ "ok": true, "playbooks": ["/abs/x.yml", "/abs/y.yml"] }project-run-playbook: 使用项目库存/环境运行剧本
{ "playbook_path": "/abs/x.yml", "project": "proj" }
{ "ok": true, "rc": 0 }inventory-parse: 解析库存(ansible.cfg感知,合并group_vars/host_vars)
{ "project_root": "/abs/project", "include_hostvars": true }
{ "hosts": ["h1"], "groups": {"web":["h1"]}, "hostvars": {"h1": {...}} }inventory-graph: 显示库存图
{ "project_root": "/abs/project" }
inventory-find-host: 显示主机的组和合并变量
{ "project_root": "/abs/project", "host": "h1" }
{ "groups": ["web"], "hostvars": {"ansible_user":"root"} }ansible-ping: 通过临时方式ping主机
{ "project_root": "/abs/project", "host_pattern": "localhost" }
{ "ok": true, "rc": 0 }ansible-gather-facts: 运行setup并返回事实
{ "project_root": "/abs/project", "host_pattern": "localhost" }
{ "facts": {"localhost": {"ansible_hostname":"node"}} }validate-yaml: 验证YAML文件
{ "paths": ["/abs/file.yml"] }
{ "ok": true, "results": [{"path":"/abs/file.yml","ok":true}] }galaxy-install: 从需求安装角色/集合
{ "project_root": "/abs/project" }
{ "ok": true, "executed": [{"kind":"collection","rc":0}] }project-bootstrap: 初始化项目(环境信息+galaxy安装)
{ "project_root": "/abs/project" }
{ "ok": true, "details": {"ansible_version":"..."} }inventory-diff: 比较两个库存
{ "left_project_root": "/abs/project", "right_project_root": "/abs/project" }
{ "added_hosts": [], "removed_hosts": [], "group_membership_changes": {} }ansible-test-idempotence: 运行两次剧本并断言第二次没有更改
{ "playbook_path": "/abs/playbook.yml", "project_root": "/abs/project" }
{ "ok": true, "changed_total_second": 0 }galaxy-lock: 生成已安装角色/集合的锁文件
{ "project_root": "/abs/project" }
{ "ok": true, "path": "/abs/requirements.lock.yml" }vault-encrypt / vault-decrypt / vault-view / vault-rekey: 密码操作
{ "file_paths": ["/abs/group_vars/all/vault.yml"], "project_root": "/abs/project" }
{ "ok": true, "rc": 0 }ansible-remote-command: 执行shell命令并增强解析
{ "host_pattern": "webserver", "command": "ps aux | grep nginx" }
{ "ok": true, "stdout": "Process list...", "parsed_output": {...} }ansible-fetch-logs: 获取并分析日志文件
{ "host_pattern": "app*", "log_paths": ["/var/log/nginx/error.log"], "analyze": true }
{ "ok": true, "logs": {...}, "summary": {"total_logs": 1, "successful": 1} }ansible-service-manager: 具有日志的服务管理
{ "host_pattern": "web", "service_name": "nginx", "action": "restart", "check_logs": true }
{ "ok": true, "action_result": {...}, "status": {...}, "logs": {...} }{ "host_pattern": "production", "checks":