|
|
|
|
挪动端

超适用:小团队怎样从零搭建一个主动化运维体系?

行业内各巨擘的主动化运维架构都种种功用,种种酷炫,让人可望不行及。

作者:翟志军泉源:showme.codes|2018-06-22 09:49

开辟者盛宴来袭!7月28日51CTO首届开辟者大赛决赛带来技能创新分享

行业内各巨擘的主动化运维架构都种种功用,种种酷炫,让人可望不行及。

如下图,如今行业内各巨擘主动化运维架构的终极样子各人都晓得了,但是怎样依据本人团队以后的状况一步步向这个目的演进?

笔者地点团队,三个半开辟,要维护几十台云呆板,摆设了十来个使用,这些使用 90% 都是遗留零碎。

使用零碎的编译打包根本在顺序员本人的电脑上。分支办理也清一色的 dev 分支开辟,测试经过后,再兼并到 master 分支。

消费情况的使用设置装备摆设要登录上详细的呆板看才晓得,更不必说设置装备摆设中央及设置装备摆设版本化了。对了,连根本的呆板级另外根底监控都没有。

我平常的任务是 50% 业务开辟,50% 运维。面临这么多题目,我就想,怎样在低本钱状况下完成主动化运维。

本文便是总结我在这方面一些经历和理论,盼望对读者有协助。

别语言,先上监控和告警

事变有轻重缓急,监控和告警是我以为一开端就要做的,即便业务开辟被拖慢。只要晓得了以后的状况,你才好做下一步方案。

如今市道市情上监控零碎许多:Zabbix、Open-Falcon、Prometheus,但是终极我选择了 Prometheus。

缘由有如下几点:

  • 它是拉形式的。
  • 它方便运用文本方法来设置装备摆设,有利于设置装备摆设版本化。
  • 插件多,想要监控什么,根本都市有现成的插件。

以上三者,我根本都要重新学,我为什么不学一个 Google SRE 书上引荐的呢?

之前我们曾经引见过,人少呆板多,以是装置 Prometheus 的进程也必需要主动化,同时版本化。我运用的是 Ansible + Git 完成。

终极样子如下:

这里需求复杂引见一下:

  • Prometheus Server 担任监控数据搜集和存储。
  • Prometheus Alert manager 担任依据告警规矩停止告警,可集成许多告警通道。
  • node-exporter[1] 的作用便是从呆板读取目标,然后表露一个 http 效劳,Prometheus 便是从这个效劳中搜集监控目标。固然 Prometheus 官方另有林林总总的 exporter。

运用 Ansible 作为摆设东西的一个益处是太多现成的 role 了,装置 Prometheus 时,我运用的是现成的:prometheus-ansble[2]。

有了监控数据后,我们就可以对数据停止可视化,Grafana 和 Prometheus 集成得十分好,以是我们又摆设了 Grafana:

在 Grafana 上检查 nodex-exporter 搜集的数据的结果图大约如下:

但是,我们不行能 24 小时盯着屏幕看 CPU 负载有没有超吧?这时分就要上告警了,Promehtues 默许集成了 N 多告警渠道,惋惜没有集成钉钉。

但也没有干系,有好意的同窗开源了钉钉集成 Prometheus 告警的组件:prometheus-webhook-dingtalk[3]。

接着,我们告警也上了:

完成以上任务后,我们根底监控的架子就完成了,这为我们前期上 Redis 监控、JVM 监控等更下层的监控做好了预备。

设置装备摆设版本化要从娃娃抓起

在搭建监控零碎的进程中,我们曾经将设置装备摆设抽离出来,放到一个独自的代码堆栈停止办理。当前一切摆设,我们都市将设置装备摆设和摆设逻辑别离。

关于怎样运用 Ansible 停止设置装备摆设办理,可以参考这篇文章:How to Manage Multistage Environments with Ansible[4] 。

我们便是运用这种方法来构造情况变量的。

  1. ├── environments/         # Parent directory for our environment-specific directories 
  2. │   │ 
  3. │   ├── dev/              # Contains all files specific to the dev environment 
  4. │   │   ├── group_vars/   # dev specific group_vars files 
  5. │   │   │   ├── all 
  6. │   │   │   ├── db 
  7. │   │   │   └── web 
  8. │   │   └── hosts         # Contains only the hosts in the dev environment 
  9. │   │ 
  10. │   ├── prod/             # Contains all files specific to the prod environment 
  11. │   │   ├── group_vars/   # prod specific group_vars files 
  12. │   │   │   ├── all 
  13. │   │   │   ├── db 
  14. │   │   │   └── web 
  15. │   │   └── hosts         # Contains only the hosts in the prod environment 
  16. │   │ 
  17. │   └── stage/            # Contains all files specific to the stage environment 
  18. │       ├── group_vars/   # stage specific group_vars files 
  19. │       │   ├── all 
  20. │       │   ├── db 
  21. │       │   └── web 
  22. │       └── hosts         # Contains only the hosts in the stage environment 
  23. │ 

现阶段,我们一切的设置装备摆设都以文本的方法存储,未来要切换成运用 Consul 做设置装备摆设中央,也十分的方便,由于 Ansible 2.0 以上的版本曾经原生集成了Consul:consul_module[5]。

Tips:Ansible 的设置装备摆设变量是有条理的,这为我们的设置装备摆设办理提供了十分大的灵敏性。

Jenkins 化:将打包交给 Jenkins

我们要将一切项目标打包任务交给 Jenkins。固然,理想中我们是先将一些项目放到 Jenkins 上打包,然后逐渐将项目放上 Jenkins。

起首我们要有 Jenkins,搭建 Jenkins 异样有现成的 Ansible 剧本:ansible-role-jenkins[6]。

留意了,在网上看到的大多文章通知你 Jenkins 都是需求手工装置插件的,而我们运用的这个 ansible-role-jenkins 完成了主动装置插件,你只需求加一个设置装备摆设变量 jenkins_plugins 就可以了。

官方例子如下:

  1. --- 
  2. - hosts: all 
  3.   vars: 
  4.     jenkins_plugins: 
  5.       - blueocean 
  6.       - ghprb 
  7.       - greenballs 
  8.       - workflow-aggregator 
  9.     jenkins_plugin_timeout: 120 
  10.   pre_tasks: 
  11.     - include_tasks: java-8.yml 
  12.   roles: 
  13.     - geerlingguy.java 
  14.     - ansible-role-jenkins 

搭建好 Jenkins 后,就要集成 Gitlab 了。我们原来就有 Gitlab ,以是不需求重新搭建。

终极 Jenkins 搭建成以下这个样子:

关于 Jenkins master 与 Jenkins agent 的衔接方法,由于网络情况各不相反,网上也有许多种方法,各人自行选择合适的方法。

如今我们需求通知 Jenkins 怎样对我们的业务代码停止编译打包,有两种办法:

界面上设置

  • 运用 Jenkinsfile:相似于 Dockerfile 的一种文本文件,详细引见:Using a Jenkinsfile[7]
  • 我绝不犹疑地选择了第二种,由于一是利于版本化;二是灵敏。

Jenkinsfile 相似如许:

  1. pipeline { 
  2.     agent any 
  3.     stages { 
  4.         stage('Build') { 
  5.             steps { 
  6.                 sh './gradlew clean build' 
  7.                 archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true 
  8.             } 
  9.         } 
  10.     } 

那么 Jenkinsfile 放那边呢?答案是和业务代码放在一同,相似如许每个工程各自办理本人的 Jenkinsfile:

这时,我们就可以在 Jenkins 上创立一个 pipleline Job了。关于分支办理,我们人少,以是,发起一切项目一致在 master 分支停止开辟并公布。

让 Jenkins 协助我们实行 Ansible

之前我们都是在顺序员的电脑实行 Ansible 的,如今我们要把这项任务交给 Jenkins。

详细操纵:

  • 在 Jenkins 装置 Ansible 插件[8]
  • 在 Jenkinsfile 中实行
  1. withCredentials([sshUserPrivateKey(keyFileVariable:"deploy_private",credentialsId:"deploy"),file(credentialsId: 'vault_password', variable: 'vault_password')]) { 
  2.              ansiblePlaybook vaultCredentialsId: 'vault_password', inventory: "environments/prod", playbook: "playbook.yaml"
  3.              extraVars:[ 
  4.                ansible_ssh_private_key_file: [value: "${deploy_private}", hidden: true], 
  5.                build_number: [value: "${params.build_number}", hidden: false
  6.              ] 

这里需求表明下:

  • ansiblePlaybook 是 Jenkins ansible 插件提供的 pipeline 语法,相似手工实行:ansible-playbook 。
  • withCredentials 是 Credentials Binding[9] 插件的语法,用于援用一些敏感信息,比方实行 Ansible 时需求的 ssh key 及 Ansible Vault 暗码。
  • 一些敏感设置装备摆设变量,我们运用 Ansible Vault[10] 技能加密。

Ansible 剧本应该放哪?

我们曾经晓得各个项目各自傲责本人的主动化构建,以是 Jenkinfile 就放到各自项目中。

那项目标摆设呢?异样的原理,我们以为也应该由各个项目自行担任,以是我们的每个要停止摆设的项面前目今都市有一个 Ansible 目次,用于寄存 Ansible 剧本。

相似如许:

但是,怎样用呢?我们会在打包阶段将 Ansible 目次停止 zip 打包,到真正摆设时,再解压实行外面的 playbook。

疾速为一切的项陌生成 Ansible 剧本及Jenkinsfile

下面,我们将一个项目停止 Jenkins 化和 Ansible 化,但是我们另有许多项目需求停止异样的举措。

思索到这是膂力活,并且当前我们还会常常做如许事,以是我决议运用 cookiecutter[11] 技能主动天生 Jenkinsfile 及 Ansible 剧本,创立一个项目,像如许:

小结

总结上去,我们小团队的主动化运维施行的次序大约为:

  • 上根底监控
  • 上 Gitlab
  • 上 Jenkins,并集成 Gitlab
  • 运用 Jenkins 完成主动编译打包
  • 运用 Jenkins 实行 Ansible

以上只是一个架子,基于这个“架子”,就可以向那些大厂矮小上的架构停止演进了,比方:

  • CMDB 的建立:我们运用 ansible-cmdb[12] 依据 inventory 主动天生以后一切呆板的状况。
  • 公布办理:Jenkins 上可以对公布的每个阶段停止定制。蓝绿公布等公布方法可以经过修正 Ansible 剧本和 Inventory 完成。
  • 主动扩缩容:经过设置装备摆设 Prometheus 告警规矩,挪用相应 webhook 就可以完成。
  • ChatOps:ChatOps 实战[13]。

以上便是我关于主动化运维的一些理论,但是还在演进的路上,盼望能与各人交换。

相干链接:

  • [1]https://github.com/prometheus/node_exporter
  • [2]https://github.com/ernestas-poskus/ansible-prometheus
  • [3]https://github.com/timonwong/prometheus-webhook-dingtalk
  • [4]https://www.digitalocean.com/community/tutorials/how-to-manage-multistage-environments-with-ansible
  • [5]http://docs.ansible.com/ansible/latest/modules/consul_module.html
  • [6]https://github.com/geerlingguy/ansible-role-jenkins
  • [7]https://jenkins.io/doc/book/pipeline/jenkinsfile/
  • [8]https://wiki.jenkins.io/display/JENKINS/Ansible+Plugin
  • [9]https://jenkins.io/doc/pipeline/steps/credentials-binding/
  • [10]http://docs.ansible.com/ansible/2.5/user_guide/vault.html
  • [11]https://github.com/audreyr/cookiecutter
  • [12]https://github.com/fboender/ansible-cmdb
  • [13]https://showme.codes/2017-10-08/chatops-in-action/

【编辑引荐】

  1. 运维不背锅!继续两年纪据库“0毛病”的运维优化之道
  2. 女生适不合适进入IT行业做通博8888官网运维工程师?
  3. 逼格高又适用的通博8888官网初级下令,开辟运维都要懂
  4. 运维的实质是什么?阿里“无人化”智能运维平台的演进
  5. 京东物流仓储零碎在618大促保证面前的这6条运维法门
【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0
分享:
各人都在看
猜你喜好

读 书 +更多

JAVA并发编程理论

本书既可以成为读者的实际支持,又可以作为构建牢靠的、可伸缩的、可维护的并发顺序的技能支持。本书并不只仅提供并发API的清单及其机制,...

订阅51CTO邮刊

点击这里检查样刊

订阅51CTO邮刊