作为一名长期折腾Linux系统的老玩家,最近在给几台旧设备刷Ubuntu系统时,发现每次安装后都要重复配置开发环境、安装常用软件,这个过程既耗时又容易遗漏关键步骤。于是决定写个自动化安装脚本,把刷机后的标准化配置流程固化下来。
这个脚本的核心价值在于:
选择bash脚本实现主要基于:
bash复制#!/bin/bash
# 严格模式设置
set -euo pipefail
脚本采用模块化设计,主要包含:
针对国内网络环境特别优化:
bash复制# 自动识别最佳镜像源
select_mirror() {
local mirrors=(
"mirrors.aliyun.com"
"mirrors.tuna.tsinghua.edu.cn"
"mirrors.huaweicloud.com"
)
for mirror in "${mirrors[@]}"; do
if curl --connect-timeout 3 -s "http://$mirror" >/dev/null; then
echo "http://$mirror/ubuntu"
return
fi
done
echo "http://archive.ubuntu.com/ubuntu"
}
关键设计原则:
bash复制install_basic_tools() {
local pkg_list=(
"git" "vim" "htop" "tmux"
"zsh" "net-tools" "build-essential"
)
log "开始安装基础工具包"
if ! sudo apt-get install -y "${pkg_list[@]}"; then
error "基础工具安装失败"
return 1
fi
log_success "基础工具安装完成"
}
通过asdf实现统一版本管理:
bash复制setup_development_env() {
# 安装asdf版本管理器
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.11.3
# 配置环境变量
echo '. "$HOME/.asdf/asdf.sh"' >> ~/.zshrc
echo '. "$HOME/.asdf/completions/asdf.bash"' >> ~/.zshrc
# 安装各语言插件
asdf plugin-add python
asdf plugin-add nodejs
# 安装指定版本
asdf install python 3.11.4
asdf global python 3.11.4
}
GNOME桌面优化方案:
bash复制optimize_gnome() {
# 禁用不用的扩展
gsettings set org.gnome.shell enabled-extensions \
"['ubuntu-dock@ubuntu.com', 'appindicatorsupport@rgcjonas.gmail.com']"
# 设置快捷键
gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings \
"['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/']"
# 配置终端偏好
gsettings set org.gnome.Terminal.Legacy.Settings default-show-menubar false
}
bash复制harden_security() {
# 配置UFW防火墙
sudo ufw default deny incoming
sudo ufw allow ssh
sudo ufw --force enable
# 修改SSH配置
sudo sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo systemctl restart sshd
}
bash复制auto_patching() {
# 配置自动安全更新
sudo dpkg-reconfigure -plow unattended-upgrades
# 启用canonical实时补丁
sudo apt install -y ubuntu-advantage-tools
sudo ua attach [TOKEN]
sudo ua enable livepatch
}
推荐工作流:
bash复制# 下载脚本
curl -O https://example.com/ubuntu-setup.sh
# 授权并执行
chmod +x ubuntu-setup.sh
./ubuntu-setup.sh --mode=full --log-level=verbose
支持参数说明:
| 参数 | 选项 | 作用 |
|---|---|---|
| --mode | minimal/full/dev | 安装模式选择 |
| --log-level | quiet/verbose/debug | 日志详细程度 |
| --skip | packages/security/ui | 跳过指定模块 |
bash复制# 示例配置文件格式
{
"user": {
"name": "devuser",
"email": "dev@example.com"
},
"software": {
"python_version": "3.11.4",
"node_version": "18.16.0"
}
}
当遇到包下载失败时:
bash复制retry() {
local n=1
local max=3
local delay=5
while true; do
"$@" && break || {
if [[ $n -lt $max ]]; then
((n++))
echo "命令失败,第$n次重试..."
sleep $delay
else
error "已达到最大重试次数"
return 1
fi
}
done
}
# 使用示例
retry sudo apt-get install -y python3
典型解决方案:
bash复制sudo apt-mark hold python3
bash复制check_conflicts() {
if dpkg -l | grep -q "python3.8"; then
warning "检测到冲突的Python版本"
sudo apt remove -y python3.8
fi
}
bash复制sudo apt-get -o Acquire::Queue-Mode=threads install -y package
bash复制# 创建本地deb缓存
sudo apt-get -y install --download-only packages
sudo cp /var/cache/apt/archives/*.deb /path/to/cache/
插件式架构实现:
bash复制# 加载扩展模块
load_modules() {
for module in modules/*.sh; do
source "$module"
done
}
# 示例模块结构
modules/
├── docker.sh
├── kubernetes.sh
└── ai-tools.sh
这个脚本经过多次迭代现在已经稳定运行在团队20+设备上,平均节省了2小时/台的配置时间。最大的收获是意识到自动化不仅要解决"能不能做"的问题,更要处理好各种边界情况和失败恢复机制。