Ansible Ollama与mcphost部署工具

一个可组合的Ansible角色,用于部署Ollama和mcphost CLI,支持多种模型提供商、MCP服务器配置和GPU加速,适用于本地开发和云集成。

  • by Spectro34
  • Shell
  • 本地部署
  • 更新于
在 GitHub 查看 Spectro34/ansible-ollama_mcphost

使用说明

ansible-ollama_mcphost

用于配置的可组合Ansible角色 奥拉玛 和那个 mcphost CLI。该角色支持安装和清理流程、可选的GPU启用、多个模型提供程序和灵活的MCP服务器配置 测试.

特性

  • 灵活的模型提供者支持:Ollama、OpenAI、Anthropic、谷歌
  • 多种MCP服务器类型:内置(文件系统、bash、http)、本地(基于命令)和远程(基于URL)
  • MCP服务器的自动发现:从标准目录自动发现和配置MCP服务器
  • 从以下位置发现服务器 roles/ansible-ollama_mcphost/mcp_servers/ (装运示例)和 ~/mcp_servers/
  • SLE16支持:通过自动存储库配置明确支持SUSE Linux Enterprise 16.0
  • 示例配置:现成的示例(文件系统、bash命令、web fetcher、RISU代理等)已经上线 roles/ansible-ollama_mcphost/mcp_servers/
  • GPU支持:Ollama的可选GPU加速(ROCm、CUDA)
  • 全面配置:完全支持所有mcphost配置选项

快速开始

安装

选项1:运行剧本(推荐)

deploy.yml 包含一切。只需运行它——不需要编辑文件或手动连接角色路径(捆绑 ansible.cfg 已将Ansible指向此结账)。放置在以下位置的每个MCP服务器 roles/ansible-ollama_mcphost/mcp_servers/ (或 ~/mcp_servers)自动拾取:

git clone https://github.com/Spectro34/ansible-ollama_mcphost.git
cd ansible-ollama_mcphost
ansible-playbook deploy.yml

选项2:参考你自己的剧本中的角色

如果要从其他剧本或CI作业中调用角色,请将其克隆到已存在的目录中 ANSIBLE_ROLES_PATH 或者在运行Ansible时临时扩展路径:

git clone https://github.com/Spectro34/ansible-ollama_mcphost.git
cd ansible-ollama_mcphost
ANSIBLE_ROLES_PATH=$(pwd):${ANSIBLE_ROLES_PATH:-$HOME/.ansible/roles} \
  ansible-playbook your-playbook.yml

基本用法

标准流程(交互式CLI包装器):

./deploy.sh

包装器会引导您完成每个核心设置(模型标签、GPU切换、自动发现、, MCP服务器、API密钥、系统提示)。按接受默认值 进入,或通过 标志(例如。, ./deploy.sh --model qwen2.5:14b --enable-gpu --servers filesystem). 跑 ./deploy.sh --help 查看每个选项以及如何向 ansible-playbook. 当你完成简短的问卷后,脚本只需简单地发送到 ansible-playbook deploy.yml 使用收集到的设置。

对于CI/CD高级用户:

ansible-playbook deploy.yml

简单的剧本不再能引发思考;它从中读取所有内容 -e 覆盖或 默认值如下所示。默认情况下,它安装Ollama+mcphost并写入 ~/.mcphost.yml, 但是 它不启用任何MCP服务器 直到你设置 auto_discover=true 或 通过传递列表 -e "mcp_servers=['filesystem']"。这使首次运行保持可预测性。

需要覆盖某些内容吗?通过 -e 运行Ansible时的值,例如:

ansible-playbook deploy.yml \
  -e "mcp_servers=['filesystem','bash-commands']" \
  -e "model=qwen2.5:14b" \
  -e "gpu_enabled=true" \
  -e "gpu_runtime=cuda"

注: 存储库附带了随时可用的MCP服务器示例 roles/ansible-ollama_mcphost/mcp_servers/.将您自己的服务器放入该目录(或 ~/mcp_servers)并重新运行剧本以自动获取它们。

核心业务

  • ./deploy.sh --交互式、默认仅使用CPU的Ollama和 不 MCP服务器,直到您选择加入。
  • ./deploy.sh --no-prompt --model qwen2.5:14b --enable-gpu --servers filesystem --跳过问题,通过CLI标志驱动一切。
  • ansible-playbook deploy.yml -e "mcp_servers=['filesystem','bash-commands']" --直接运行Ansible(CI友好)。
  • ansible-playbook deploy.yml -e "gpu_enabled=true" -e "gpu_runtime=cuda" --明确启用GPU加速。
  • ansible-playbook deploy.yml -e "ollama_state=absent" -e "mcphost_state=absent" --删除以前安装的所有内容。

将任意数量的 -e 覆盖以匹配您的环境;否则将使用默认值。

添加MCP服务器(简易工作流)

该角色支持从多个来源自动发现MCP服务器:

  1. 角色 roles/ansible-ollama_mcphost/mcp_servers/ 目录:YAML格式服务器配置(例如。, roles/ansible-ollama_mcphost/mcp_servers/bash-example/config.yml)

  2. 用户的 ~/mcp_servers/ 目录:以YAML格式自定义用户定义的服务器 工作流程示例:

  3. 在下面创建(或复制)MCP服务器目录 roles/ansible-ollama_mcphost/mcp_servers/:

    cd roles/ansible-ollama_mcphost/mcp_servers/
    mkdir my-server
    # Optional: copy files into my-server/ or drop an existing checkout there
    

    存储库已经附带了现成的示例,例如 filesystem, bash-commands, web-fetcher,以及 risu-agent,因此您可以立即部署,而无需添加任何新内容。只有当您想添加自己的服务器时,才需要创建目录。

  4. 创建一个 config.yml 每个服务器的文件:

    cat > my-server/config.yml <<'YAML'
    my-server:
      type: "local"
      command: ["./run-server.sh"]
      cwd: "{{ server_dir }}"
      description: "Example custom server"
    YAML
    
  5. 部署-然后在系统提示时选择所需的服务器(CLI包装器):

    cd ../../../..
    ./deploy.sh
    # or drive it non-interactively
    ./deploy.sh --no-prompt --servers "bash,filesystem"
    
 When the script prompts you, answer **“y”** to auto-discover every server, or
 type the specific server names (e.g., `my-server,filesystem`) to enable only those.
 Tip: entering `risu-agent` automatically expands to
 `risu-agent-filesystem,risu-agent-bash`, so you only need to type the friendly alias once.

**Config File Format (`config.yml`):**
- Each `config.yml` should be in **mcphost's native format** - just the server configuration dictionary
- The file should contain only the server config, not wrapped in `mcpServers:` (the role handles that)
- Use `{{ server_dir }}` for paths relative to the server directory (automatically replaced)
- Use `${env://VAR_NAME}` for environment variable substitution in server environment variables
- The server name (key) should match the directory name or be unique
- See [roles/ansible-ollama_mcphost/mcp_servers/README.md](roles/ansible-ollama_mcphost/mcp_servers/README.md) for detailed examples

**API Keys:**
- **Recommended:** Use Ansible Vault to encrypt API keys in playbooks or variable files
```bash
# Create encrypted variable file
ansible-vault create group_vars/all/vault.yml
# Add: mcphost_provider_api_key: "your-encrypted-key"

# Or encrypt inline in playbook
mcphost_provider_api_key: !vault |
        $ANSIBLE_VAULT;1.1;AES256
        6638643965396631613264626361396530...
  • 备选方案: 使用环境变量: export OPENAI_API_KEY="your-key" 然后设置 mcphost_provider_api_key_env_var: "OPENAI_API_KEY"
  • 不太安全: 直接设置: mcphost_provider_api_key: "your-key-here" (不建议用于生产)
  • Ollama通常不需要API密钥(使用本地服务器)

看 roles/ansible-ollama_mcphost/mcp_servers/README.md 了解详细的MCP服务器配置。

RISU单主机工作流程

roles/ansible-ollama_mcphost/mcp_servers/risu-agent/ 打包了两个内置的MCP服务器,使LLM能够交互式运行RISU诊断:

  • risu-agent-filesystem --只读访问RISU安装(通过 RISU_AGENT_ROOT)以及 /tmp 用于读取RISU JSON输出
  • risu-agent-bash --执行RISU命令(risu -l, risu --list-plugins等)和可理解的补救策略

它包含在默认的自动发现过程中,因此运行 ansible-playbook deploy.yml 够了。运行 仅 RISU代理助手,通过 -e "mcp_servers=['risu-agent-filesystem','risu-agent-bash']" (或直接输入 risu-agent 当CLI包装器询问服务器名称时)。

部署后,运行 mcphost 交互式地要求LLM运行RISU诊断。LLM将使用可用的MCP工具执行RISU命令并分析结果。

默认情况下,辅助对象指向 /usr/share/risu (与包装布局相匹配)。如果您有自定义结账,请设置 RISU_AGENT_ROOT=/path/to/risu 跑步前先穿好衣服 mcphost.

看 roles/ansible-ollama_mcphost/mcp_servers/risu-agent/README.md 详细说明。

SLE16安装

ansible-playbook examples/sle16-example.yml

看 安装.md 了解详细的安装说明。

需求

  • 答案2.9或更高
  • 目标系统:SLES 16.0+、openSUSE、EL 8/9、Fedora、Ubuntu、Debian
  • 对于SLE16:访问SUSE客户中心或OBS存储库

角色变量

包管理

变量 默认值 描述
package_auto_refresh true 在zypper主机上自动刷新包元数据(带密钥导入)
package_refresh_command ["zypper", "--non-interactive", "--gpg-auto-import-keys", "refresh"] 刷新包时使用的命令
sle16_mcp_repo_enabled true 在SLES 16+上自动添加SLE16 MCP存储库
sle16_mcp_repo_url "https://download.opensuse.org/repositories/science:/machinelearning:/mcp/SLE_16.0/science:machinelearning:mcp.repo" SLE16 MCP存储库URL
sle16_mcp_repo_name "science:machinelearning:mcp" SLE16 MCP存储库名称

Ollama配置

变量 默认值 描述
ollama_state present present 为了安装, absent 删除
ollama_package_name "ollama" 要安装的包名称
ollama_binary_path "/usr/bin/ollama" OLAMA二进制文件的路径
ollama_service_name "ollama" 系统服务名称
ollama_host "localhost" Ollama服务主机
ollama_service_port 11434 Ollama服务港口
ollama_model "gpt-oss:20b" 默认型号标签
ollama_pull_models ["gpt-oss:20b"] 安装过程中要拉动的型号列表
ollama_gpu_enabled false 启用GPU加速(选择加入,默认禁用)
ollama_gpu_runtime "rocm" GPU运行时间: "rocm" 或 "cuda"
ollama_cleanup_models true 删除模型时 ollama_state=absent
ollama_cleanup_data true 删除数据目录时 ollama_state=absent
ollama_cleanup_config true 删除配置时 ollama_state=absent
ollama_cleanup_binary true 在以下情况下移除包装 ollama_state=absent

mcphost配置

管理配置。 每次运行都会重写 ~/.mcphost.yml 使用以下值加上发现的MCP服务器。调整这些变量(或编辑 templates/mcphost-config.yml.j2)如果你需要不同的默认值。

基本设置

变量 默认值 描述
mcphost_state present present 为了安装, absent 删除
mcphost_package_name "mcphost" 要安装的包名称
mcphost_executable "mcphost" mcphost可执行文件名
mcphost_config_path "{{ ansible_env.HOME }}/.mcphost.yml" mcphost配置文件的路径

型号/提供商设置

变量 默认值 描述
mcphost_model_provider "ollama" 引导时使用的提供程序
mcphost_model_name "{{ ollama_model }}" 引导时使用的模型名称
mcphost_provider_url "http://{{ ollama_host }}:{{ ollama_service_port }}" 提供商URL
mcphost_provider_api_key "" API密钥(可选)
mcphost_provider_api_key_env_var "" 从中读取API键的环境变量名称
mcphost_tls_skip_verify false 跳过TLS验证
mcphost_temperature 0.7 默认温度
mcphost_max_tokens 4096 默认最大令牌数
mcphost_top_p 0.95 默认top-p
mcphost_top_k 40 默认top-k
mcphost_stop_sequences [] 默认停止顺序
mcphost_max_steps 0 默认工具调用步骤
mcphost_stream true 启用流媒体
mcphost_debug false 启用调试日志记录
mcphost_system_prompt "" 内联系统提示
mcphost_system_prompt_file "" 系统提示文件

需要不同的默认值吗? 编辑 .mcphost.yml 运行后或调用时调整以下变量 ansible-playbook.

MCP服务器配置

变量 默认值 描述
mcphost_mcp_servers [] 手动MCP服务器定义
mcphost_mcp_servers_auto_discover true 自动发现MCP服务器
mcphost_mcp_servers_dirs ["{{ role_path }}/mcp_servers", "{{ lookup('env', 'HOME') }}/mcp_servers"] 用于搜索MCP服务器配置文件的目录
mcphost_mcp_servers_filter [] 自动发现时的可选过滤器
mcphost_servers_base_path "" 用于解析相对路径的基本目录
mcphost_cleanup_package false 当状态=缺失时卸载包

遗留变量(已弃用)

变量 默认值 描述
mcphost_local_servers [] 传统本地服务器定义(使用 mcphost_mcp_servers 相反)
mcphost_endpoints [] 传统远程端点定义(使用 mcphost_mcp_servers 相反)

MCP服务器类型

这 mcphost_mcp_servers 变量接受服务器定义列表。每个服务器都必须有一个 name 和 type 现场。

内置服务器

内置服务器集成到mcphost中。可用的内置服务器:

  • fs (文件系统):文件系统操作
  • bash:Bash命令执行
  • http:HTTP请求

内置服务器配置

mcphost_mcp_servers:
  - name: "filesystem_tmp"
    type: "builtin"
    builtin_name: "fs"  # Required: "fs", "bash", or "http"
    options:  # Optional: server-specific options
      allowed_directories: ["/tmp", "/home/user/documents"]
    allowed_tools:  # Optional: restrict available tools
      - "read_file"
      - "write_file"
      - "list_directory"

文件系统服务器选项:

  • allowed_directories:服务器可以访问的目录列表

文件系统服务器工具:

  • read_file:读取文件内容
  • write_file:写入文件
  • list_directory:列出目录内容

本地服务器

本地服务器通过命令执行作为单独的进程运行。

本地服务器配置

mcphost_mcp_servers:
  - name: "monitor"
    type: "local"
    command: ["mcp-server-monitor"]  # Required: command and arguments
    cwd: "/opt/monitor"  # Optional: working directory
    environment:  # Optional: environment variables
      DEBUG: "true"
      API_KEY: "${env://MCP_API_KEY}"  # Use environment variable substitution
    description: "System monitoring server"  # Optional: description

注: 使用 ${env://VAR_NAME} 配置文件中环境变量替换的语法。

远程服务器

远程服务器通过HTTP/HTTPS连接到MCP服务器。

远程服务器配置

mcphost_mcp_servers:
  - name: "remote-server"
    type: "remote"
    url: "https://api.example.com/mcp"  # Required: server URL
    description: "Remote MCP server"  # Optional: description

示例播放手册

该角色包括几个示例剧本 examples/ 目录:

注: 基本示例(最小、监控、内置、RISU代理等)已经存在 roles/ansible-ollama_mcphost/mcp_servers/.将其他服务器放到那里(或下面) ~/mcp_servers)并重新运行剧本以启用它们。

SLE16示例

# examples/sle16-example.yml
- hosts: localhost
  become: true
  roles:
    - role: ansible-ollama_mcphost
      sle16_mcp_repo_enabled: true
      ollama_model: "gpt-oss:20b"
      mcphost_mcp_servers:
        - name: "filesystem"
          type: "builtin"
          builtin_name: "fs"
          options:
            allowed_directories: ["/tmp"]

OpenAI提供商

# examples/openai-example.yml
- hosts: localhost
  roles:
    - role: ansible-ollama_mcphost
      ollama_state: absent
      mcphost_model_provider: "openai"
      mcphost_model_name: "gpt-4"
      mcphost_provider_url: "https://api.openai.com/v1"
      # Set API key via environment variable: export OPENAI_API_KEY="your-key"
      mcphost_mcp_servers:
        - name: "filesystem"
          type: "builtin"
          builtin_name: "fs"
          options:
            allowed_directories: ["/tmp"]

远程服务器

# examples/remote-server-example.yml
- hosts: localhost
  roles:
    - role: ansible-ollama_mcphost
      mcphost_mcp_servers:
        - name: "filesystem"
          type: "builtin"
          builtin_name: "fs"
          options:
            allowed_directories: ["/tmp"]
        - name: "remote-server"
          type: "remote"
          url: "https://api.example.com/mcp"
          description: "Remote MCP server"

可用示例

该角色包括以下示例剧本:

  • examples/sle16-example.yml:SLE16特定配置和存储库设置
  • examples/openai-example.yml:OpenAI提供者配置
  • examples/remote-server-example.yml:远程MCP服务器配置
  • examples/ansible-runner.yml:Ansible Runner MCP服务器集成
  • examples/risu-agent.yml:RISU诊断助手(文件系统+bash助手)

需要更多吗?在下面添加您自己的MCP服务器 roles/ansible-ollama_mcphost/mcp_servers/ (或 ~/mcp_servers)然后重新运行剧本——它们将自动合并。

部署类型

1.地方发展

与Ollama进行本地开发的最低设置:

- hosts: localhost
  roles:
    - role: ansible-ollama_mcphost
      ollama_model: "gpt-oss:20b"
      mcphost_mcp_servers:
        - name: "filesystem"
          type: "builtin"
          builtin_name: "fs"
          options:
            allowed_directories: ["/tmp"]

2.GPU制作

GPU加速的生产设置:

- hosts: gpu-servers
  become: true
  roles:
    - role: ansible-ollama_mcphost
      ollama_gpu_enabled: true
      ollama_gpu_runtime: "cuda"  # or "rocm"
      ollama_pull_models:
        - "qwen2.5:32b"
        - "gpt-oss:20b"
      mcphost_temperature: 0.3
      mcphost_max_tokens: 8192

3.云提供商集成

使用云提供商API(OpenAI、Anthropic、谷歌):

- hosts: localhost
  roles:
    - role: ansible-ollama_mcphost
      ollama_state: absent
      mcphost_model_provider: "openai"
      mcphost_model_name: "gpt-4"
      mcphost_provider_api_key: "{{ vault_openai_api_key }}"  # From Ansible Vault

4.多服务器MCP设置

连接到多个MCP服务器(本地和远程):

- hosts: localhost
  roles:
    - role: ansible-ollama_mcphost
      mcphost_mcp_servers:
        - name: "filesystem"
          type: "builtin"
          builtin_name: "fs"
          options:
            allowed_directories: ["/tmp"]
        - name: "monitor"
          type: "local"
          command: ["mcp-server-monitor"]
        - name: "remote-api"
          type: "remote"
          url: "https://api.example.com/mcp"

5.RISU代理示例

RISU代理助手(文件系统+受约束的bash服务器)已经存在于此存储库中 roles/ansible-ollama_mcphost/mcp_servers/risu-agent/.禁止克隆或 需要额外的设置——只需运行标准剧本。

# Deploy with every bundled MCP server (RISU agent included)
ansible-playbook deploy.yml

# Limit the deployment to only the RISU agent helpers
ansible-playbook deploy.yml \
  -e "mcp_servers=['risu-agent-filesystem','risu-agent-bash']"

部署后,运行 mcphost 交互式地要求LLM运行RISU诊断。

需要专门的剧本吗?使用 examples/risu-agent.yml:

- hosts: localhost
  become: true
  roles:
    - role: ansible-ollama_mcphost
      ollama_gpu_enabled: true          # Optional
      ollama_gpu_runtime: "rocm"        # or "cuda"
      mcphost_mcp_servers_auto_discover: true
      # RISU agent servers are discovered automatically from
      # roles/ansible-ollama_mcphost/mcp_servers/risu-agent/
      # Set RISU_AGENT_ROOT to point at a different checkout if needed.

设置 RISU_AGENT_ROOT 环境变量(或编辑以下文件 roles/ansible-ollama_mcphost/mcp_servers/risu-agent/)如果你需要帮手 检查不同的RISU校验。

6.SLE16企业部署

带有示例配置的SLE16特定部署:

- hosts: sle16-servers
  become: true
  roles:
    - role: ansible-ollama_mcphost
      sle16_mcp_repo_enabled: true
      ollama_model: "gpt-oss:20b"
      mcphost_mcp_servers:
        - name: "filesystem"
          type: "builtin"
          builtin_name: "fs"
          options:
            allowed_directories: ["/tmp"]

安全最佳实践

  1. API密钥:切勿在行动手册中硬编码API密钥。用途:

    • Ansible保险库(推荐):加密变量文件中的API密钥
      # Create encrypted variable file
      ansible-vault create group_vars/all/vault.yml
      # Add: mcphost_provider_api_key: "your-api-key-here"
      
      # Run playbook with vault password
      ansible-playbook playbook.yml --ask-vault-pass
      # Or: ansible-playbook playbook.yml --vault-password-file ~/.vault_pass
      
      看 examples/vault-api-key-example.yml 举一个完整的例子。
    • 环境变量: export OPENAI_API_KEY="key" 然后使用 mcphost_provider_api_key_env_var: "OPENAI_API_KEY"
    • 运行时变量: --extra-vars "mcphost_provider_api_key=key" (不太安全)
  2. 文件系统访问:始终将文件系统服务器限制到特定目录:

    options:
      allowed_directories: ["/tmp", "/home/user/documents"]
    
  3. 工具限制:尽可能限制可用工具:

    allowed_tools: ["read_file", "list_directory"]  # Read-only
    
  4. TLS验证:切勿在生产环境中禁用TLS验证:

    mcphost_tls_skip_verify: false  # Always false in production
    

处理器

  • Reload Ollama daemon:跑步 systemctl daemon-reload 并在GPU配置更改时重新启动Ollama服务

标签

标签 目的
ollama 瞄准Ollama的任务
mcphost 针对mcphost任务
install 运行安装/配置步骤
cleanup 删除堆栈和配置

依赖项

没有。

许可证

麻省理工学院

参考文献