ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

运维开发核心能力与自动化平台构建实战解析

运维开发核心能力与自动化平台构建实战解析 很意外2020年投奇安信运维开发岗的时候我以为这又是一份“开开关关机房设备、搭环境装系统”的差事。面完聊完才意识到这个岗位的核心根本不是“运维的动作”而是“把运维动作全部变成自动化平台和工具链”。那轮面试前后聊了两个多小时一半时间都在问CI/CD流程怎么设计、监控数据怎么处理、CMDB怎么建模。今天整理一下我对这个岗位的理解也把当时面试和后来实践里沉淀下来的一套思路写出来希望能给正在准备类似岗位、或者刚转行做运维开发的朋友一些参考。1. 运维开发工程师到底在解决什么问题1.1 从“救火队员”到“工具制造者”传统运维团队最常见的状态就是“救火”——服务器宕了、磁盘满了、配置错了、上线失败了所有人都扑上去手动处理。这种模式在服务器几十台的时候还能撑住一旦规模上了几百台、上千台问题就完全变了手动操作不再是慢而是根本不可能完成。这时候你会发现自己面临的痛点非常一致重复劳动太多、操作无法追溯、知识都积压在个人脑子里、故障恢复时间完全取决于“谁今天值班、是不是一个熟手”。运维开发的核心就是把这些场景里的手工操作、判断逻辑、经验知识全部转换成可执行的代码、脚本和平台。一个运维开发工程师的产出不是“今天处理了十个工单”而是“我这个月写出来的工具让下个月全体运维不用再处理这十类工单”。用代码去消灭重复劳动用平台去收编人为操作这是我和同岗位的同事聊下来大家最强烈的共识。1.2 这个岗位需要什么能力图谱我在奇安信面试时面试官给了一个很直接的岗位画像我后来消化了一下基本可以拆成四个能力维度编码能力首选Python其次Go。运维开发里大量工作是写API接口、写数据处理脚本、写自动化任务Python生态成熟、上手快。Go的优势在于编译成单一二进制、并发能力强适合做Agent采集器这类常驻程序。系统能力不能只会“装系统”要懂Linux的系统原理知道进程调度、文件系统、网络协议栈的基本机制。排查问题的时候这些底层知识决定你能不能从表象找到根因。网络与架构能力要懂HTTP、TCP/IP、DNS、负载均衡、网关这些基础组件。运维开发的很多交互都是服务间的调用不懂网络基本没法调试。数据能力监控系统每天产生海量时序数据日志系统收集的是文本流。用SQL做业务分析是基础还得理解时序数据库的采样、聚合、降精度思路以及ELK这套日志处理管线的设计逻辑。坦白说这四个能力一开始并不需要全部精通但你必须每样都拿得起来。尤其是Python和Linux这是底线中的底线。1.3 安全行业背景下的运维开发特殊性在奇安信这种安全公司做运维开发和普通互联网公司有一点明显的差别运维的对象里有大量安全设备和安全组件比如防火墙策略的变更、网络隔离域的调整、漏扫任务的编排这些都要纳入自动化平台。我对这一点体会很深安全行业对操作审计和权限管控的要求比一般行业更严格你做的自动化工具如果缺少审批流、缺少操作日志、缺少双人复核那基本上线就会被安全团队挑战。所以安全行业的运维开发本质上是一个“戴着镣铐跳舞”的工作你既要用自动化提升效率又要在关键节点人为介入、留痕、审批。这不是效率的倒退而是合规的必要代价。设计工具的时候一定要学会把这些约束当成需求来做而不是当障碍来回避。2. 工具链选型与整体方案设计思路2.1 为什么Python成了首选语言2020年前后的运维开发生态里Python几乎是绝对主流。我后来自己也对比过几种语言方案Python的优势确实很实在开发速度快写一个脚本处理日志、调一个API同步数据Python几十行代码就能搞定用Java写同样的逻辑代码量至少翻倍。生态齐全requests、paramiko、ansible、celery、pandas、flask、django几乎都有对应问题的成熟库不用自己造轮子。和运维天然亲和所有主流的运维工具比如Ansible、SaltStack底层都是Python学Python等于同时打开了这些工具的二次开发大门。当然Python也有明显短板而且做项目久了你会真切感受到性能确实一般。并发一高、计算一遍历数据大GIL锁就变成了瓶颈。所以我后来的经验是管理面、控制面的工具用Python写数据面、采集面的常驻进程优先考虑Go。面试的时候提到这个取舍面试官明显更认可因为这证明你不只是会写Python而是理解不同场景下语言选型的逻辑。2.2 自动化平台怎么搭Ansible还是自研自动化工具选型是运维开发绕不开的话题。当时市面上可选的方案大概有这么几类方案优点缺点适用场景Ansible无Agent、上手快、模块丰富大规模并发执行效率一般中规模批量配置、临时任务SaltStack并发强、速度块、有事件总线需要装Agent、配置复杂大规模实时执行自研分布式任务完全按需定制、集成方便开发维护成本高业务逻辑复杂、强管控场景我当时给的建议是以Ansible为基础做包装层在上面开发自己的API、审批流、资源采集逻辑。这样既能用Ansible丰富的模块快速落地又能在上层建立统一的管控入口。不是说Ansible不可替代而是从0到1的性价比最高跑通之后再逐步替换成自研模块。2.3 从裸脚本到平台化的演进路径很多团队一开始都是“每个人电脑上一堆脚本”谁负责哪块就自己跑自己的。我这里给一个比较稳妥的演进路径也是我实际推过并验证有效的脚本代码入库第一步不是写平台而是把散落在个人电脑上的脚本用Git统一管起来建立Code Review机制。先避免代码丢失、逻辑无人评审的问题。定时任务平台化把常跑的脚本都迁移到统一的调度平台比如用Airflow、Celery Beat或者自建cron管理服务集中管理执行记录。API化把常用运维操作封装成标准API上层工具通过接口调用不再直接ssh到服务器抠命令。流程和UI化在API之上做操作页面、审批流、权限模型这就从“工具”进化成了“平台”。这一步一步走的经验是不要试图一口气上大平台否则一定会陷入需求黑洞。先把基础设施打扎实把数据的准确性和操作的可追溯性做出来平台自然水到渠成。2.4 为什么CMDB是平台的中枢神经我接触过的很多运维项目死了不是死在技术难点上而是死在CMDB建不起来或者数据不准。CMDB配置管理数据库就是资产、应用、关系的数据底座自动化平台所做的所有操作最终都要落到CMDB记录的这些实体上。我在设计CMDB模型时踩过的坑总结下来有几个关键注意事项不要一上来建模太细把机房、机柜、服务器、IP、业务、应用、负责人这些核心字段先建好关系先做简单的归属和依赖。过于复杂的模型录入成本高很快就没人维护了。数据来源必须自动采集通过Agent自动上报主机信息、通过云API同步资源列表人工录入只作为兜底。没有自动采集CMDB就是三天后就过期的一张废表。对应关系要收敛服务器和业务之间是一对多还是多对多一定要提前定义清楚。我见过很典型的翻车案例一台机器上跑了三个应用CMDB里归属关系混乱故障的时候连通知谁都没法自动确定。3. 核心模块拆解与实操要点3.1 资产采集Agent的设计要点运维平台的数据源头是资产采集。我们的方案是在所有目标机器上部署一个轻量Agent每隔一段时间上报主机信息。这个Agent有几个关键点必须处理好采集项不能太贪心CPU型号、内存大小、磁盘分区、操作系统版本、主IP、机器序列号这些是基础项。采集频率要合理比如基础信息10分钟一次监控指标1分钟一次。千万别把业务数据也塞进Agent里采集那样Agent会越来越重最后变成一个新的故障点。上报要支持断点续传网络抖动是常态Agent和Server之间必须有消息确认和重试机制。我当时用的思路是本地先落一个轻量SQLite缓存上报成功后才标记清除失败自动重试。Agent自身必须能远程升级Agent被部署到几百台机器上之后如果每次改代码都要一台台登录更新那就完全背离了自动化的初衷。要设计一套版本管理机制服务端下发新包Agent自动拉取、校验、切换版本。这一条我建议直接在初版设计时就做进去后面补真的很难受。3.2 配置下发与变更执行的关键细节配置管理模块是自动化平台里最容易出问题的环节。你通过平台去修改一台nginx的配置、修改一个sysctl参数、修改一份应用配置文件这些操作都必须有严格的执行模型操作前必须备份修改文件之前先把原文件快照存起来标注时间戳、变更人、变更单号。变更要有验证步骤执行完变更后不能只看“命令执行成功”就结束而是要执行验证动作比如检查服务状态、灰度请求结果、校验配置文件语法。回滚要快设计变更任务时一定同时设计回滚任务。回滚动作和执行动作要成对出现这就是我常说的“没有回滚方案的变更就是埋雷”。3.3 统一监控平台的选型与落地监控这块我们的选型是Prometheus和Grafana2020年这对组合已经非常成熟。核心的设计思路是三层指标采集层用exporter采集主机指标用自定义exporter采集业务指标。blackbox_exporter做端口探活elasticsearch_exporter采集ES集群状态。每一种exporter的行业里都有成熟方案直接集成。存储与查询层Prometheus负责时序数据的存储和查询设置合理的保留时间和采样粒度。要注意的是告警规则一定要在Prometheus侧做不要把原始指标全量拉到告警引擎去算那样效率太低。展示层Grafana做可视化面板把监控数据分成基础设施、中间件、业务应用三个层级分别设计看板。3.4 日志收集与审计分析运维平台必须解决“机器出问题时如何快速定位”这个问题日志中心是答案。我们用的是行业里很经典的ELK组合Filebeat采集日志Kafka做缓冲队列Logstash做过滤清洗Elasticsearch存储Kibana做查询展示。日志处理管线有一个容易被忽略的点必须对日志做降噪和提取。生产环境里的日志永远是海量的直接全量灌进ES不仅存储成本极高查询也会变得非常慢。我们当时的策略是在Logstash阶段就完成结构化解析只保留关键字段和异常堆栈正常level的常规日志最多保留访问摘要。这能省掉至少一半以上的存储成本查询速度也不会劣化。4. 实操过程中踩过的坑与排查思路4.1 批量执行效率问题第一次用Ansible批量对500台机器执行命令时用的默认forks设置结果跑了快半小时还没结束而且部分机器出现超时失败。排查了一下发现根本原因是forks默认并发只有5吞吐量太低。解决办法很简单在执行Ansible时调大forks参数设置成50或者100。但对大批量任务还是建议用滚动窗口的方式分批执行避免瞬时流量太大把目标机器上的sshd打进高负载状态。比如500台机器可以每批50台、批间暂停10秒这样整体效率高且不会造成踩踏。4.2 监控告警通知风暴监控接入初期一个非常经典的坑某台机器磁盘使用率突破了阈值结果告警通知里重复推送了几十条消息。原因是这台机器挂了多个文件系统每个文件系统都触发了同样的告警规则而通知聚合又没做好。解决思路是告警规则里必须配置group_by和group_wait参数。按照机器维度做分组同一台机器的多告警合并成一条通知再按告警名称或者告警级别做二级路由。这个经验非常值钱我建议所有新接监控的系统都对告警做一次分组和去重测试。4.3 自动化任务重复执行导致的数据污染自动化脚本一旦跑起来最怕的就是“重复执行没有幂等性”。我的亲身经历是一个初始化服务器的脚本里有一个“添加定时任务”的步骤结果因为脚本支持重跑机制被触发重跑同一台机器上出现了三条相同的定时任务后面每次看到这个机器的日志都在奇怪为什么任务反复执行。问题根因就是脚本没有做幂等校验。从那之后我给自己定了一条铁律所有自动化任务必须设计成幂等操作。怎么做要么在执行前检查“是不是已经执行过了”要么让操作本身支持重复执行无害。这条经验所有做自动化运维的人都值得反复默念。4.4 安全合规下的卸载难题在安全公司或重安全管控的行业里工作机或服务器上部署的安全管控Agent例如奇安信天擎这类终端安全管理组件有时候会给运维开发流程带来额外约束。常见的问题场景包括离职回收设备时需要卸载终端管控组件、退役服务器需要清除Agent记录但卸载过程往往要求输入管理员授权密码甚至需要服务端下发解锁指令。我在实操中遇到这类问题时不会推荐任何绕过验证的方法因为终端管控组件的强制卸载验证本身就是安全边界的一部分用非常规手段绕过验证会触犯合规红线。我建议的正确姿势是走正规流程联系负责终端安全管理的同事提交设备退役或变更申请单由管理员在服务端发起授权然后配合完成卸载。看似多了一个环节实际上是保护自己的操作合法可追溯。这个行业里合规比省事更重要这条认知特别重要。5. 面试官眼里的加分项与准备建议5.1 动手写一个小型运维工具胜过大段自我介绍当时面试的时候我把平时自己写的自动化脚本整理成了两个小项目放在简历里附上了GitHub链接。一个是小型服务器初始化工具输入一批IP和角色标签自动完成基础环境安装、安全基线配置、监控Agent部署。另一个是日志关键错误告警脚本扫描后端日志发现特定错误模式后自动推送企业微信通知。面试官看到这两个项目后问题马上从“你给我讲讲你做过什么”变成了“你在做这个工具的时候怎么考虑并发、怎么保证稳定性、怎么排查失败”。也就是说有一个真实完成的小工具你才有资格被问到更高级的运维开发技术问题。没有真实项目经验做的铺垫聊再多的理论也经不起追问。5.2 多问场景问题展示你的系统思维面试官问CI/CD怎么做时不要只回答“用Jenkins跑流水线”。你要把它放进整个运维体系里思考代码提交触发的流水线编译产物如何归档镜像如何构建部署如何通过配置中心下发回滚怎么触发上线后的监控如何自动跟进。你能把这些串起来就已经不是普通的“运维操作工”了而是真正的“运维开发工程师”视角。5.3 准备两个最有含金量的项目故事我在准备运维开发岗位面试时提炼了两个项目故事反复打磨项目一自动化上线系统。这个项目我解决了什么问题、用了什么技术栈、上线后运维手工操作从平均40分钟压缩到5分钟、故障回滚时间从20分钟缩短到2分钟。数据说清楚项目说服力自然就强了。项目二稳定性保障平台。这是把监控、日志、告警、值班通知串起来的一套联动机制核心是降低故障响应时长。项目里最难的点是数据链路长、环节多我通过消息队列解耦和数据分层解决了。面试之前一定要把项目里的数字和优化前后对比准备好面试官最烦听到“效果有提升”但拿不出具体数字的回答。6. 对运维开发方向完整路径的个人思考6.1 一年内的入门路线建议如果你是零基础想转行做运维开发或者刚入职一家公司做运维支持想往这个方向走我给一条循序渐进的路线第1-3个月扎实Linux基础做到系统管理、文件权限、网络配置、systemd、awk和sed常用命令烂熟于心。同时每天写一点Python脚本至少把文件处理、正则、子进程调用、requests库用熟。第4-6个月了解CI/CD流程会用Git、学一点Docker和Jenkins自己做一个小项目自动完成构建和部署。第7-9个月学监控和日志部署一套PrometheusGrafanaELK完整环境给自己个人的服务器或者自己写的应用接上监控。第10-12个月尝试把之前所有工具整合成一个简单的自动化平台哪怕只是个人用也要把架构理清楚。这个过程能帮你串联起前面学的所有知识。6.2 技术上什么是长期主义运维开发这个岗位技术变化很快但有一些底层的东西是长期稳定的Linux的基本原理、网络协议、Python或者Go的编程能力、数据库和数据处理能力、系统的整体架构思维。这些底层能力一旦建立无论上层工具怎么变你都能快速适应。我后来观察过很多优秀的运维开发工程师无一例外都是底层基础非常扎实的人。再分享一个小的实操心得做运维开发千万不能只看文档不拆源码。用到Ansible时直接读它的源码理解模块的执行逻辑用到Prometheus时读读它的alertmanager路由逻辑。源码阅读能力是这个岗位拉开差距的分水岭它让你从“会用”变成“能改、能扩展”。6.3 关于安全行业的运维开发最后说一点行业展望。安全公司和安全行业里的运维开发未来的方向一定不只是做自动化平台而是要做成更智能、更懂风险的“安全自动化”。同样一次配置变更安全行业的平台需要判断这次变更是否涉及安全策略、是否需要审批、是否可能引入风险漏洞。运维开发工程师需要具备一些安全思维比如权限最小化原则、操作留痕原则、变更审批原则。这些原则放在自动化里不是阻碍而是你设计的系统比别人更强健的护城河。我在奇安信面试的最后面试官问了一句“你觉得运维开发的核心是什么”我想了半天最后回到一句话运维开发的核心是让基础设施和人之间建立一条高效、透明、可控的通道。这句话后来也变成了我做所有运维平台的第一性原理。希望这篇文章能让你在这个方向上少走一些弯路也欢迎你带着自己的项目故事来和我交流。
返回列表