一些小团队的自动化运维实践经验
作者:翟志军
来源:http://showme.codes/2018-06-07/devops-in-action/
注:本文要求读者对Ansible和 Jenkins有一定的认识。
题记: 幸福的家庭都是相似的 不幸的家庭各有各的不幸
行业内各巨头的自动化运维架构都各种功能各种酷炫,如下图,让人可望不可及。现在最终的样子大家都知道了,但问题是如何根据自己团队当前的情况一步步向那个目标演进?
笔者所在团队,三个半开发,要维护几十台云机器,部署了十来个应用,这些应用90%都是遗留系统。应用系统的编译打包基本在程序员自己的电脑上。分支管理也清一色的 dev 分支开发,测试通过后,再合并到 master 分支。生产环境的应用配置要登录上具体的机器看才知道,更不用说配置中心及配置版本化了。
对了,连基本的机器级别的基础监控都没有。
我平时的工作是 50% 业务开发,50% 运维。面对这么多问题,我就想啊,如何在低成本情况下实现自动化运维。本文就是总结我在这方面一些经验和实践。希望对读者有帮助。
1、别说话,先上监控和告警
事情有轻重缓急,监控和告警是我觉得一开始就要做的,即使业务开发被拖慢。只有知道了当前的情况,你才好做下一步计划。
现在市面上监控系统很多:Zabbix、Open-Falcon、Prometheus。最终作者选择了 Prometheus。因为:
它是拉模式的
它方便使用文本方式来配置,有利于配置版本化
插件太多了,想要监控什么,基本都会有现成的
以上三者,我基本都要重新学,我为什么不学一个 Google SRE 书上推荐的呢?
之前我们已经介绍过,人少机器多,所以,安装 Prometheus 的过程也必须要自动化,同时版本化。笔者使用的是 Ansible + Git 实现。最终样子如下:
这里需要简单介绍一下:
Prometheus Server 负责监控数据收集和存储
Prometheus Alert manager 负责根据告警规则进行告警,可集成很多告警通道
node-exporter 的作用就是从机器读取指标,然后暴露一个 http 服务,Prometheus 就是从这个服务中收集监控指标。当然 Prometheus 官方还有各种各样的 exporter。
使用 Ansible 作为部署工具的一个好处是太多现成的 role 了,安装Prometheus 时,我使用的是现成的:prometheus-ansble
有了监控数据后,我们就可以对数据进行可视化,Grafana 和 Prometheus 集成得非常好,所以,我们又部署了 Grafana:
在 Grafana 上查看 nodex-exporter 收集的数据的效果图大概如下:
可是,我们不可能24小时盯着屏幕看CPU负载有没有超吧?这时候就要上告警了,Promehtues 默认集成了 N 多告警渠道。可惜没有集成钉钉。但也没有关系,有好心的同学开源了钉钉集成 Prometheus 告警的组件:
prometheus-webhook-dingtalk。
接着,我们告警也上了:
完成以上工作后,我们的基础监控的架子就完成了。为我们后期上 Redis 监控、JVM 监控等更上层的监控做好了准备。
2、配置版本化要从娃娃抓起
在搭建监控系统的过程中,我们已经将配置抽离出来,放到一个单独的代码仓库进行管理。以后所有部署,我们都会将配置和部署逻辑分离。
关于如何使用 Ansible 进行配置管理,可以参考这篇文章:How to Manage Multistage Environments with Ansible 。我们就是使用这种方式来组织环境变量的。
├── environments/ # Parent directory for our environment-specific directories │ │ │ ├── dev/ # Contains all files specific to the dev environment │ │ ├── groupvars/ # dev specific groupvars files │ │ │ ├── all │ │ │ ├── db │ │ │ └── web │ │ └── hosts # Contains only the hosts in the dev environment │ │ │ ├── prod/ # Contains all files specific to the prod environment │ │ ├── groupvars/ # prod specific groupvars files │ │ │ ├── all │ │ │ ├── db │ │ │ └── web │ │ └── hosts # Contains only the hosts in the prod environment │ │ │ └── stage/ # Contains all files specific to the stage environment │ ├── groupvars/ # stage specific groupvars files │ │ ├── all │ │ ├── db │ │ └── web │ └── hosts # Contains only the hosts in the stage environment │
现阶段,我们所有的配置都以文本的方式存储,将来要切换成使用Consul做配置中心,也非常的方便,因为 Ansible2.0以上的版本已经原生集成了consule: consul_module
Tips: Ansible 的配置变量是有层次的,这为我们的配置管理提供了非常大的灵活性。
3、Jenkins 化:将打包交给 Jenkins
我们要将所有的项目的打包工作交给 Jenkins。当然,现实中我们是先将一些项目放到 Jenkins 上打包,逐步将项目放上 Jenkins。
首先我们要有 Jenkins。
搭建 Jenkins 同样有现成的 Ansible 脚本:ansible-role-jenkins。注意了,在网上看到的大多文章告诉你 Jenkins 都是需要手工安装插件的,而我们使用的这个 ansible-role-jenkins 实现了自动安装插件,你只需要加一个配置变量 jenkins_plugins 就可以了,官方例子如下:
---- hosts: allvars:jenkins_plugins:- blueocean- ghprb- greenballs- workflow-aggregatorjenkins_plugin_timeout: 120pre_tasks:- include_tasks: java-8.ymlroles:- geerlingguy.java- ansible-role-jenkins
搭建好 Jenkins 后,就要集成 Gitlab 了。我们原来就有Gitlab了,所以,不需要重新搭建。如何集成就不细表了,网络上已经很多文章。
最终 Jenkins 搭建成以下这个样子:
关于 Jenkins master 与 Jenkins agent 的连接方式,由于网络环境各不相同,网上也有很多种方式,大家自行选择适合的方式。
好,现在我们需要告诉 Jenkins 如何对我们的业务代码进行编译打包。有两种方法:
界面上设置
使用 Jenkinsfile:类似于 Dockerfile 的一种文本文件,具体介绍:Using a Jenkinsfile
作者毫不犹豫地选择了第2种,因为一是利于版本化;二是灵活。
Jenkinsfile 类似这样:
pipeline {agent anystages {stage('Build') {steps {sh './gradlew clean build'archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true}}}}
那么 Jenkinsfile 放哪里呢?和业务代码放在一起,类似这样每个工程各自管理自己的 Jenkinsfile:
这时,我们就可以在 Jenkins 上创建一个 pipleline Job了:
关于分支管理,我们人少,所以,建议所有项目统一在 master 分支进行开发并发布。
4、让 Jenkins 帮助我们执行 Ansible
之前我们都是在程序员的电脑执行 Ansible 的,现在我们要把这项工作交给 Jenkins。具体操作:
在 Jenkins 安装 Ansible 插件
在 Jenkinsfile 中执行
withCredentials([sshUserPrivateKey(keyFileVariable:"deploy_private",credentialsId:"deploy"),file(credentialsId: 'vault_password', variable: 'vault_password')]) {ansiblePlaybook vaultCredentialsId: 'vault_password', inventory: "environments/prod", playbook: "playbook.yaml",extraVars:[ansible_ssh_private_key_file: [value: "${deploy_private}", hidden: true],build_number: [value: "${params.build_number}", hidden: false]]
}
ansiblePlaybook
是 Jenkins ansible 插件提供的 pipeline 语法,类似手工执行:ansible-playbook
。withCredentials
是 Credentials Binding 插件的语法,用于引用一些敏感信息,比如执行 Ansible 时需要的 ssh key 及 Ansible Vault 密码。一些敏感配置变量,我们使用 Ansible Vault 技术加密。
5、Ansible 脚本应该放哪?
我们已经知道各个项目各自负责自己的自动化构建,所以,Jenkinfile 就放到各自项目中。那项目的部署呢?同样的道理,我们觉得也应该由各个项目自行负责,所以,我们的每个要进行部署的项目下都会有一个 ansible 目录,用于存放 Ansible 脚本。
类似这样:
但是,怎么用呢?我们会在打包阶段将 Ansible 目录进行 zip 打包。真正部署时,再解压执行里面的 playbook。
6、快速为所有的项目生成 Ansible 脚本及Jenkinsfile
上面,我们将一个项目进行 Jenkins 化和 Ansible 化,但是我们还有很多项目需要进行同样的动作。考虑到这是体力活,而且以后我们还会经常做这样事,所以笔者决定使用 cookiecutter 技术自动生成 Jenkinsfile 及 Ansible 脚本,创建一个项目,像这样:
7、小结
总结下来,我们小团队的自动化运维实施的顺序大概为:
上基础监控
上 Gitlab
上 Jenkins,并集成 Gitlab
使用 Jenkins 实现自动编译打包
使用 Jenkins 执行 Ansible
以上只是一个架子,基于这个“架子”,就可以向那些大厂的高大上的架构进行演进了。比如:
CMDB的建设:我们使用 ansible-cmdb 根据 inventory 自动生成当前所有机器的情况
发布管理:Jenkins 上可以对发布的每个阶段进行定制。蓝绿发布等发布方式可以使用通过修改 Ansible 脚本和 Inventory 实现。
自动扩缩容:通过配置 Prometheus 告警规则,调用相应 webhook 就可以实现
ChatOps: ChatOps实战
以上就是笔者关于自动化运维的一些实践。还在演进路上。希望能与大家交流。
- END -
热文:
Intellij IDEA神器那些让人爱不释手的14种小技巧,统统告诉你!
一文告诉你,Intellij IDEA神器隐藏的11种实用小技巧!
往期推荐:
死磕Java系列:
深入分析ThreadLocal
深入分析synchronized的实现原理
深入分析volatile的实现原理
Java内存模型之happens-before
Java内存模型之重排序
Java内存模型之分析volatile
Java内存模型之总结
J.U.C之AQS简介
J.U.C之AQS:CLH同步队列
……
Spring系列:
Spring Cloud Zuul中使用Swagger汇总API接口文档
Spring Cloud Config Server迁移节点或容器化带来的问题
Spring Cloud Config对特殊字符加密的处理
Spring Boot使用@Async实现异步调用:使用Future以及定义超时
Spring Cloud构建微服务架构:分布式配置中心(加密解密)
Spring Boot快速开发利器:Spring Boot CLI
……
可关注我的公众号
深入交流、更多福利
扫码加入我的知识星球
点击“阅读原文”,看本号其他精彩内容
一些小团队的自动化运维实践经验相关推荐
- 魅族容器云平台基于Kubernetes自动化运维实践
作者简介: 曾彬 阿里巴巴 高级技术专家 互联网老兵,十多年的基础架构经验,曾在支付宝.爱立信.魅族等担任系统架构师,从事过 Linux 内核开发,Java 中间件.SOA 应用框架的设计实现.云平台 ...
- DBA很忙—MySQL的性能优化及自动化运维实践
作者:王辰 来自:高效运维(ID:greatops) DBA的日常工作 首先,我们来看看DBA的具体工作,我觉得 DBA 真的很忙:备份和恢复.监控状态.集群搭建与扩容.数据迁移和高可用,这是我们 D ...
- 有赞数据库自动化运维实践之路
「运维内推」有赞诚聘:应用运维工程师.系统运维工程师.运维开发工程师.DBA.请关注文末链接 一.前言 有赞作为"新零售"的软件服务供应商,随着业务的不断发展,从第一批几十家商户到 ...
- MySQL的性能优化及自动化运维实践与Mysql高并发优化
首先,我们来看看DBA的具体工作,我觉得 DBA 真的很忙:备份和恢复.监控状态.集群搭建与扩容.数据迁移和高可用,这是我们 DBA 的功能. 了解这些功能以后要对体系结构有更加深入的了解,你不知道怎 ...
- MySQL数据库性能优化及自动化运维实践教程!DBA日常工作
MySQL数据库性能优化及自动化运维实践教程!本文作者将站在更加全面的角度分享他在这一年多 DBA 工作中的经验,希望可以给大家带来启发和帮助. DBA 的日常工作 我觉得 DBA 真的很忙,我们来看 ...
- linux框架下搭建orl,DevOps和自动化运维实践/Linux\Unix技术丛书
导语 内容提要 随着云计算.Docker.Kubernetes技术的流行,相信大家经常会听到"容器云"这个专业词汇,容器技术的兴起,对于传统的运维知识体系而言也是一种冲击和挑战.& ...
- 微信分享 | 大规模数据中心自动化运维实践
大规模数据中心的运维实践 大家好,我是青云QingCloud 运维工程师朱峻华,在海关某单位任职数年,后又混迹多家外企,曾在IBM/EMC出现. 刚才粗略看了一下群成员,有我好几个曾经的同事,还有不少 ...
- 大规模数据中心自动化运维实践
大规模数据中心的运维实践 大家好,我是青云QingCloud 运维工程师朱峻华,在海关某单位任职数年,后又混迹多家外企,曾在IBM/EMC出现. 刚才粗略看了一下群成员,有我好几个曾经的同事,还有不少 ...
- 从0到1 | 滴滴DB自动化运维实践了解一下
本文根据朱进卓老师在2018年4月14日[3306π 北京站]现场演讲内容整理而成. 讲师介绍 朱进卓 滴滴资深DBA 主要负责专车.快车等核心业务线数据库维护,数据库架构设计.优化.高可用维护,滴滴 ...
最新文章
- java设计模式---合成模式2
- 福利继续:赠书《Spring Cloud微服务-全栈技术与案例解析》
- ssh反向主动连接 及脚本加密
- 未来不是计算机发展的方向,未来人类的方向,或许不是人工智能,而是智能人类...
- 命名空间不能直接包含字段或方法之类的成员_Linux内存取证:解析用户空间进程堆(中)...
- springboot map数据类型注入_SpringBoot结合策略模式实战套路
- dnf辅助外挂C++源代码
- php+反序列化代码执行漏洞,PHP反序列化漏洞
- 标准库类型String
- python manager_详解Python的Django框架中Manager方法的使用
- 一篇基金研报--《外包服务:后安迪-比尔时代IT产业的大餐》
- eact+redux仿微信聊天室和vue+web端聊天室
- 选股策略你都会吗,这些选股策略你看懂了吗?
- n96 微信 服务器繁忙,网友称塞班手机已无法登陆QQ/微信
- mysql enclosed by_MySql csv文件导入导出
- Hilt的使用(动态模块)四
- java 实现 ppt或pptx文件转换PDF文件 -- poi
- Jupyter Notebook修改字体大小、颜色等
- 联想有linux系统下载地址,联想有了自己的Linux操作系统?
- ZYNQ PS端MIO的使用——FPGA Vitis篇
热门文章
- docker mysql 容器无故停止的原因
- 项目代码结构 Dao,Service,Controller,Util,Model 含义
- 渗透中poc、exp、payload与shellcode的区别
- linux alpine 中telnet转移至busybox-extras
- VS修改项目名后出现的提示(warning MSB8028: The intermediate directory (Debug\) contains files shared from anoth)
- C语言中 sscanf 的用法
- Linux内核网络丢包查看工具dropwatch的安装和使用
- iptables 流量速率控制
- 服务器装系统无显示屏,服务器系统安装后没有桌面
- delete什么头文件C语言,C++中new和delete的介绍