为培训课程准备的Ollama安装脚本
说明:创建一个完整的Ollama安装脚本,基于官方文档并集成到现有的用户环境中。

#!/bin/bash

# 脚本:Ollama安装配置脚本
# 描述:安装Ollama并配置给user1-user5使用
# 作者:Eucalyptus_DE
# 日期:$(date +%Y-%m-%d)

set -e  # 遇到错误立即退出

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查是否为root用户
check_root() {
    if [[ $EUID -eq 0 ]]; then
        log_info "以root权限执行脚本"
    else
        log_error "请使用sudo运行此脚本"
        exit 1
    fi
}

# 检查Ollama压缩包是否存在
check_ollama_archive() {
    local archive_path="/home/ubuntu/ollama-linux-amd64.tgz"
    
    if [[ ! -f "$archive_path" ]]; then
        log_error "Ollama压缩包不存在: $archive_path"
        log_info "请确保已下载ollama-linux-amd64.tgz到/home/ubuntu/目录"
        exit 1
    fi
    
    log_success "找到Ollama压缩包: $archive_path"
}

# 安装Ollama二进制文件
install_ollama_binary() {
    log_info "安装Ollama二进制文件..."
    
    # 解压到/usr目录
    tar zxf /home/ubuntu/ollama-linux-amd64.tgz -C /usr/
    
    # 确保二进制文件有执行权限
    chmod +x /usr/bin/ollama
    
    log_success "Ollama二进制文件安装完成"
}

# 创建Ollama用户和组
create_ollama_user() {
    log_info "创建Ollama用户和组..."
    
    # 创建ollama用户和组
    useradd -r -s /bin/false -U -m -d /usr/share/ollama ollama
    
    # 将ubuntu用户添加到ollama组
    usermod -a -G ollama ubuntu
    
    # 将user1-user5也添加到ollama组
    for i in {1..5}; do
        username="user$i"
        if id "$username" &>/dev/null; then
            usermod -a -G ollama "$username"
            log_info "用户 $username 已添加到ollama组"
        fi
    done
    
    log_success "Ollama用户和组创建完成"
}

# 创建Ollama系统服务
create_ollama_service() {
    log_info "创建Ollama系统服务..."
    
    # 创建服务文件
    cat > /etc/systemd/system/ollama.service << 'EOF'
[Unit]
Description=Ollama Service
After=network-online.target

[Service]
ExecStart=/usr/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

[Install]
WantedBy=multi-user.target
EOF
    
    # 重新加载systemd配置
    systemctl daemon-reload
    
    # 启用服务开机自启
    systemctl enable ollama
    
    log_success "Ollama系统服务创建完成"
}

# 启动Ollama服务
start_ollama_service() {
    log_info "启动Ollama服务..."
    
    # 启动服务
    systemctl start ollama
    
    # 等待服务启动
    sleep 5
    
    # 检查服务状态
    if systemctl is-active --quiet ollama; then
        log_success "Ollama服务启动成功"
    else
        log_error "Ollama服务启动失败"
        systemctl status ollama
        exit 1
    fi
}

# 为每个用户安装Ollama Python包
install_ollama_python_package() {
    log_info "为每个用户安装Ollama Python包..."
    
    for i in {1..5}; do
        username="user$i"
        env_name="AI_$username"
        
        if id "$username" &>/dev/null; then
            log_info "为用户 $username 安装ollama Python包..."
            
            sudo -u "$username" bash -c "
            eval \\\$(/opt/miniconda3/bin/conda shell.bash hook)
            conda activate $env_name
            pip install ollama
            "
            
            log_success "用户 $username 的ollama Python包安装完成"
        else
            log_warning "用户 $username 不存在,跳过安装"
        fi
    done
}

# 测试Ollama安装
test_ollama_installation() {
    log_info "测试Ollama安装..."
    
    # 测试二进制文件
    if command -v ollama &> /dev/null; then
        log_success "Ollama命令行工具可用"
        ollama -v
    else
        log_error "Ollama命令行工具不可用"
        exit 1
    fi
    
    # 测试服务状态
    if systemctl is-active --quiet ollama; then
        log_success "Ollama服务运行正常"
    else
        log_error "Ollama服务未运行"
        exit 1
    fi
    
    # 测试Python包(使用ubuntu用户测试)
    log_info "测试Ollama Python包..."
    sudo -u ubuntu bash -c "
    source /opt/miniconda3/bin/activate AI_user1 2>/dev/null || true
    python -c \"import ollama; print('Ollama Python包导入成功')\" 2>/dev/null && echo 'Python包测试成功' || echo 'Python包测试失败(可能环境不存在)'
    "
}

# 创建用户测试脚本
create_test_scripts() {
    log_info "创建用户测试脚本..."
    
    for i in {1..5}; do
        username="user$i"
        env_name="AI_$username"
        
        # 创建测试脚本
        cat > "/home/$username/test_ollama.py" << 'EOF'
#!/usr/bin/env python3
"""
Ollama测试脚本
用于测试Ollama是否在用户环境中正常工作
"""

import subprocess
import sys
import requests

def test_ollama_cli():
    """测试Ollama命令行工具"""
    print("1. 测试Ollama命令行工具...")
    try:
        result = subprocess.run(["ollama", "-v"], capture_output=True, text=True, check=True)
        print(f"   ✓ Ollama版本: {result.stdout.strip()}")
        return True
    except (subprocess.CalledProcessError, FileNotFoundError) as e:
        print(f"   ✗ 失败: {e}")
        return False

def test_ollama_service():
    """测试Ollama服务状态"""
    print("2. 测试Ollama服务状态...")
    try:
        result = subprocess.run(["systemctl", "is-active", "ollama"], capture_output=True, text=True, check=True)
        if result.stdout.strip() == "active":
            print("   ✓ Ollama服务正在运行")
            return True
        else:
            print(f"   ✗ Ollama服务状态: {result.stdout.strip()}")
            return False
    except subprocess.CalledProcessError as e:
        print(f"   ✗ 无法检查服务状态: {e}")
        return False

def test_ollama_python():
    """测试Ollama Python包"""
    print("3. 测试Ollama Python包...")
    try:
        import ollama
        print("   ✓ Ollama Python包导入成功")
        
        # 测试列表模型(不要求必须有模型)
        try:
            models = ollama.list()
            print(f"   ✓ 已安装模型: {len(models.get('models', []))} 个")
        except Exception as e:
            print(f"   ⚠ 无法获取模型列表: {e}(这可能是正常的,如果还没有下载模型)")
        
        return True
    except ImportError as e:
        print(f"   ✗ Ollama Python包导入失败: {e}")
        return False

def test_ollama_api():
    """测试Ollama API"""
    print("4. 测试Ollama API连接...")
    try:
        response = requests.get("http://localhost:11434/api/tags", timeout=5)
        if response.status_code == 200:
            print("   ✓ Ollama API连接成功")
            return True
        else:
            print(f"   ✗ Ollama API返回状态码: {response.status_code}")
            return False
    except requests.exceptions.RequestException as e:
        print(f"   ✗ Ollama API连接失败: {e}")
        return False

def main():
    print("=" * 50)
    print("Ollama 环境测试")
    print("=" * 50)
    
    tests = [
        test_ollama_cli(),
        test_ollama_service(),
        test_ollama_python(),
        test_ollama_api()
    ]
    
    print("=" * 50)
    passed = sum(tests)
    total = len(tests)
    
    if passed == total:
        print(f"🎉 所有测试通过 ({passed}/{total})")
        print("\n下一步: 尝试下载一个模型,例如:")
        print("  ollama pull llama2")
    else:
        print(f"⚠  部分测试失败 ({passed}/{total})")
        print("请检查上述错误信息")

if __name__ == "__main__":
    main()
EOF
        
        # 设置权限
        chown "$username:$username" "/home/$username/test_ollama.py"
        chmod +x "/home/$username/test_ollama.py"
        
        log_success "为用户 $username 创建测试脚本"
    done
}

# 显示使用说明
show_usage() {
    log_success "=== Ollama 安装完成 ==="
    echo ""
    echo "安装总结:"
    echo "  ✓ Ollama二进制文件已安装到 /usr/bin/ollama"
    echo "  ✓ Ollama系统服务已创建并启动"
    echo "  ✓ 用户 user1-user5 已添加到ollama组"
    echo "  ✓ Ollama Python包已安装到各用户的conda环境"
    echo ""
    echo "使用说明:"
    echo ""
    echo "1. 系统级管理:"
    echo "   sudo systemctl status ollama    # 查看服务状态"
    echo "   sudo systemctl restart ollama   # 重启服务"
    echo "   sudo journalctl -u ollama -f    # 查看服务日志"
    echo ""
    echo "2. 用户级使用:"
    for i in {1..5}; do
        username="user$i"
        echo "   # 用户 $username:"
        echo "   su - $username"
        echo "   conda activate AI_$username"
        echo "   python /home/$username/test_ollama.py  # 运行测试"
        echo "   ollama pull llama2                     # 下载模型"
        echo ""
    done
    echo ""
    echo "3. Python代码示例:"
    cat << 'EOF'
```python
import ollama

# 列出已安装的模型
models = ollama.list()
print("已安装模型:", models)

# 与模型对话
response = ollama.chat(
    model='llama2',
    messages=[{'role': 'user', 'content': '你好,请介绍一下你自己'}]
)
print(response['message']['content'])

}

主函数

main() {
log_info “开始安装和配置Ollama…”

check_root
check_ollama_archive
install_ollama_binary
create_ollama_user
create_ollama_service
start_ollama_service
install_ollama_python_package
create_test_scripts
test_ollama_installation
show_usage

log_success "Ollama安装配置完成!"

}

执行主函数

main “$@”


## 使用说明

### 1. 保存脚本
将上述脚本保存为 `install_ollama.sh`

### 2. 赋予执行权限
```bash
chmod +x install_ollama.sh

3. 以root权限运行

sudo ./install_ollama.sh

脚本功能详解

🔧 核心安装步骤

  1. 二进制安装 - 从本地压缩包解压安装到 /usr/bin/ollama
  2. 用户组配置 - 创建ollama用户组,将ubuntu和user1-user5用户加入该组
  3. 系统服务 - 创建systemd服务并设置为开机自启
  4. Python包安装 - 为每个用户的conda环境安装ollama Python包

🧪 测试功能

  • 自动创建测试脚本 /home/user*/test_ollama.py
  • 测试内容包括:
    • 命令行工具可用性
    • 服务运行状态
    • Python包导入
    • API连接测试

👥 多用户支持

  • 用户权限: 所有用户都可以访问Ollama服务
  • 独立环境: 每个用户在各自的conda环境中使用
  • 测试脚本: 每个用户都有专用的测试脚本

使用示例

用户测试Ollama

# 切换到用户1
su - user1

# 激活conda环境
conda activate AI_user1

# 运行测试脚本
python test_ollama.py

# 下载模型
ollama pull llama2

# 在Python中使用
python -c "import ollama; print(ollama.list())"

系统管理

# 查看服务状态
sudo systemctl status ollama

# 重启服务
sudo systemctl restart ollama

# 查看日志
sudo journalctl -u ollama -f

这个脚本完全基于官方文档,并进行了适当的扩展,确保Ollama可以在多用户环境中正常工作,同时为每个用户提供了完整的测试和使用工具。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐