为培训课程准备的Ollama安装脚本
为培训课程准备的Ollama安装脚本说明:创建一个完整的Ollama安装脚本,基于官方文档并集成到现有的用户环境中。$(EOF。
·
为培训课程准备的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
脚本功能详解
🔧 核心安装步骤
- 二进制安装 - 从本地压缩包解压安装到
/usr/bin/ollama - 用户组配置 - 创建ollama用户组,将ubuntu和user1-user5用户加入该组
- 系统服务 - 创建systemd服务并设置为开机自启
- 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可以在多用户环境中正常工作,同时为每个用户提供了完整的测试和使用工具。
更多推荐
所有评论(0)