作者简介
裴双才,Geekwolf,现MAKA运维负责人,博客: http://www.simlinux.com 《FastDFS分布式存储实战》作者,《Ansible中文手册》译者。
RHCA/RHCVA,混迹各种开源社区,专注高效运维、DevOps、性能优化、Docker、MySQL等方向,热衷技术分享,欢迎一起讨论技术,互相学习,共同进步。
高效可持续的运维环境需要合理的规范作为支撑:
应用管理规范
权限管理规范
配置变更规范
发布策略规范
日志运维规范
持续集成部署实战(该内容将在后续文章中进行讨论,本次不展开)
可以使用SVN、Git对代码进行版本控制。
举例:
MAKA官网http://www.maka.im
对应的Git仓库Group为official,
按照功能模块分组,商城前端对应的Git仓库Group为store。
项目名命名规范:
全部用小写字母
横杠[-]作为连接字符
命名规则:[产品名称]-[项目类型]-[自定义名称]
举例:
official-store-customer。
常用的 Git 工作流总结如下:
第二种:功能分支工作流, 与上一种不同的地方在于,除了 master 分支以外还有功能分支。日常开发在功能分支,提测集成时提交 Merge Requests(在 Bitbucket 中是 Pull Request)。
举例:third-party-login-feature
发布完成后,release 分支合并进 master 并分配版本号、打tag,用于存放发布历史。
Gitflow 工作流方式适用于大型项目
针对创业公司参与同一个项目的开发者并不多,过于复杂的分支策略并不能带来便利,可以参考 leancloud 的分支模式,根据团队的使用情况进行调整。
日常开发在 userA 分支操作,然后提交 merge requests 请求合并至 master 分支,本地通过 git fetch origin master,然后在 userA 分支 git rebase origin/master 将 master 最新 commit 合并到本地 userA 分支从而形成闭环开发。
三剑客 GitLab + Jenkins + Gerrit。
前端项目 src 为源码目录,dist为前端经过压缩合并等最终生成的代码目录(发布时可忽略src)。
每个项目详细写 README.md 文件,详细说明,各个环境对应的访问路径、目录说明、构建压缩方式,Nginx配置等,代码仓库中包含额外的 test 目录存放测试用例(本着谁开发谁写测试用例的原则);
权限有两类:一个是系统权限(包括服务器登陆,数据库/Redis等),另外一个是服务运行时的权限。
生产数据库及 Redis 禁止了外网访问,分别使用 phpMyAdmin 和 RedisLive 统一访问入口,增加了多主机访问及屏蔽了危险操作如 DDL 数据的导入导出等。也需要先拨入vpn 才能访问。
开发测试环境权限控制相对宽松,DEV Leader 和 QA Leader同时具有开发和测试环境的服务器及数据库权限,便于测试和Debug;
生产环境为了便于开发调试生产代码,且不影响线上,增加了 Staging 节点,未在线,但环境代码及后端均和生产一致;
以 Web 服务为例,Nginx 和 php-fpm 运行用户和用户组为:www-data;代码目录用户为 www。
禁止危险函数 phpinfo exec eval system 等,具体可参考:
http://www.sinacloud.com/doc/sae/php/runtime.html
禁止跨目录访问open_basedir,开启前后的性能对比请参考
http://www.simlinux.com/archives/1531.html
传统IDC机房可以通过定制镜像或者使用 Cobbler 定制安装,运行的服务也可以定制在镜像中,但建议安装系统时注册puppet/salt agent,再自动化部署相关服务。
公有云中可以在服务器上部署相应环境后创建系统快照,制作系统镜像,弹性扩容时可选择该镜像自动化安装。
日常变更包括服务配置的变更和代码配置的变更,这些操作我们是通过 Ansible,相比 puppet/salt 的好处就是简单方便不用装 agent,后面会详细介绍如何基于 Ansible 做发布回滚。变更的内容使用 git 进行版本控制。
注意:以上请根据自己业务做相应调整,避免在业务高峰期发布(除应急bug外)。
我们业务高峰期基本在18:00-23:30,低峰期基本在01:00-06:00。这也是微信分享阅读的高峰和低峰时段。
无论应急Bug还是日常迭代都必须由QA测试通过和产品经理审核通过后才能上线。
血的教训:曾经出现过开发为了修复线上很急的bug,开发修复后自主上线导致生产出现更严重的问题。
无论是自主开发发布系统,亦或是使用开源的系统都要本着解决问题的原则,否则只能是重复造轮子,然并卵呀!
开源的持续集成和发布里面个人觉得比较好的如:Jenkins,Walle,Spinnaker,go,Gitlab-ci,Bamboo(收费)等,其他参考。
https://github.com/geekwolf/sa-scripts/blob/master/devops.md
下面介绍我们基于GitLab + Jenkins + Ansible(Flamingo自动化代码发布工具)实现的自动化代码部署平台,流程如下:
Flamingo
(“火烈鸟”,https://github.com/geekwolf/flamingo)是基于 Ansible 的自动化代码发布工具,目的是实现统一的代码发布方式,思路基于 Capistrano,并对Ansisrano 进行了改造可以通过传入语言环境,主机组(应用组/灰度机组等),项目代码库,分支名称,项目名称等参数来进行自动化打包发布,也可以将Flamingo 工具二次打包使用。
Flamingo 本着回滚即发布的原则,以简化发布流程,回滚时传入要回滚的分支即可,其他参数可参看 defaults/main.yml 进行了解;(注:依赖Git/rsync/ansible)
例子:
ansible-playbook deploy.yml
--extra-vars='flamingo_git_repo=git@github.com:geekwolf/flamingo.git flamingo_product_name=flamingo'
执行后生成的目录结构如下图(目录定义请参考 defaults/main.yml):
毫无疑问,规范的日志对于运维和开发排查问题有非常大的帮助,例如PHP项目日志格式可以规范为时间,日志级别,日志内容(比如对于连接多个DB时出现连接不上或超时应该把实例地址一同写入日志),可以参考psr-3的标准 :
http://www.php-config.org/psr/psr-3
通过ELK将业务日志,PHP自身错误日志/慢日志,Nginx慢日志等进行搜集统计并结合Zabbix实现报警,便于及早发现问题。
以上只是粗略对持续集成和部署过程中遇到的问题进行了总结,并不完美,但对于初创公司应该有些帮助,欢迎一起学习讨论!
来源:本文转自公众号“高效运维”。
GOPS全球运维大会 2019 · 上海站,最想听的专场,你来做主~
第十三届 GOPS 全球运维大会,为期两天,近 20 个专场等你来评选,扫描下方二维码,选出你心仪的专场~
点击阅读原文,查看精彩日程