第二十七章 运维基建:基于 Shell 脚本与自动化工具的服务器集群初始化与环境隔离

claw-installer:一键自动化部署服务器环境的模块化脚本实践 在软件开发和运维领域,环境部署自动化是提升效率、保证一致性的关键技术。其核心原理是通过脚本将手动操作流程标准化、代码化,实现从系统初始化、软件安装到配置优化的全链路自动化。这种技术能显著降低人为错误风险,加速开发测试周期,尤其适用于需要频繁搭建或复制环境的场景,如微服务架构、CI/CD流水线及多节点集群部署。本文以claw-installer项目为例,深入解析如何通过模块化Shell脚本实现Nginx、MySQL、Redis等组件的**一键部署**与**安全初始化**,涵盖从设计思路、实操要点到生产环境调优 阅读详情

第五篇 生产运维与系统长期健康

项目交付那天,是很多团队的终点,也是系统真正挑战的起点。

一个工业互联网系统上线后需要持续运行5年、10年,甚至更长。它要经历设备新增、工艺改造、人员更替、中间件版本迭代……每一次变化都是对系统稳定性的考验。而维护它的团队,往往和建设它的团队有着完全不同的能力结构和压力处境。

第五篇从运维基础设施建设出发,覆盖CI/CD发布机制、全链路监控、灾备与演练、日志分析中心,直到安全合规体系。这六个章节的核心命题只有一个:如何让一套复杂的工业系统在漫长的生命周期里,依然"每天都知道自己的状态,出了问题能在一小时内找到根因,从不让人意外地死亡"。


第二十七章 运维基建:基于 Shell 脚本与自动化工具的服务器集群初始化与环境隔离

本章导读:第五篇从本章开始,聚焦"系统上线之后如何活得久"。本章是运维体系的地基——在国企万国牌硬件和严格的IT/OT网络隔离下,如何用自动化手段消灭"配置漂移"这个慢性毒药。我们从PXE无人值守装机、Shell动态嗅探脚本(自适应网卡/磁盘/内核参数)、到Ansible编排的四阶段混合技术栈完整展开,同时坦诚记录了与信息中心的Root权限博弈、以及IT/OT物理隔离下被迫采用"半截自动化"的无奈妥协。运维基建不是一次性项目,而是一种持续的能力建设。

​ 在我们谈论数字孪生、智能排产、大数据分析等光鲜亮丽的"上层建筑"时,往往会忽略支撑这些应用的"地下室"——服务器集群与底层运行环境。

​ 在项目初期,由于缺乏标准化的环境管控,我们吃尽了"配置漂移"的苦头。开发团队在实验室跑得完美无缺的代码,一到榆林现场的生产服务器上就各种莫名宕机。追查几天后才发现,仅仅是因为某台服务器的 sysctl.conf 中内核参数 fs.file-max(最大文件句柄数)少敲了一个零。在庞大的智能工厂中,这种"手工作坊式"的运维不仅是效率灾难,更是悬在生产连续性头顶的达摩克利斯之剑。这逼迫我们必须在运维基建上进行彻底的"自动化改造"。

一、问题根因:为什么工业项目的运维基建如此脆弱?

1. 配置漂移:慢性毒药

“配置漂移”(Configuration Drift)是工业互联网项目中最隐蔽的风险。它不像故障那样瞬间爆发,而是在日积月累的手工操作中悄然积累——某工程师临时开了一个端口没有记录,某次升级修改了内核参数却没有同步其他节点,某台服务器单独打了补丁而其他台没有……

经过 6 个月的生产运行,同一批交付的服务器集群往往已经演化成若干个"个性鲜明的雪花服务器"(Snowflake Server)。每台服务器都独一无二,任何一台的配置都无法被另一台复现。这带来三个严重后果:

  1. 故障排查成本指数级上升:同样的报错,在 A 机器上是配置问题,在 B 机器上是版本问题,在 C 机器上却莫名消失。运维工程师疲于奔命。
  2. 容量扩展变成噩梦:新增一台服务器,没人知道需要做哪些配置才能与集群一致,全靠老工程师的"记忆和经验"。
  3. 问题复现率极低:测试环境发现的 bug,生产环境无法复现;生产环境的故障,测试环境无法模拟。根因就是两个环境的配置已经悄然分叉。
2. 国企采购制度的硬件碎片化

受限于国企分批次的招投标采购制度,机房里的硬件是名副其实的"万国牌博览会"。同一批集群里,混杂着浪潮、华为、联想、戴尔乃至几年前退役的旧 IBM 服务器。这带来底层配置的极度碎片化:

差异维度典型问题影响范围
网络接口命名eth0/eth1 vs eno1/ens33 vs bond0静态网络配置脚本全部失效
磁盘设备路径/dev/sda vs /dev/vda vs /dev/nvme0n1自动化分区挂载脚本崩溃
BIOS/UEFI引导Legacy BIOS vs UEFI Secure BootPXE 裸机装机策略需要分叉
内存与CPU架构不同代际的 Intel/AMD 混用JVM 调优参数、NUMA 策略不统一
存储控制器驱动不同 RAID 卡导致块设备行为差异IO 调度器参数配置失效

这种碎片化使得"写一个脚本、适配所有服务器"成为一个不切实际的愿望,除非脚本本身具备强大的自适应嗅探能力。

3. "人"是最大的不稳定变量

最根本的问题,是运维流程对"人的细心"的高度依赖。一份手工 SOP 文档,经过三个工程师的传递,往往会产生三种版本的执行结果。人会疲劳、会犯错、会偷懒跳步骤。在凌晨两点的紧急扩容场景里,任何一个手滑都可能将故障从分钟级扩展到小时级。

结论:运维基建的自动化不是锦上添花,而是生产稳定性的基础设施投资。

二、 技术破局:基于 Shell + Ansible 的底层重构

为了将"人"这个最大的不可控变量从部署流程中剔除,我们引入**“基础设施即代码”(Infrastructure as Code,IaC)** 理念,确立了 “PXE 裸机装机 → Shell 环境嗅探 → Ansible 配置编排 → 验证收敛” 的四阶段混合技术栈。

1. 第一阶段:PXE 无人值守装机

传统的操作系统安装需要工程师携带 U 盘逐台插拔,一个 50 台节点的集群安装可以耗费 2 天时间。我们通过 PXE(预启动执行环境)实现网络无人值守安装:

┌────────────────────────────────────────────────────────┐
│  新服务器上电,BIOS设置从网络(PXE)启动               │
│         ↓                                               │
│  通过DHCP获取IP,从TFTP服务器加载PXE引导程序           │
│         ↓                                               │
│  下载 Kickstart/Cloud-Init 自动应答配置文件             │
│  (含:分区方案、网络配置、root密码、基础包列表)       │
│         ↓                                               │
│  从私有HTTP服务器下载OS镜像,全自动静默安装             │
│         ↓                                               │
│  安装完成后自动重启,触发首次启动的初始化脚本           │
└────────────────────────────────────────────────────────┘

Kickstart 配置的关键设计:

# kickstart.cfg 核心片段
%pre --interpreter=/bin/bash
# 动态检测主磁盘(适配 sda/vda/nvme0n1)
PRIMARY_DISK=$(lsblk -nd --output NAME,TYPE | awk '$2=="disk"{print $1}' | head -1)
echo "bootloader --location=mbr --driveorder=${PRIMARY_DISK}" >> /tmp/ks_disk.cfg
echo "clearpart --all --drives=${PRIMARY_DISK}" >> /tmp/ks_disk.cfg
%end

%packages --ignoremissing
@core
chrony
net-tools
vim
python3
%end

%post
# 安装完成后,立即向管控平台注册本机
curl -s http://mgmt-server/api/register \
  -d "hostname=$(hostname)&mac=$(ip link show | grep ether | awk '{print $2}' | head -1)"
%post

这种设计让 OS 安装本身就具备动态适配能力,而非依赖固定的磁盘设备名假设。

2. 第二阶段:Shell 初始化脚本的动态嗅探

OS 安装完成后,进入环境基线配置阶段。这是整个技术体系中最复杂的部分,因为需要在非标准硬件上实现标准化输出。

核心设计思想是**“探测优先,硬编码为耻”**——脚本永远先询问系统现状,再基于现状做出决策,而非假设系统处于某个固定状态。

【技术拆解:Init-Baseline.sh 的核心嗅探机制】

① 网卡自适应配置

#!/bin/bash
# 动态发现有效物理网卡,避免硬编码 eth0/ens33
detect_primary_nic() {
    # 排除 lo 和虚拟网卡,找到第一个 UP 状态的物理网卡
    PRIMARY_NIC=$(ip link show | awk -F': ' \
        '/^[0-9]+: /{nic=$2} /state UP/{print nic; exit}' \
        | grep -v '^lo$')
    
    if [ -z "$PRIMARY_NIC" ]; then
        # 降级策略:取第一块非lo网卡
        PRIMARY_NIC=$(ip link show | awk -F': ' \
            '/^[0-9]+: [^l]/{print $2; exit}')
    fi
    echo "$PRIMARY_NIC"
}

NIC=$(detect_primary_nic)
MAC=$(ip link show "$NIC" | awk '/ether/{print $2}')
echo "检测到主网卡: $NIC (MAC: $MAC)"

② 数据盘自适应挂载

# 自动发现非系统盘并挂载到 /data
auto_mount_data_disk() {
    ROOT_DISK=$(df / | awk 'NR==2{print $1}' | sed 's/[0-9]*$//')
    
    # 找所有容量 > 100G 的非根磁盘
    DATA_DISK=$(lsblk -nd --output NAME,SIZE,TYPE \
        | awk '$3=="disk" && $2~/[GT]/{
            gsub(/G/,"",$2); if($2+0 > 100) print $1
        }' \
        | grep -v "$(basename $ROOT_DISK)" | head -1)
    
    if [ -n "$DATA_DISK" ]; then
        DISK_PATH="/dev/$DATA_DISK"
        # 幂等性检查:已分区则跳过
        if ! blkid "${DISK_PATH}1" &>/dev/null; then
            parted -s "$DISK_PATH" mklabel gpt
            parted -s "$DISK_PATH" mkpart primary xfs 0% 100%
            mkfs.xfs -f "${DISK_PATH}1"
        fi
        
        # 幂等性挂载:已在 fstab 则跳过
        if ! grep -q "$DISK_PATH" /etc/fstab; then
            echo "${DISK_PATH}1  /data  xfs  defaults,noatime  0 2" >> /etc/fstab
        fi
        mount -a
        echo "数据盘 $DATA_DISK 已挂载至 /data"
    fi
}

③ 内核参数基线(生产级调优配置)

# sysctl 参数幂等写入
apply_kernel_tuning() {
    cat > /etc/sysctl.d/99-industrial-platform.conf << 'EOF'
# 文件句柄上限(工业数据采集场景需要大量文件描述符)
fs.file-max = 1048576

# 网络缓冲区(高吞吐数据流场景)
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728

# TIME_WAIT 处理(微服务大量短连接场景)
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65535

# 内存 OOM 保护(工业场景不允许随意 OOM Kill 核心服务)
vm.overcommit_memory = 1
vm.panic_on_oom = 0
EOF
    sysctl --system
}

④ 幂等性设计原则

脚本的每个操作都遵循"检查后执行"范式,确保无论执行多少次,服务器最终状态始终一致:

# 错误示范(非幂等)
echo "export JAVA_HOME=/usr/local/jdk" >> /etc/profile

# 正确示范(幂等)
if ! grep -q "JAVA_HOME" /etc/profile; then
    echo "export JAVA_HOME=/usr/local/jdk" >> /etc/profile
fi
3. 第三阶段:Ansible 上层配置编排

Shell 脚本抹平硬件差异后,通过免密 SSH 密钥分发接入 Ansible,进行上层环境配置的标准化编排。

Ansible 项目结构:

ansible-infra/
├── inventory/
│   ├── production          # 生产环境主机清单
│   ├── staging             # 预发布环境
│   └── group_vars/
│       ├── all.yml         # 全局变量(JDK版本、NTP服务器等)
│       └── kafka_nodes.yml # Kafka集群专属变量
├── roles/
│   ├── common/             # 基础配置(时钟同步、hosts解析、ulimit)
│   ├── jdk/                # JDK安装与环境变量
│   ├── docker/             # Docker CE安装与daemon配置
│   ├── firewall/           # 防火墙规则按角色自动配置
│   ├── kafka/              # Kafka集群初始化
│   ├── elasticsearch/      # ES集群配置
│   └── monitoring-agent/   # Prometheus节点导出器
├── playbooks/
│   ├── site.yml            # 全量初始化入口
│   ├── rolling-update.yml  # 滚动升级
│   └── verify.yml          # 环境验证
└── Jenkinsfile             # 流水线集成入口

关键 Role 示例(时钟同步):

# roles/common/tasks/chrony.yml
- name: 安装 Chrony
  yum:
    name: chrony
    state: present

- name: 配置内网 NTP 源(工厂内网,不依赖互联网)
  template:
    src: chrony.conf.j2
    dest: /etc/chrony.conf
    backup: yes
  notify: restart chrony

- name: 确保时钟同步服务开机自启
  systemd:
    name: chronyd
    state: started
    enabled: yes

- name: 强制同步时钟(初始化场景时钟可能偏差较大)
  command: chronyc makestep
  changed_when: false

执行效率对比:

操作手工方式自动化方式效率提升
30台服务器OS安装2人×2天1人×2小时(监控PXE进度)~16x
集群环境基线配置3人×1天自动化执行约20分钟~72x
增加1个节点半天15分钟~24x
核心参数变更下发逐台SSH,高错误率Ansible 一条命令,100%一致质变
4. 第四阶段:配置验证与收敛检测

自动化执行后必须有验证,否则"执行了"不等于"正确了"。

# playbooks/verify.yml - 验证集群环境是否达标
- name: 验证文件句柄配置
  shell: sysctl -n fs.file-max
  register: file_max
  failed_when: file_max.stdout | int < 1048576

- name: 验证 NTP 同步状态
  shell: chronyc tracking | grep "System time"
  register: ntp_offset
  # 生产要求时钟偏差不超过100ms
  failed_when: "'offset' not in ntp_offset.stdout"

- name: 验证数据盘挂载
  shell: df -h /data | tail -1 | awk '{print $6}'
  register: data_mount
  failed_when: data_mount.stdout != '/data'

- name: 生成验收报告
  template:
    src: verify_report.html.j2
    dest: "/tmp/verify_{{ inventory_hostname }}_{{ ansible_date_time.date }}.html"

验收报告自动汇总所有节点的检测结果,以 HTML 格式发送给项目负责人,替代工程师逐台检查的人工验收流程。


三、 环境隔离:让"它在我这里能跑"成为历史

1. 四环境模型设计

工业互联网项目的环境隔离不能照搬互联网公司的"开发/测试/生产"三环境模式,需要增加一个专门用于工业仿真的环境层,形成四环境模型:

┌─────────────────────────────────────────────────────────┐
│  DEV(开发环境)                                         │
│  • 开发者本地开发,轻量化,允许配置不标准                │
│  • 使用 Docker Compose 在笔记本本地模拟服务依赖          │
│  • 数据:Mock 数据 / 极小量脱敏样本                     │
├─────────────────────────────────────────────────────────┤
│  SIT(系统集成测试环境)                                 │
│  • 与生产配置完全同构(相同内核参数、相同中间件版本)    │
│  • 与生产数据采集系统对接,但读取历史回放数据            │
│  • 供各供应商联调使用,多供应商共享,由总集统一管理      │
├─────────────────────────────────────────────────────────┤
│  UAT(用户验收测试环境)                                 │
│  • 业务方验收新功能,数据接近真实生产数据                │
│  • 仅允许业务方和测试人员访问,不允许开发者登录          │
│  • 变更窗口受限,每周一次统一更新                        │
├─────────────────────────────────────────────────────────┤
│  PROD(生产环境)                                        │
│  • 最高安全等级,开发者无法直接登录                      │
│  • 所有变更必须经过 UAT 验证+安全审批                   │
│  • IT网与OT网物理隔离,OT侧另有独立管控策略             │
└─────────────────────────────────────────────────────────┘
2. 环境同构保证:配置即代码

"同构"不是口号,而是需要技术手段强制保证的工程目标。核心机制:

① 基础镜像统一:所有环境的 Docker 基础镜像来自同一私有 Harbor,并通过 CI 流水线强制校验镜像 SHA256 摘要,防止"相同 Tag 但内容不同"的镜像污染问题。

② 配置变量集中管理:环境间差异(服务地址、账号密码、日志级别)通过环境变量注入,而非代码写死。使用 Ansible Vault 加密敏感变量,明文变量统一在 GitLab 配置中心管理:

# group_vars/production/vars.yml(明文部分)
kafka_brokers: "kafka01:9092,kafka02:9092,kafka03:9092"
elasticsearch_cluster: "es-prod"
log_level: "WARN"

# group_vars/production/vault.yml(Ansible Vault 加密)
db_password: !vault |
  $ANSIBLE_VAULT;1.1;AES256
  3462363833303138...(加密内容)

③ 版本矩阵锁定:各环境的中间件版本通过"版本矩阵"文档统一约束,Ansible Role 中的版本号变量化,通过 CI 检查各环境是否一致:

版本矩阵(Version Matrix)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
组件          DEV      SIT      UAT      PROD
───────────────────────────────────────────────
JDK           17.0.9   17.0.9   17.0.9   17.0.9
Kafka         3.6.1    3.6.1    3.6.1    3.6.1
Elasticsearch 8.11.3   8.11.3   8.11.3   8.11.3
PostgreSQL    15.4     15.4     15.4     15.4
Redis         7.2.3    7.2.3    7.2.3    7.2.3
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

版本矩阵作为代码提交到 Git,任何环境版本变更须经过 Code Review,并触发自动化同步流水线。

3. 数据隔离策略

环境隔离不仅是配置隔离,数据隔离同样关键,尤其在工业场景中存在真实生产数据的安全合规问题:

维度DEVSITUATPROD
数据库本地Mock数据脱敏后的历史快照脱敏后的近期数据真实生产数据
消息队列模拟消息生产者回放历史采集数据仅接收生产Topic镜像真实工业数据流
文件存储测试文件样本文件脱敏业务文件真实业务数据
访问权限开发者全权限开发者+测试者仅测试者+业务方最小权限原则

数据脱敏管道:从生产环境导出数据到 SIT/UAT 前,必须经过自动化脱敏流程,使用工具(如 Faker + 自定义规则)将敏感字段(工人工号、设备序列号、产线产量等)替换为仿真数据,同时保留足以触发业务逻辑的结构特征。

四、 实施暗礁:跨越不了的部门墙与权限博弈

技术的狂欢很快撞上了组织架构的冰山。

1. 权限博弈:Root 之争

在推进自动化的过程中,我们遭遇了项目组与信息中心(IT 运维部门)激烈的权限博弈。

信息中心的核心诉求:生产服务器的 Root 权限绝不能交给业务项目组的程序。理由充分——一旦自动化脚本有 bug 导致全线宕机,信息中心承担主责,而他们无法对项目组的代码质量负责。

项目组的核心诉求:没有足够权限,内核参数调优、systemd 服务注册、防火墙规则配置等操作无法通过代码自动下发,自动化效果大打折扣。

最终妥协方案:Sudo 白名单 + 堡垒机隔离

# /etc/sudoers.d/ansible-service(由信息中心审核后下发)
ansible ALL=(root) NOPASSWD: \
    /usr/bin/systemctl start *,   \
    /usr/bin/systemctl stop *,    \
    /usr/bin/systemctl restart *, \
    /usr/bin/systemctl enable *,  \
    /usr/bin/yum install *,       \
    /usr/sbin/sysctl -p,          \
    /usr/bin/mkdir -p /data/*,    \
    /usr/bin/chown *
# 明确禁止的高危操作
ansible ALL=(root) !/usr/bin/rm -rf *
ansible ALL=(root) !/usr/sbin/iptables -F

所有 Ansible 执行节点部署在堡垒机后方,每次 SSH 连接均被审计记录。虽然牺牲了部分灵活性(部分高危操作无法自动化),但建立了合规框架,让信息中心接受了自动化工具的引入。

教训:权限博弈本质上是信任建立的过程。建议在项目初期主动邀请信息中心参与自动化脚本的 Code Review,让他们理解代码内容,而非把他们当成障碍绕过。赢得信任后,白名单范围会逐步扩大。

2. IT/OT 物理隔离:自动化的终点线

如果权限博弈只是路上的减速带,那么 IT 网与 OT 网的物理隔离,则是彻底切断自动化链路的一堵高墙。

按照国家等保 2.0 及《工业控制系统信息安全防护指南》的硬性要求,OT 生产控制网与 IT 管理网之间必须实施严格的物理隔离或强逻辑隔离,通常通过以下方式实现:

IT 管理网 ←→ 防火墙/WAF ←→ DMZ 区 ←→ 工业数据网闸(单向)←→ OT 生产控制网
                                  (只允许数据从OT流向IT,禁止反向控制指令)

这导致一个极其尴尬的局面:我们在 IT 管理网内搭建的豪华自动化流水线,在到达 DMZ 边界时戛然而止。Ansible 控制节点根本无法通过 SSH 穿透网闸触达 OT 网内的服务器。

被迫的"半截自动化"落地方式:

阶段一(IT 网,全自动)
   ↓
流水线编译、构建、测试、打包
   ↓
生成带强签名的"离线部署包"
   ├── 容器镜像(tar 格式)
   ├── Flyway 数据库变更脚本
   ├── Ansible Local 模式部署脚本
   └── 包完整性校验文件(SHA256 + GPG 签名)
   ↓
阶段二(OT 网边界,人工摆渡)
   ↓
安全员使用专用杀毒机扫描 U 盘
或通过网闸单向文件摆渡通道传输
   ↓
阶段三(OT 网内,半自动)
   ↓
实施工程师执行 one-click-deploy.sh
内部再次调用 Ansible Local 模式
完成 OT 网内的标准化部署

离线包完整性验证机制:

#!/bin/bash
# one-click-deploy.sh(OT 网内执行)
PACKAGE_FILE="deploy-package-v2.3.1.tar.gz"
EXPECTED_SHA256="a3f8b9c1e2d45678..."

# 完整性校验(防篡改)
ACTUAL_SHA256=$(sha256sum "$PACKAGE_FILE" | awk '{print $1}')
if [ "$ACTUAL_SHA256" != "$EXPECTED_SHA256" ]; then
    echo "ERROR: 包完整性校验失败!请重新从IT网获取安装包"
    exit 1
fi

# GPG 签名验证(仅接受来自 CI 系统的官方包)
gpg --verify "${PACKAGE_FILE}.sig" "$PACKAGE_FILE" || {
    echo "ERROR: GPG 签名验证失败!"
    exit 1
}

echo "校验通过,开始部署..."
tar -xzf "$PACKAGE_FILE"
cd deploy-package/
ansible-playbook -c local -i localhost, site.yml

虽然是"半截自动化",其核心价值在于:OT 网内的部署过程本身是完全自动化和标准化的,消除了人工操作的随意性;同时包完整性验证确保了 IT 网的流水线产物在渡过物理隔离边界时未被篡改。

五、 进阶实践:配置合规持续检测

1. 配置漂移的主动发现

自动化初始化之后,配置漂移仍然可能在生产运行过程中悄然发生(人工紧急操作、软件自动升级、安全补丁等)。需要建立持续配置合规检测机制:

方案一:Ansible 定期 Check 模式

# 每晚凌晨2点执行配置合规检查(不做变更,只生成漂移报告)
ansible-playbook site.yml --check --diff \
  -o drift_report_$(date +%Y%m%d).json

方案二:引入 InSpec 或 Serverspec 做声明式合规验证

# inspec 规则示例:验证文件句柄配置
control 'kernel-file-max' do
  title '确保文件句柄上限正确配置'
  desc '工业数据采集场景要求 fs.file-max >= 1048576'
  
  describe kernel_parameter('fs.file-max') do
    its('value') { should be >= 1048576 }
  end
end

control 'chrony-active' do
  title '时钟同步服务必须运行'
  
  describe service('chronyd') do
    it { should be_installed }
    it { should be_enabled }
    it { should be_running }
  end
end

每日合规报告自动推送至运维监控看板,漂移节点触发告警,由信息中心或项目运维工程师在下一个维护窗口恢复。

2. 不可变基础设施的方向

从长远看,真正解决配置漂移的终极方案是不可变基础设施(Immutable Infrastructure):

  • 服务器部署后永远不做就地修改,需要变更时销毁旧实例、拉起用新镜像构建的新实例
  • 在云原生环境(K8s)已经是标准实践
  • 在裸金属工业现场,受限于启动时间和硬件成本,可通过容器化方案(每次发布替换容器而非修改宿主机)逐步逼近这一理想

这是未来的方向,但现阶段的工业项目,大多数仍处于"脚本自动化 + 定期合规检测"的阶段,需要务实推进,而非追求一步到位。

六、 架构师的深度复盘

1. 技术不能解决管理和物理合规的死结

我们曾天真地认为,只要技术足够牛,就能实现端到端的"一键部署"。但现实教会了我们:在工业互联网的深水区,安全合规的优先级永远高于交付效率。

IT/OT 隔离不是可以绕过的技术障碍,而是有国家标准支撑的硬性合规要求。所谓的"半截自动化"拉长了版本迭代周期,也让 OT 端配置在日复一日的人工干预下再次出现了缓慢的漂移。这是目前阶段无法完全解决的矛盾,只能在合规框架内最大化自动化程度。

2. 顶层规划比底层代码更有价值

回顾这段过程,我们花费了巨大精力写底层嗅探代码以适配非标硬件。实际上,如果在项目初期的顶层规划阶段,能从商务采购层面强制统一硬件规格(比如:同一集群必须使用同家供应商同一型号),后续许多复杂的适配代码是可以避免的。

教训:运维基建的最高投资回报点,不是精妙的脚本,而是在项目立项阶段硬性约束硬件选型规范。

3. "自动化"是一种能力建设,而非一次性项目

很多团队把"建立自动化基础设施"当成一个有起点有终点的项目,完成后就刀枪入库。这是错的。自动化脚本和 Playbook 需要随着业务拓展、中间件版本迭代、安全策略变化而持续演进,必须像业务代码一样纳入版本管理、Code Review 和 CI 自动测试体系,才能持续发挥价值。

PostgreSQL 运维自动化:从 “手动部署到半夜” 到 “一键搞定集群” 的摸鱼指南 本文针对 PostgreSQL 手动运维的部署繁琐、备份漏验证等五大痛点,提出 “Ansible+Shell” 自动化解决方案。核心内容包括:用 Ansible Playbook 一键部署 PG 主从集群(含 WAL 归档、流复制)并自动校验;Shell+Crond 实现基础备份 + WAL 归档 + 异地同步 + 数据校验的自动化流程;带回滚机制的 PG 版本升级脚本,避免业务中断;以及日常运维重复工作的自动化脚本。方案降低人为错误率,大幅提升运维效率,最后预告下一篇将梳理 PG 完整能力体系,助力从 “ 阅读详情

相关推荐

第11章 Shell 批量部署服务器:自动配置 SSH、安装依赖与环境初始化

批量部署服务器是企业级运维的核心技能,它能够大幅提升运维效率,降低人工操作错误率。本章将深入讲解如何使用 Shell 脚本实现服务器集群的自动化部署,包括 SSH 免密登录配置、系统环境初始化、依赖包批量安装等关键功能,帮助你掌握大规模服务器集群管理的实战技巧。

猪猪侠 159

kjyw运维自动化:如何用Shell脚本提高工作效率300%

在现代IT运维工作中,效率就是竞争力。kjyw(快捷运维)作为一个基于Shell和Python的运维脚本工具库,汇集了各类常用运维脚本,能够帮助运维人员实现快速安装配置Nginx、MySQL、PHP、Redis等服务,显著提升工作效率。本文将详细介绍如何利用kjyw中的Shell脚本实现自动化运维,让你的工作效率提升300%。 ## 为什么选择kjyw进行运维自动化? 传统的运维工作往往需要手

gitblog_00221的博客 987

云计算的自动化与脚本:实现高效运维

在云计算时代,企业 IT 架构从传统数据中心向多云、混合云环境快速演进,基础设施规模呈指数级增长,业务对稳定性、敏捷性的要求也达到了前所未有的高度。传统手工运维模式在面对海量服务器、复杂微服务架构时,暴露出效率低下、故障率高、重复性劳动密集等问题。自动化与脚本技术作为破解运维困局的核心手段,通过将重复性操作代码化、标准化,实现基础设施部署、配置管理、监控报警、故障恢复等全流程的自动化,成为高效运维的 “引擎”。

AI天才研究院 1669

Linux自动化运维工具:从Shell脚本到Ansible的进阶之路

在当今的IT运维领域,Linux自动化运维工具已经成为提升效率和可靠性的关键。从简单的Shell脚本到强大的Ansible配置管理,Linux自动化运维工具让系统管理员能够轻松管理成百上千台服务器。本文将带您了解Linux自动化运维工具的完整进化路径,帮助您从基础到进阶掌握这些强大的工具。🚀 ## Shell脚本:自动化运维的起点 Shell脚本是Linux自动化运维工具中最基础也是最实用的

gitblog_00337的博客 1085

电工电子实验——3BIT延时电路的设计与实现

设计一个 3BIT延时电路。 设计分析: Ⅰ.根据触发器的特性,只有来两个触发脉冲时才能恢复到原来的状态。也就是说触发器的输出信号比触发信号延迟了一个触发脉冲周期即1bit。据此3bit就需要3个触发器。 Ⅱ.输出要可控就要加一控制器,可用选择器实现。 Ⅲ.为便于观察输出信号的延迟,可设计一个F1信号。

qq_55543315的博客 1128

STM32L452与FPGA通信翻车?手把手教你关闭I2C时钟延展避坑(附OVR错误解决方案)

本文深入解析STM32L452与FPGA在I2C通信中因时钟延展功能导致的常见问题,提供关闭I2C时钟延展的详细配置方法(NOSTRETCH模式),并针对可能出现的OVR错误给出Combined模式解决方案。通过实战案例和波形分析,帮助工程师快速排查和解决嵌入式系统中的I2C兼容性问题。

e3f4g5的博客 216

Shell自动化脚本【Shell脚本介绍 】

在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(command interpreter,命令解析器)。负责对硬件进行管理与操作的是系统软件的内核(kernel)部分,用户是无法和内核打交道的,用户只能通过应用程序或部分系统软件发出指令,这些指令会被翻译并传给内核。.和source的权限,继承的是/bin/bash的权限。source和.不会创建子进程,是在当前shell进程下执行的,因为他们是内嵌命令,所以脚本中赋值的本地变量也会影响当前shell的。

qq_43606536的博客 1418

HFSS 3D LAOUT PCB 裁剪,差分线,过孔仿真和优化

我本身不是做天线设计的,所以HFSS这个软件给我主要还是做PCB级别的高速信号完整性仿真,一般2.5D的仿真软件无法对过孔和跨平面进行仿真。所以要借助三维电磁软件进行。今天就针对PCB进行裁剪。为什么要裁剪?以为如果把整个PCB一起仿真的话,应该要好几个月吧。所以为了加快仿真速度,必须进行裁剪仿真。①candence的PCB可以直接导入。那么先导入brd文件,file-import-candence结果如下②点击cutout,选中要仿真的net和参考平面。这里最好选creat new不然会把原文件覆盖掉。注

gjatwfn的专栏 1万+

【RocketMQ集群实战】Dashboard自动化部署与运维脚本全解析

本文详细解析了RocketMQ Dashboard的自动化部署与运维脚本实践。针对RocketMQ集群环境,提供了从环境准备、核心启动脚本编写到配套停止重启脚本的完整方案,并分享了日志监控、健康检查等高级运维技巧,旨在通过脚本化实现一键部署与高效运维,显著降低集群管理复杂度。

grass的博客 666

VECTOR硬件VN1600系列对比:VN1610、VN1611、VN1630A、VN1640A、VN1630log、VN1670

VN16系列说不清道不明的区别和关系

AmorRun的博客 2万+

共享单车数据分析与需求预测项目

除了自行车共享系统的有趣的实际应用之外,这些系统生成的数据特征使它们成为研究的有吸引力的对象。由于这些系统在交通、环境和健康问题中的重要作用,它们引起了极大的关注。Huber 回归器:一个对异常值具有鲁棒性的模型,CV 得分为 0.4660,表明它对此数据集可能不那么有效。代码中的内容cv_score就像您正在使用的机器学习模型的成绩单。它告诉您模型的表现如何。减少异常值的影响:它还可以减少异常值的影响,因为对数转换显着缩小了数据的范围。因此,cv_score平均分数表明您的模型的预测效果如何。

极光喵的博客 2948

6 个纯 Shell 自动化脚本|DCU 环境部署 + 故障排障 + 生产运维全覆盖

这篇文章介绍了6个针对DCU服务器运维的纯Shell自动化脚本,覆盖环境初始化、故障诊断、集群校验、服务守护等核心场景,无需额外依赖即可使用: DTK环境初始化脚本 - 自动探测安装路径并配置环境变量 DCU故障诊断脚本 - 一键检查驱动、权限等常见问题 集群节点校验脚本 - 批量验证多节点环境一致性 vLLM推理守护脚本 - 实现服务启停和自动重启 显存清理脚本 - 自动释放被占用的显存资源 硬件基准测试脚本 - 快速检查DCU性能指标 这些脚本基于系统原生工具开发,可直接复制使用,能显著提高DCU服务器

FYL_HH的博客 396

《Python入门到精通》函数详解

函数就是一段「封装」起来的「代码」,目的是提高代码的「模块性」和「复用性」。 2、函数的参数 2.1、变量的就近原则 2.2、传递参数 2.3、形参和实参 2.4、位置参数 2.5、缺省参数 2.6、可变类型和不可变类型 2.7、关键字参数 3、匿名函数 4、函数的返回值

wangyuxiang946的博客 1万+

Shell脚本自动化搭建CentOS 8集群环境

实验目的:先编写 Shell 脚本对 CentOS 8 单节点进行基础自动化配置,随后完成主机名设定与固定 IP 配置;再利用镜像复制技术,快速部署出多台配置相同的节点,从而为 Hadoop、Kubernetes 等分布式系统构建标准化的基础环境。

2501_91677755的博客 808

55、宇宙微波背景辐射望远镜及其光学系统解析

本文详细解析了宇宙微波背景辐射(CMB)望远镜及其光学系统的设计与优化。内容涵盖折射与反射光学系统的特性、旁瓣控制技术、气球与地面观测系统的对比、探测器阵列的发展、光学系统设计流程以及不同观测场景下的光学系统选择。同时,文章展望了CMB望远镜光学系统的未来发展趋势,包括技术创新、多频段观测、国际合作与大型项目等。通过系统性的分析与对比,为CMB研究提供了全面的技术支持与理论基础。

f9g0h的博客 145

PX4控制云台的两种方式 方法适用控舵机 控灯

云台控制插件是mount_control,运行mavros启动文件的时候需要注意该插件是否正常启动,需要在px4_pluginlists.yaml配置文件中将mount_control从blacklisted中移除后才可启动。后会默认占用AUX端口1-4,此时通过AUX通道1-4输出PWM控制信号至云台,对应的RC通道映射功能失效。控制信号输入为RC 则接收机必须连接对应的通道至AUX辅助通道,并通过MNT_MAN_*参数设置pitch/roll/yaw对应的AUX通道。配置为AUTO或MAVLINK,

z1872385的博客 3669

Shell脚本在自动化运维中的核心价值与实践技巧

Shell脚本作为Linux/Unix系统的核心工具,本质是命令解释器,将人类可读指令转换为机器可执行操作。其技术价值在于直接调用系统命令链(如grep/sed/awk),无需编译即时执行,特别擅长文本流处理与文件操作。在自动化运维场景中,Shell脚本能高效实现批量服务器管理、日志分析和定时备份等重复性工作,结合crontab定时任务和Git版本控制可构建完整运维体系。通过实际案例可见,合理运用进程替换、数组操作等特性,20行脚本即可替代人工3天工作量。在云原生时代,Shell仍与Ansible、Kube

congdi7904的博客 417

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

shell:生产服务脚本集锦,简化运维流程

shell:生产服务脚本集锦,简化运维流程 项目介绍 在现代运维场景中,自动化脚本的编写和使用是提升工作效率、降低人力成本的有效方式。今天,我们要为大家推荐一个名为shell的开源项目,该项目汇集了生产中常用的各种服务脚本,从时间同步到负载均衡,从数据库管理到Web服务,几乎涵盖了所有常见服务的自动化运维需求。 项目技术分析 shell项目基于Shell编程语言,充分利用了Shell脚本在Linu...

gitblog_00832的博客 764

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

经验丰富的 Shell 运维工程师:构建高效稳定系统的基石

Shell运维工程师:Linux系统稳定运行的守护者 作为Linux/Unix系统的核心维护者,Shell运维工程师通过自动化脚本和工具保障系统高效运行。主要职责包括:自动化任务(备份、部署、环境初始化)、系统监控与告警、故障诊断、性能优化及安全管理。需精通Shell脚本、Linux系统原理、网络基础及常用运维工具(如Ansible、Prometheus),同时具备故障排查能力和团队协作意识。在DevOps和SRE趋势下,Shell运维工程师是提升系统可靠性与运维效率的关键角色。

2501_91107759的博客 1281

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

运维开发宝典035-Shell脚本自动化运维编程Shell运维脚本实战1

大家好,我是云计算磊哥,从业20年的IT老鸟。运维培训15年,总结了一套从入门到精通的全运维开发宝典手册。

xulei512050951的博客 216

终极kjyw运维工具箱:监控、备份、安全一体化解决方案完整指南

🚀 **kjyw运维工具箱**是一款基于Shell和Python开发的**监控、备份、安全一体化解决方案**,专为运维工程师设计,帮助您快速部署和管理Linux服务器环境。无论您是新手还是经验丰富的运维人员,这个开源工具库都能显著提升您的工作效率,实现一键安装、批量部署和自动化运维。 ## 📊 为什么选择kjyw运维工具箱? 在当今快节奏的IT环境中,运维效率直接关系到业务稳定性和团队生产

gitblog_00041的博客 847

SmallThinker-3B-Preview与自动化运维脚本:智能生成Ansible, Shell脚本

本文介绍了如何在星图GPU平台上自动化部署SmallThinker-3B-Preview镜像,以辅助运维工程师高效工作。该平台支持一键部署,用户可利用此轻量级大语言模型,通过自然语言描述来自动生成Ansible Playbook或Shell脚本,例如快速创建用于服务器日志清理或服务状态监控的自动化脚本,从而提升运维效率与规范性。

weixin_30674431的博客 174

HCIP-openEuler考试通关秘籍:Shell脚本与自动化管理实战解析

本文深入解析HCIP-openEuler认证考试中Shell脚本与自动化管理的核心实战技巧。文章从运维痛点切入,强调Shell脚本是串联openEuler服务管理、存储与集群架构的“金线”,并通过参数校验、函数封装等实例,详细讲解了如何编写健壮、可维护的脚本。同时,结合Ansible在openEuler上的环境搭建、Playbook编写及与脚本融合的监控告警系统实战,系统阐述了自动化管理的落地方法,为考生提供从理论到实践的高效备考路径。

weixin_29219539的博客 411

运维自动化概念

一、运维标准化 (规范化 —> 流程化 —> 文档化) 物理设备层面: 1.服务器标签化、设备负责人、设备采购详情、设备白方标准 2.网络划分、远程控制卡、网卡端口 3. 服务器机型、硬盘、内存统一。根据业务分类 4.资产命名规范、编号规范、类型规范 5.机房监控标准(硬件温度和湿度) 操作系统层面: 1.操作系统版本 2. 系统初始化(DNS,NTP、内核参数调优、主机命名...

qq_23191379的博客 1156

shell编程及自动化运维-更新中

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

qq_74422309的博客 555

kjyw项目架构详解:运维脚本的设计模式与最佳实践

kjyw(快捷运维)是一个基于shell和python的运维脚本工具库,旨在收集各类运维常用工具脚本,实现快速安装nginx、mysql、php、redis、nagios等服务以及提供运维经常使用的脚本。本文将深入剖析kjyw项目的架构设计、核心功能模块以及脚本开发的最佳实践,帮助运维人员更好地理解和使用这个强大的工具库。 ## 项目架构概览 kjyw项目采用模块化的架构设计,将不同类型的运维

gitblog_00607的博客 684
上一篇: 第二十六章 项目协同管理:如何在多供应商环境下实现需求管控与责任边界界定
下一篇: 第二十八章 CI/CD 演进:在安全与敏捷间走钢丝的发布机制
我是李龙
博客等级 码龄16年 3粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值