1. 项目背景与核心价值
作为运维工程师,最头疼的就是手头管理着十几台甚至几十台服务器,每台都要单独登录配置。上周我就遇到个典型场景:客户新上了5台Ubuntu服务器,需要统一部署Nginx、MySQL和Redis环境。传统方式得挨个SSH连接操作,不仅效率低下,还容易因人工操作导致配置不一致。
这套"SSH+宝塔面板+Ansible"的统一管理方案,正是为了解决以下痛点:
- 多台服务器重复性操作耗时耗力
- 手动配置容易出错且难以追溯
- 安全策略(如密钥登录)需要逐台部署
- 后期维护升级成本高
实测下来,这套方案让我的运维效率提升了300%以上。昨天给20台服务器批量部署Java环境,从原来的4小时缩短到40分钟,关键是完全避免了人为失误。
2. 基础环境准备
2.1 SSH配置优化
首先在所有被控端服务器执行:
bash复制# 修改SSH默认端口(可选但建议)
sudo sed -i 's/#Port 22/Port 5822/g' /etc/ssh/sshd_config
# 禁止root远程登录
sudo sed -i 's/PermitRootLogin yes/PermitRootLogin no/g' /etc/ssh/sshd_config
# 启用密钥认证
sudo sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/g' /etc/ssh/sshd_config
# 重启服务
sudo systemctl restart sshd
本地管理机配置~/.ssh/config实现别名登录:
code复制Host web01
HostName 192.168.1.101
Port 5822
User ops
IdentityFile ~/.ssh/id_rsa_web01
Host db01
HostName 192.168.1.102
Port 5822
User ops
IdentityFile ~/.ssh/id_rsa_db01
重要提示:密钥对建议使用ed25519算法,比RSA更安全且性能更好:
bash复制ssh-keygen -t ed25519 -C "ops@company"
2.2 宝塔面板集群部署
在每台服务器执行官方安装命令后,重点配置面板API:
bash复制bt 6 # 修改面板端口
bt 7 # 修改安全入口
bt 24 # 关闭BasicAuth认证
bt 25 # 设置API密钥
获取API密钥后,在主控机安装宝塔官方客户端:
bash复制pip install btpanel
创建/etc/bt_api.conf配置文件:
json复制{
"web01": {
"bt_url": "https://192.168.1.101:7800",
"bt_key": "xxxxxxxxxxxxxxxx"
},
"db01": {
"bt_url": "https://192.168.1.102:7800",
"bt_key": "yyyyyyyyyyyyyyyy"
}
}
3. Ansible自动化整合
3.1 基础Inventory配置
创建/etc/ansible/hosts文件:
ini复制[web]
web01 ansible_host=192.168.1.101 ansible_port=5822
web02 ansible_host=192.168.1.102 ansible_port=5822
[db]
db01 ansible_host=192.168.1.201 ansible_port=5822
db02 ansible_host=192.168.1.202 ansible_port=5822
[all:vars]
ansible_user=ops
ansible_ssh_private_key_file=~/.ssh/id_rsa_ops
3.2 常用场景Playbook示例
场景1:批量安装Docker
yaml复制- name: Install Docker Cluster
hosts: all
tasks:
- name: Install dependencies
apt:
name: "{{ item }}"
state: present
loop:
- apt-transport-https
- ca-certificates
- curl
- software-properties-common
- name: Add Docker GPG key
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: present
- name: Add Docker repository
apt_repository:
repo: "deb [arch=amd64] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable"
state: present
- name: Install Docker CE
apt:
name: docker-ce
state: latest
update_cache: yes
- name: Add user to docker group
user:
name: "{{ ansible_user }}"
groups: docker
append: yes
场景2:通过宝塔API批量建站
yaml复制- name: Create websites via BT API
hosts: web
vars:
sites:
- { domain: "example.com", php: "74" }
- { domain: "test.com", php: "80" }
tasks:
- name: Create websites
uri:
url: "{{ hostvars[inventory_hostname].bt_url }}/site?action=AddSite"
method: POST
body_format: json
body:
webname: "{{ item.domain }}"
path: "/www/wwwroot/{{ item.domain }}"
type_id: "0"
type: "PHP"
version: "{{ item.php }}"
port: "80"
ps: "Auto created by Ansible"
headers:
Authorization: "{{ hostvars[inventory_hostname].bt_key }}"
loop: "{{ sites }}"
4. 高阶运维技巧
4.1 多级权限管理方案
开发团队只需要访问特定服务器:
bash复制# /etc/sudoers.d/dev-team
%dev-team ALL=(ALL) NOPASSWD: /usr/bin/docker ps, /usr/bin/docker logs *
通过Ansible Vault加密敏感变量:
bash复制ansible-vault create vars/secrets.yml
内容示例:
yaml复制db_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
66386439653236386264386534633065373638313266306636653461326566353131623638623161
6332313539656131316638656236323931643861336639660a393835656365303133386263353132
31303231626631353932396365376331376466396466623865376330343838373636383730643937
3431633066653261620a313233343536373839303132333435363738393031323334353637383930
4.2 可视化监控整合
在宝塔面板"计划任务"中添加:
bash复制# 每5分钟采集数据
*/5 * * * * /usr/bin/curl -sS http://127.0.0.1:19999/api/v1/allmetrics?format=prometheus > /tmp/netdata-metrics
使用Grafana配置统一看板时,PromQL示例:
code复制sum(rate(nginx_http_requests_total{job=~"web.*"}[5m])) by (host)
5. 避坑指南
-
SSH连接超时问题
- 客户端配置:
echo "ServerAliveInterval 60" >> ~/.ssh/config - 服务端配置:
sudo sed -i 's/#ClientAliveInterval 0/ClientAliveInterval 60/g' /etc/ssh/sshd_config
- 客户端配置:
-
宝塔API调用限制
- 批量操作时添加延迟:
pause: 3(Ansible任务间暂停3秒) - 避免并发请求超过宝塔默认的10个/秒限制
- 批量操作时添加延迟:
-
Ansible性能优化
ini复制# ansible.cfg [defaults] forks = 20 host_key_checking = False gathering = smart -
混合架构支持
ARM服务器需特别处理:yaml复制- name: Install ARM specific packages when: ansible_architecture == "aarch64" apt: name: "{{ arm_packages }}"
这套方案经过3个生产环境验证,管理着总计87台服务器(含32台ARM架构),日均执行超过200次自动化任务。最关键的是建立了完整的操作审计日志:
bash复制# 记录所有Ansible操作
export ANSIBLE_LOG_PATH=/var/log/ansible-$(date +%Y%m%d).log
