theme: default themeName: "默认主题" title: "还在手动SSH登录服务器运维?这套自动化方案让效率提升10倍"
前言
手动运维有多苦,相信每个运维都深有体会:服务器多了登录不过来回敲命令敲到腱鞘炎、批量改配置改到怀疑人生、出问题登录几十台服务器排查……自动化运维不是高大上,是每个运维必须掌握的基本技能。本文分享一套完整的自动化运维实践方案,从工具选型到具体落地,看完就能动手做。
自动化运维的三个层次
层次1:批量操作
一次性在多台服务器执行相同命令。
# 原始方式:手动登录每台服务器
ssh user@server1 "systemctl restart nginx" ssh user@server2 "systemctl restart nginx"
... 重复100次
自动化方式:ansible批量执行
ansible all -m shell -a "systemctl restart nginx"
层次2:脚本化
把重复操作写成脚本,一次编写,反复使用。
#!/bin/bash
部署应用的标准化脚本
./deploy.sh app-v1.2.3.tar.gz
自动完成:备份->停止->解压->配置->启动->检查
层次3:平台化
把常用操作做成平台,点点鼠标就完成。
- 发布系统:一键发布到测试/预发/生产
- 监控系统:故障自动告警+自愈
- 巡检系统:自动生成巡检报告
工具选型
1. Ansible:配置管理神器
特点:
- 无Agent(通过SSH连接)
- YAML编写剧本(Playbook)
- 幂等性(重复执行结果一致)
- 学习曲线平缓
# 示例:安装nginx playbook
- name: Install Nginx
hosts: webservers become: yes tasks: - name: Install nginx apt: name: nginx state: present - name: Start nginx service: name: nginx state: started
2. Terraform:基础设施即代码
特点:
- 声明式配置
- 支持多云(AWS/Azure/GCP/阿里云)
- 状态管理
- 计划预览
# 示例:创建云服务器
resource "alicloud_instance" "web" { instance_name = "web-server" image_id = "ubuntu_18_04" instance_type = "ecs.t6.small" vpc_id = alicloud_vpc.main.id vswitch_id = alicloud_vswitch.main.id security_groups = [alicloud_security_group.web.id] }
3. GitLab CI/CD:持续集成部署
特点:
- 代码版本控制
- 自动构建测试
- 自动部署
- 回滚方便
# .gitlab-ci.yml
stages: - build - test - deploy
build: stage: build script: - docker build -t myapp:$CI_COMMIT_SHA .
deploy: stage: deploy script: - docker run -d myapp:$CI_COMMIT_SHA only: - main
自动化实践:从0到1
第一步:资产清单化
先把所有服务器信息整理到一个文件里:
# inventory/hosts.ini
[webservers] 192.168.1.10 ansible_user=deploy 192.168.1.11 ansible_user=deploy
[dbservers] 192.168.1.20 ansible_user=deploy
[appservers] 192.168.1.30 ansible_user=deploy 192.168.1.31 ansible_user=deploy
第二步:SSH Key互信
# 在运维机生成Key
ssh-keygen -t rsa
批量推送公钥到服务器
ssh-copy-id deploy@192.168.1.10 ssh-copy-id deploy@deploy@192.168.1.11
... 批量处理所有服务器
第三步:Ansible入门
# 安装
pip install ansible
配置文件 ansible.cfg
[defaults] inventory = ./inventory/hosts.ini host_key_checking = False retry_files_enabled = False
测试连通性
ansible all -m ping
第四步:编写第一个Playbook
# init-server.yml
- name: Initialize new server
hosts: all become: yes tasks: - name: Update apt cache apt: update_cache: yes - name: Install basic tools apt: name: ["curl", "wget", "vim", "git", "htop"] state: present - name: Set timezone timezone: name: Asia/Shanghai - name: Disable firewalld service: name: firewalld state: stopped enabled: no
# 执行
ansible-playbook init-server.yml
常见自动化场景
场景1:批量更新SSL证书
# deploy-ssl.yml
- name: Deploy SSL Certificate
hosts: webservers become: yes tasks: - name: Copy certificate copy: src: "/ssl/{{ inventory_hostname }}.crt" dest: "/etc/nginx/ssl/{{ inventory_hostname }}.crt" - name: Copy private key copy: src: "/ssl/{{ inventory_hostname }}.key" dest: "/etc/nginx/ssl/{{ inventory_hostname }}.key" - name: Reload nginx service: name: nginx state: reloaded
场景2:批量日志清理
# clean-logs.yml
- name: Clean old logs
hosts: all become: yes tasks: - name: Find old log files find: paths: /var/log age: 7d file_type: file register: old_logs - name: Delete old logs file: path: "{{ item.path }}" state: absent loop: "{{ old_logs.files }}"
场景3:应用批量部署
# deploy-app.yml
- name: Deploy Application
hosts: appservers vars: app_version: "v1.2.3" app_port: 8080 tasks: - name: Stop old container docker_container: name: myapp state: stopped ignore_errors: yes - name: Pull new image docker_image: name: myregistry/myapp tag: "{{ app_version }}" source: pull - name: Run new container docker_container: name: myapp image: "myregistry/myapp:{{ app_version }}" state: started restart_policy: always ports: - "{{ app_port }}:8080" - name: Health check uri: url: "http://localhost:{{ app_port }}/health" status_code: 200 register: health until: health.status == 200 retries: 5 delay: 10
自动化平台设计
如果团队足够大,可以考虑做平台化。
1. CMDB资产管理系统
功能:
- 服务器信息录入
- 资产变更记录
- 归属部门/业务
- 标签/分组
工具:
- 阿里云云CMDB
- 腾讯云CMDB
- 自建:iTop、Snipe-it
2. 发布系统
流程:
1. 代码提交 -> 自动构建 2. 构建成功 -> 部署到测试环境 3. 测试通过 -> 审批 4. 审批通过 -> 灰度发布 5. 灰度OK -> 全量发布
工具:
- Jenkins
- GitLab CI/CD
- Argo CD
- 自研平台
3. 监控系统
推荐组合:
- 监控: Prometheus + Alertmanager
- 可视化: Grafana
- 日志: ELK/Loki
- 告警: 钉钉/企业微信/飞书
避坑指南
1. 幂等性
# 错误的写法(每次都执行,不安全)
- name: Create directory
shell: mkdir -p /data
正确的写法(幂等)
- name: Create directory
file: path: /data state: directory
2. 错误处理
# 忽略错误继续执行
- name: Some task
command: /some/command ignore_errors: yes
失败时回滚
- block:
- name: Deploy command: ./deploy.sh rescue: - name: Rollback command: ./rollback.sh
3. 敏感信息
# 使用vault加密敏感数据
ansible-vault encrypt secrets.yml
或者使用ansible-vault decrypt时输入密码
ansible-playbook deploy.yml --ask-vault-pass
效率提升效果
| 场景 | 手动耗时 | 自动化耗时 |
| 10台服务器装nginx | 30分钟 | 1分钟 |
| 100台服务器日志清理 | 2小时 | 2分钟 |
| 应用灰度发布 | 1小时 | 5分钟 |
| 故障自愈 | 人工响应+处理30分钟 | 自动10秒 |
结语
自动化运维不是"会不会"的问题,是"什么时候做"的问题。从最简单的批量命令开始,逐渐积累成脚本,再慢慢做成平台。罗马不是一天建成的,自动化也是一步步迭代出来的。先让Ansible跑起来,这是最简单、收益最快的第一步。
看完还有什么疑问吗?
如果文章没有覆盖到你的情况,欢迎联系我们咨询——免费解答,说清楚再决定要不要服务。
📞 服务热线:13708730161 💬 微信:eyc1689 📧 邮箱:service@eycit.com 🌐 https://www.eycit.com
易云城IT服务,您身边的IT专家。