摘要:行業(yè)內(nèi)各巨頭的自動化運維架構(gòu)都各種功能各種酷炫,如下圖,讓人可望不可及。面對這么多問題,我就想啊,如何在低成本情況下實現(xiàn)自動化運維。自動擴(kuò)縮容通過配置告警規(guī)則,調(diào)用相應(yīng)就可以實現(xiàn)實戰(zhàn)以上就是筆者關(guān)于自動化運維的一些實踐。
行業(yè)內(nèi)各巨頭的自動化運維架構(gòu)都各種功能各種酷炫,如下圖,讓人可望不可及。現(xiàn)在最終的樣子大家都知道了,但問題是如何根據(jù)自己團(tuán)隊當(dāng)前的情況一步步向那個目標(biāo)演進(jìn)?
筆者所在團(tuán)隊,三個半開發(fā),要維護(hù)幾十臺云機(jī)器,部署了十來個應(yīng)用,這些應(yīng)用 90% 都是遺留系統(tǒng)。應(yīng)用系統(tǒng)的編譯打包基本在程序員自己的電腦上。分支管理也清一色的 dev 分支開發(fā),測試通過后,再合并到 master 分支。生產(chǎn)環(huán)境的應(yīng)用配置要登錄上具體的機(jī)器看才知道,更不用說配置中心及配置版本化了。
對了,連基本的機(jī)器級別的基礎(chǔ)監(jiān)控都沒有。
我平時的工作是 50% 業(yè)務(wù)開發(fā),50% 運維。面對這么多問題,我就想啊,如何在低成本情況下實現(xiàn)自動化運維。本文就是總結(jié)我在這方面一些經(jīng)驗和實踐。希望對讀者有幫助。
別說話,先上監(jiān)控和告警
事情有輕重緩急,監(jiān)控和告警是我覺得一開始就要做的,即使業(yè)務(wù)開發(fā)被拖慢。只有知道了當(dāng)前的情況,你才好做下一步計劃。
現(xiàn)在市面上監(jiān)控系統(tǒng)很多:Zabbix、Open-Falcon、Prometheus。最終作者選擇了 Prometheus。因為:
它是拉模式的
它方便使用文本方式來配置,有利于配置版本化
插件太多了,想要監(jiān)控什么,基本都會有現(xiàn)成的
以上三者,我基本都要重新學(xué),我為什么不學(xué)一個 Google SRE 書上推薦的呢?
之前我們已經(jīng)介紹過,人少機(jī)器多,所以,安裝 Prometheus 的過程也必須要自動化,同時版本化。筆者使用的是 Ansible + Git 實現(xiàn)。最終樣子如下:
這里需要簡單介紹一下:
Prometheus Server 負(fù)責(zé)監(jiān)控數(shù)據(jù)收集和存儲
Prometheus Alert manager 負(fù)責(zé)根據(jù)告警規(guī)則進(jìn)行告警,可集成很多告警通道
node-exporter[1] 的作用就是從機(jī)器讀取指標(biāo),然后暴露一個 http 服務(wù),Prometheus 就是從這個服務(wù)中收集監(jiān)控指標(biāo)。當(dāng)然 Prometheus 官方還有各種各樣的 exporter。
使用 Ansible 作為部署工具的一個好處是太多現(xiàn)成的 role 了,安裝Prometheus 時,我使用的是現(xiàn)成的:prometheus-ansble[2]。
有了監(jiān)控數(shù)據(jù)后,我們就可以對數(shù)據(jù)進(jìn)行可視化,Grafana 和 Prometheus 集成得非常好,所以,我們又部署了 Grafana:
在 Grafana 上查看 nodex-exporter 收集的數(shù)據(jù)的效果圖大概如下:?
可是,我們不可能24小時盯著屏幕看CPU負(fù)載有沒有超吧?這時候就要上告警了,Promehtues 默認(rèn)集成了 N 多告警渠道。可惜沒有集成釘釘。但也沒有關(guān)系,有好心的同學(xué)開源了釘釘集成 Prometheus 告警的組件:prometheus-webhook-dingtalk[3]。接著,我們告警也上了:
完成以上工作后,我們的基礎(chǔ)監(jiān)控的架子就完成了。為我們后期上 Redis 監(jiān)控、JVM 監(jiān)控等更上層的監(jiān)控做好了準(zhǔn)備。
配置版本化要從娃娃抓起
在搭建監(jiān)控系統(tǒng)的過程中,我們已經(jīng)將配置抽離出來,放到一個多帶帶的代碼倉庫進(jìn)行管理。以后所有部署,我們都會將配置和部署邏輯分離。
關(guān)于如何使用 Ansible 進(jìn)行配置管理,可以參考這篇文章:How to Manage Multistage Environments with Ansible[4] 。我們就是使用這種方式來組織環(huán)境變量的。
├── environments/ ? ? ? ? # Parent directory for our environment-specific directories
│ ? │
│ ? ├── dev/ ? ? ? ? ? ? ?# Contains all files specific to the dev environment
│ ? │ ? ├── group_vars/ ? # dev specific group_vars files
│ ? │ ? │ ? ├── all
│ ? │ ? │ ? ├── db
│ ? │ ? │ ? └── web
│ ? │ ? └── hosts ? ? ? ? # Contains only the hosts in the dev environment
│ ? │
│ ? ├── prod/ ? ? ? ? ? ? # Contains all files specific to the prod environment
│ ? │ ? ├── group_vars/ ? # prod specific group_vars files
│ ? │ ? │ ? ├── all
│ ? │ ? │ ? ├── db
│ ? │ ? │ ? └── web
│ ? │ ? └── hosts ? ? ? ? # Contains only the hosts in the prod environment
│ ? │
│ ? └── stage/ ? ? ? ? ? ?# Contains all files specific to the stage environment
│ ? ? ? ├── group_vars/ ? # stage specific group_vars files
│ ? ? ? │ ? ├── all
│ ? ? ? │ ? ├── db
│ ? ? ? │ ? └── web
│ ? ? ? └── hosts ? ? ? ? # Contains only the hosts in the stage environment
│
現(xiàn)階段,我們所有的配置都以文本的方式存儲,將來要切換成使用 Consul 做配置中心,也非常的方便,因為 Ansible 2.0 以上的版本已經(jīng)原生集成了Consule:consul_module[5]。
Tips:Ansible 的配置變量是有層次的,這為我們的配置管理提供了非常大的靈活性。
Jenkins 化:將打包交給 Jenkins
我們要將所有的項目的打包工作交給 Jenkins。當(dāng)然,現(xiàn)實中我們是先將一些項目放到 Jenkins 上打包,逐步將項目放上 Jenkins。
首先我們要有 Jenkins。搭建 Jenkins 同樣有現(xiàn)成的 Ansible 腳本:ansible-role-jenkins[6]。注意了,在網(wǎng)上看到的大多文章告訴你 Jenkins 都是需要手工安裝插件的,而我們使用的這個 ansible-role-jenkins 實現(xiàn)了自動安裝插件,你只需要加一個配置變量 jenkins_plugins 就可以了,官方例子如下:
---
- hosts: all
? vars:
? ? jenkins_plugins:
? ? ? - blueocean
? ? ? - ghprb
? ? ? - greenballs
? ? ? - workflow-aggregator
? ? jenkins_plugin_timeout: 120
? pre_tasks:
? ? - include_tasks: Java-8.yml
? roles:
? ? - geerlingguy.java
? ? - ansible-role-jenkins
搭建好 Jenkins 后,就要集成 Gitlab 了。我們原來就有Gitlab了,所以,不需要重新搭建。如何集成就不細(xì)表了,網(wǎng)絡(luò)上已經(jīng)很多文章。
最終 Jenkins 搭建成以下這個樣子:
關(guān)于 Jenkins master 與 Jenkins agent 的連接方式,由于網(wǎng)絡(luò)環(huán)境各不相同,網(wǎng)上也有很多種方式,大家自行選擇適合的方式。
好,現(xiàn)在我們需要告訴 Jenkins 如何對我們的業(yè)務(wù)代碼進(jìn)行編譯打包。有兩種方法:
界面上設(shè)置
使用 Jenkinsfile:類似于 Dockerfile 的一種文本文件,具體介紹:Using a Jenkinsfile[7]
作者毫不猶豫地選擇了第2種,因為一是利于版本化;二是靈活。
Jenkinsfile 類似這樣:
pipeline {
? ? agent any
? ? stages {
? ? ? ? stage("Build") {
? ? ? ? ? ? steps {
? ? ? ? ? ? ? ? sh "./gradlew clean build"
? ? ? ? ? ? ? ? archiveArtifacts artifacts: "**/target/*.jar", fingerprint: true
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
那么 Jenkinsfile 放哪里呢?和業(yè)務(wù)代碼放在一起,類似這樣每個工程各自管理自己的 Jenkinsfile:
這時,我們就可以在 Jenkins 上創(chuàng)建一個 pipleline Job了:
關(guān)于分支管理,我們?nèi)松伲裕ㄗh所有項目統(tǒng)一在 master 分支進(jìn)行開發(fā)并發(fā)布。
讓 Jenkins 幫助我們執(zhí)行 Ansible
之前我們都是在程序員的電腦執(zhí)行 Ansible 的,現(xiàn)在我們要把這項工作交給 Jenkins。具體操作:
在 Jenkins 安裝 Ansible 插件[8]
在 Jenkinsfile 中執(zhí)行
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 語法,類似手工執(zhí)行:ansible-playbook 。
withCredentials 是 Credentials Binding[9] 插件的語法,用于引用一些敏感信息,比如執(zhí)行 Ansible 時需要的 ssh key 及 Ansible Vault 密碼。
一些敏感配置變量,我們使用 Ansible Vault[10] 技術(shù)加密。
Ansible 腳本應(yīng)該放哪?
我們已經(jīng)知道各個項目各自負(fù)責(zé)自己的自動化構(gòu)建,所以,Jenkinfile 就放到各自項目中。那項目的部署呢?同樣的道理,我們覺得也應(yīng)該由各個項目自行負(fù)責(zé),所以,我們的每個要進(jìn)行部署的項目下都會有一個 ansible 目錄,用于存放 Ansible 腳本。類似這樣:
但是,怎么用呢?我們會在打包階段將 Ansible 目錄進(jìn)行 zip 打包。真正部署時,再解壓執(zhí)行里面的 playbook。
快速為所有的項目生成 Ansible 腳本及Jenkinsfile
上面,我們將一個項目進(jìn)行 Jenkins 化和 Ansible 化,但是我們還有很多項目需要進(jìn)行同樣的動作。考慮到這是體力活,而且以后我們還會經(jīng)常做這樣事,所以筆者決定使用 cookiecutter[11] 技術(shù)自動生成 Jenkinsfile 及 Ansible 腳本,創(chuàng)建一個項目,像這樣:
小結(jié)
總結(jié)下來,我們小團(tuán)隊的自動化運維實施的順序大概為:
上基礎(chǔ)監(jiān)控
上 Gitlab
上 Jenkins,并集成 Gitlab
使用 Jenkins 實現(xiàn)自動編譯打包
使用 Jenkins 執(zhí)行 Ansible
以上只是一個架子,基于這個“架子”,就可以向那些大廠的高大上的架構(gòu)進(jìn)行演進(jìn)了。比如:
CMDB的建設(shè):我們使用 ansible-cmdb[12] 根據(jù) inventory 自動生成當(dāng)前所有機(jī)器的情況
發(fā)布管理:Jenkins 上可以對發(fā)布的每個階段進(jìn)行定制。藍(lán)綠發(fā)布等發(fā)布方式可以使用通過修改 Ansible 腳本和 Inventory 實現(xiàn)。
自動擴(kuò)縮容:通過配置 Prometheus 告警規(guī)則,調(diào)用相應(yīng) webhook 就可以實現(xiàn)
ChatOps:ChatOps實戰(zhàn)[13]
以上就是筆者關(guān)于自動化運維的一些實踐。還在演進(jìn)路上。希望能與大家交流。
相關(guān)鏈接:
https://github.com/prometheus/node_exporter
https://github.com/ernestas-poskus/ansible-prometheus
https://github.com/timonwong/prometheus-webhook-dingtalk
https://www.digitalocean.com/community/tutorials/how-to-manage-multistage-environments-with-ansible
http://docs.ansible.com/ansible/latest/modules/consul_module.html
https://github.com/geerlingguy/ansible-role-jenkins
https://jenkins.io/doc/book/pipeline/jenkinsfile/
https://wiki.jenkins.io/display/JENKINS/Ansible+Plugin
https://jenkins.io/doc/pipeline/steps/credentials-binding/
http://docs.ansible.com/ansible/2.5/user_guide/vault.html
https://github.com/audreyr/cookiecutter
https://github.com/fboender/ansible-cmdb
https://showme.codes/2017-10-08/chatops-in-action/
原文鏈接:http://showme.codes/2018-06-07/devops-in-action/
歡迎加入本站公開興趣群軟件開發(fā)技術(shù)群
興趣范圍包括:Java,C/C++,Python,PHP,Ruby,shell等各種語言開發(fā)經(jīng)驗交流,各種框架使用,外包項目機(jī)會,學(xué)習(xí)、培訓(xùn)、跳槽等交流
QQ群:26931708
Hadoop源代碼研究群
興趣范圍包括:Hadoop源代碼解讀,改進(jìn),優(yōu)化,分布式系統(tǒng)場景定制,與Hadoop有關(guān)的各種開源項目,總之就是玩轉(zhuǎn)Hadoop
QQ群:288410967?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/3951.html
摘要:北京時間月日月日,由和中國國際人才交流基金會聯(lián)合主辦的第七屆全球軟件案例研究峰會簡稱在北京國家會議中心圓滿落幕。本屆峰會,來自阿里美團(tuán)百度平安銀行等企業(yè)的講師分別從企業(yè)轉(zhuǎn)型及研發(fā)效能方面分享敏捷和的實踐細(xì)節(jié)和操作經(jīng)驗。 北京時間11月30日-12月3日,由msup和中國國際人才交流基金會聯(lián)合主辦的第七屆全球軟件案例研究峰會(簡稱:TOP100summit)在北京國家會議中心圓滿落幕。T...
摘要:用云效首先可以獲得研發(fā)模式的標(biāo)準(zhǔn)化,我們將其命名為,這是目前應(yīng)用最廣最適合阿里巴巴的分支管理模式,不但具有高度自由,快速迭代的特性,還可以與流水線結(jié)合,讓整個公司具有統(tǒng)一的軟件交付規(guī)范。最終避免了的發(fā)布故障。 在2018第二屆研發(fā)效能嘉年華上,阿里巴巴云效技術(shù)專家崔力強(qiáng)帶來了如何做到高效軟件交付的精彩演講,首先介紹了阿里巴巴在近幾年在交付平臺上的技術(shù)經(jīng)驗,以及目前云上工具平臺交易的趨勢...
摘要:此文已由作者林帆授權(quán)網(wǎng)易云社區(qū)發(fā)布。好在問題發(fā)生在工作時間,被及時發(fā)現(xiàn),沒有導(dǎo)致什么損失。此外,服務(wù)的安全性也逐漸需要提上日程。這種應(yīng)用與云高度融合的實踐算得上是的一種終極形態(tài)。 此文已由作者林帆授權(quán)網(wǎng)易云社區(qū)發(fā)布。 歡迎訪問網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運營經(jīng)驗。 序文伴隨著IaaS、PaaS等云端基礎(chǔ)設(shè)施技術(shù)的成熟,應(yīng)用上云成為許多企業(yè)軟件部門的心頭大事。通過把傳統(tǒng)軟件系統(tǒng)搬到云...
閱讀 2080·2021-09-29 09:35
閱讀 686·2021-09-08 09:36
閱讀 3393·2021-09-03 10:30
閱讀 2111·2019-08-30 14:21
閱讀 2910·2019-08-30 11:18
閱讀 3311·2019-08-29 17:31
閱讀 3141·2019-08-29 17:29
閱讀 1308·2019-08-29 17:13