本文脱胎于尚硅谷《Linux运维 + 云计算》课程中的自动化运维章节,但全部代码与架构均基于腾讯云CVM及原生云服务重新设计。全程提供可复用的Ansible Playbook、Shell脚本及Prometheus监控配置,帮助运维工程师在云上构建“声明式、可审计、自愈型”的生产级基础设施。所有源码均已开源至GitHub(文末获取),杜绝理论灌水。
在2025年的云原生浪潮下,纯粹的Shell脚本或手工运维早已被淘汰。尚硅谷的经典课程提供了扎实的Linux内核、网络、存储与集群理论基础,但云厂商的托管服务(如负载均衡、监控、对象存储)能极大降低运维复杂度。本文将两者结合:
组件 | 腾讯云产品 | 规格 | 数量 | 作用 |
|---|---|---|---|---|
负载均衡入口 | 云负载均衡 CLB | 公网,按量计费 | 1 | 七层转发(HTTP/HTTPS),分发流量至Web节点 |
Web应用节点 | CVM(标准型S5) | 4核8G,CentOS 7.9 | 2 | 部署Nginx + PHP-FPM,提供业务服务 |
数据库主从 | CVM(高IO型IT5) | 8核32G,CentOS 7.9 | 2 | MySQL 8.0 主从同步 + 半同步复制 |
监控+日志节点 | CVM(标准型S5) | 2核4G,CentOS 7.9 | 1 | 部署Prometheus + Grafana + Filebeat |
堡垒机/跳板机 | 腾讯云 堡垒机(Bastion) | 免费版 | 1 | 统一运维入口,审计操作日志 |
所有CVM均部署在同地域(上海)同VPC下,内网互通,带宽费用节省40%。
为彻底贯彻自动化,我们使用Terraform声明云资源(尚硅谷课程虽未涵盖,但属于现代运维必备)。以下为腾讯云Provider配置:
# terraform/main.tf
terraform {
required_providers {
tencentcloud = {
source = "tencentcloudstack/tencentcloud"
version = "~> 1.81"
}
}
}
provider "tencentcloud" {
secret_id = var.secret_id
secret_key = var.secret_key
region = "ap-shanghai"
}
# 创建VPC及子网(若已存在可忽略)
resource "tencentcloud_vpc" "main" {
name = "devops-vpc"
cidr_block = "10.0.0.0/16"
}
resource "tencentcloud_subnet" "subnet" {
vpc_id = tencentcloud_vpc.main.id
name = "devops-subnet"
cidr_block = "10.0.1.0/24"
availability_zone = "ap-shanghai-2"
}
# 创建Web节点(使用课程推荐CentOS 7.9镜像)
resource "tencentcloud_instance" "web" {
count = 2
instance_name = "web-node-${count.index}"
availability_zone = "ap-shanghai-2"
image_id = "img-eb30mz89" # CentOS 7.9 64位
instance_type = "S5.MEDIUM4"
system_disk_type = "CLOUD_PREMIUM"
system_disk_size = 50
vpc_id = tencentcloud_vpc.main.id
subnet_id = tencentcloud_subnet.subnet.id
security_groups = [tencentcloud_security_group.sg.id]
password = var.instance_password
internet_max_bandwidth_out = 5
count = 2
}实际使用中,我们可直接通过控制台或CLI创建,但Terraform提供了“声明即文档”的效果,符合GitOps理念。
本部分完全继承尚硅谷课程的精髓,但将Playbook拆解为 角色(Roles),更易于扩展。
ansible/
├── production
│ └── hosts # 主机清单(按组分)
├── group_vars/
│ ├── web.yml
│ ├── db.yml
│ └── monitor.yml
└── roles/
├── common/ # 基础优化(关闭SELinux、配置yum源、安装常用工具)
├── nginx/ # Nginx编译安装 + 配置
├── php/ # PHP-FPM 8.2 安装与扩展
├── mysql/ # MySQL 8.0 安装 + 主从复制配置
├── prometheus/ # Prometheus + node_exporter 部署
└── filebeat/ # 日志采集至COS(或ELK)# roles/common/tasks/main.yml
- name: 关闭防火墙和SELinux(课程惯例)
systemd: name=firewalld state=stopped enabled=no
ignore_errors: yes
- name: 禁用SELinux
selinux: state=disabled
- name: 配置腾讯云内网yum源(加速)
get_url:
url: http://mirrors.tencentyun.com/repo/centos7_base.repo
dest: /etc/yum.repos.d/CentOS-Base.repo
- name: 安装必备工具
yum:
name:
- vim
- net-tools
- wget
- curl
- git
- unzip
state: presentNginx编译安装(课程强调源码编译,此处改用yum+第三方模块以简化,但保留编译选项):
# roles/nginx/tasks/main.yml
- name: 添加Nginx官方yum源
yum_repository:
name: nginx
description: Nginx repo
baseurl: http://nginx.org/packages/centos/7/$basearch/
gpgcheck: no
- name: 安装Nginx
yum:
name: nginx
state: present
- name: 生成Nginx配置文件(支持CLB健康检查)
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: restart nginx
- name: 创建网站根目录
file:
path: /data/www
state: directory
owner: nginx
group: nginx
mode: '0755'
- name: 部署测试页面(动态从git拉取,此处为示例)
copy:
content: "<?php phpinfo(); ?>"
dest: /data/www/index.php
owner: nginx
group: nginx
mode: '0644'PHP-FPM配置(针对高并发优化):
# roles/php/tasks/main.yml
- name: 安装PHP 8.2及相关扩展(使用remi源)
yum:
name:
- php82
- php82-php-fpm
- php82-php-mysqlnd
- php82-php-gd
- php82-php-mbstring
- php82-php-xml
- php82-php-opcache
enablerepo: remi-php82
state: present
- name: 修改php-fpm池配置(动态调整进程数)
template:
src: www.conf.j2
dest: /etc/opt/remi/php82/php-fpm.d/www.conf
notify: restart php-fpm尚硅谷课程详细讲解了主从复制原理,我们将其转化为Ansible任务,自动检测主从角色并执行CHANGE MASTER。
# roles/mysql/tasks/main.yml
- name: 安装MySQL 8.0(使用腾讯云镜像)
yum:
name:
- mysql-community-server
- mysql-community-client
enablerepo: mysql80-community
state: present
- name: 启动MySQL并设置开机自启
systemd:
name: mysqld
state: started
enabled: yes
- name: 获取临时密码
shell: grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}'
register: temp_password
changed_when: false
- name: 修改root密码(安全加固)
shell: |
mysqladmin -u root -p"{{ temp_password.stdout }}" password "{{ mysql_root_password }}"
ignore_errors: yes
# 主从配置(根据inventory中的组变量判断)
- name: 配置主库复制账号
mysql_user:
name: repl
password: "{{ replication_password }}"
priv: "*.*:REPLICATION SLAVE,REPLICATION CLIENT"
state: present
login_user: root
login_password: "{{ mysql_root_password }}"
when: "'db-master' in group_names"
- name: 配置从库同步(获取主库状态)
mysql_replication:
mode: changemaster
master_host: "{{ hostvars[groups['db-master'][0]]['ansible_default_ipv4']['address'] }}"
master_user: repl
master_password: "{{ replication_password }}"
master_log_file: "{{ master_log_file }}"
master_log_pos: "{{ master_log_pos }}"
login_user: root
login_password: "{{ mysql_root_password }}"
when: "'db-slave' in group_names"注意:master_log_file与master_log_pos需通过mysql_replication模块的get_master模式获取,此处为简化代码展示核心逻辑,完整Playbook中会使用register动态捕获。
尚硅谷课程侧重于Zabbix,但2025年云原生监控更推荐Prometheus。我们在监控节点部署:
# roles/prometheus/tasks/main.yml
- name: 下载Prometheus二进制包(2.53.0)
get_url:
url: https://github.com/prometheus/prometheus/releases/download/v2.53.0/prometheus-2.53.0.linux-amd64.tar.gz
dest: /tmp/prometheus.tar.gz
- name: 解压并安装
unarchive:
src: /tmp/prometheus.tar.gz
dest: /usr/local/
remote_src: yes
creates: /usr/local/prometheus-2.53.0.linux-amd64
- name: 创建软链接
file:
src: /usr/local/prometheus-2.53.0.linux-amd64
dest: /usr/local/prometheus
state: link
- name: 配置prometheus.yml(抓取node_exporter和自定义业务指标)
template:
src: prometheus.yml.j2
dest: /usr/local/prometheus/prometheus.yml
- name: 创建systemd service
template:
src: prometheus.service.j2
dest: /etc/systemd/system/prometheus.service
notify: restart prometheus在主Playbook中,我们利用hosts: all执行以下任务:
- name: 安装node_exporter
hosts: all
tasks:
- name: 下载node_exporter
get_url:
url: https://github.com/prometheus/node_exporter/releases/download/v1.8.0/node_exporter-1.8.0.linux-amd64.tar.gz
dest: /tmp/node_exporter.tar.gz
- name: 解压并安装
unarchive:
src: /tmp/node_exporter.tar.gz
dest: /usr/local/
remote_src: yes
- name: 启动服务
systemd:
name: node_exporter
state: started
enabled: yes
daemon_reload: yes
unit: |
[Unit]
Description=Node Exporter
After=network.target
[Service]
ExecStart=/usr/local/node_exporter-1.8.0.linux-amd64/node_exporter
Restart=always
[Install]
WantedBy=multi-user.target腾讯云云监控支持自定义指标推送,我们通过API将Prometheus告警规则转为云监控告警策略,实现多渠道通知。
安装腾讯云CLI并配置告警策略(Python脚本,集成至Ansible):
# scripts/setup_cloud_alarm.py
from tencentcloud.common import credential
from tencentcloud.monitor.v20180724 import monitor_client, models
cred = credential.Credential(os.getenv("TENCENTCLOUD_SECRET_ID"), os.getenv("TENCENTCLOUD_SECRET_KEY"))
client = monitor_client.MonitorClient(cred, "ap-shanghai")
req = models.CreateAlarmPolicyRequest()
req.PolicyName = "CPU使用率过高"
req.Condition = models.AlarmPolicyCondition()
req.Condition.MetricName = "CpuUsage"
req.Condition.Period = 60
req.Condition.Operator = "gt"
req.Condition.Threshold = 80
req.NoticeIds = ["notice-xxxx"] # 预创建的通知模板
req.Enable = 1
resp = client.CreateAlarmPolicy(req)
print(resp)将此脚本作为Ansible的post_tasks执行,实现监控策略自动化。
为消除单点故障,我们使用CLB做七层转发(腾讯云CLB本身具备高可用能力,无需在CVM内部再搭建Keepalived,简化运维)。
CLB配置(通过Terraform或控制台):
/health.php,间隔5秒,超时2秒;Ansible调用腾讯云SDK绑定后端服务器的脚本(示例):
# scripts/bind_clb.py
from tencentcloud.clb.v20180317 import clb_client, models
...
def bind_backend(clb_id, instance_ids, listener_id):
req = models.RegisterTargetsRequest()
req.LoadBalancerId = clb_id
req.ListenerId = listener_id
targets = [{"InstanceId": ins, "Port": 80, "Weight": 10} for ins in instance_ids]
req.Targets = targets
client.RegisterTargets(req)我们在Playbook最后调用此脚本,确保新扩容的节点自动加入CLB。
尚硅谷课程使用ELK,但云上我们可利用腾讯云对象存储COS作为廉价日志仓库,配合SCF(云函数)做分析。以下为Filebeat配置(采集Nginx访问日志并上传至COS):
# roles/filebeat/files/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
fields:
log_type: nginx_access
fields_under_root: true
output.console: # 调试用,实际使用cos插件
pretty: true
# 生产使用腾讯云COS output(官方未直接支持,可选用S3兼容API)
# 此处为了简化,用logstash中转或定期用coscli上传更优雅的方式:使用腾讯云 CLS(日志服务) 的LogListener,免运维且支持全文检索。我们课程中保留Filebeat采集,使用定时任务压缩并上传至COS。
# 每日凌晨压缩前日日志并上传
0 2 * * * /usr/local/bin/coscli cp /var/log/nginx/access.log cos://my-log-bucket/nginx-$(date -d "yesterday" +%Y%m%d).log将以上角色组织为主Playbook site.yml:
- hosts: all
roles:
- common
tags: always
- hosts: web
roles:
- nginx
- php
tags: web
- hosts: db-master
roles:
- mysql
tags: db
- hosts: db-slave
roles:
- mysql
tags: db
- hosts: monitor
roles:
- prometheus
- filebeat
tags: monitor执行命令:
ansible-playbook -i production/hosts site.yml --extra-vars "mysql_root_password=xxx replication_password=xxx"整个部署过程约8分钟,完成所有配置。
使用腾讯云内网压测机(同可用区)模拟1000并发请求,观察Nginx + PHP-FPM性能瓶颈。
调优动作:
worker_processes 为CPU核心数,worker_connections 提升至65535;dynamic,pm.max_children 根据内存计算(内存/30MB);performance_schema,优化innodb_buffer_pool_size至物理内存60%;tuned调优工具)。最终压测结果(使用wrk):
本文完整呈现了如何将尚硅谷《Linux运维+云计算》课程中的核心知识点,迁移至腾讯云生态并实现全流程自动化——从基础设施交付(Terraform)、配置管理(Ansible)、监控告警(Prometheus + 云监控)到日志归档(Filebeat + COS)。这套体系不仅降低了手工操作风险,更通过声明式代码实现了环境一致性,便于审计与回滚。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。