DevOps實踐集——應用運維之持續部署

DevOps實踐集——應用運維之持續部署


1. 場景
持續部署:業界沒有統一明確地定義,簡單理解爲將集成結果部署到不同的環境供用戶使用,並且立即反饋部署結果的實踐,其中不同的環境包括:開發環境、測試環境、預發佈環境、生產環境
持續部署兩個核心要素:持續、自動化,自動化是持續的基礎
持續部署的需求場景:
  • 需要頻繁的發佈更新
  • 部署規模較大,人工操作費時費力易出錯
  • 規範化上線部署流程和配置規範
注:此處只討論應用部署,不包括系統部署
2. 實踐

  • 開發提交代碼到Git倉庫
  • 自動或手動觸發持續集成,執行編譯、打包、單元測試、代碼掃描等過程,並構建出可部署的程序文件,上傳測試的SVN庫
  • 測試人員手動觸發Jenkins調用Rundeck從測試的SVN庫中獲取部署文件並部署到測試環境
  • 測試人員進行產品驗證
  • 測試人員在驗證通過後,申請發佈到生產環境,並手動觸發Jenkins,將測試的SVN庫中的部署文件上傳到運維的SVN庫
  • 運維人員觸發Rundeck,從運維的SVN庫中獲取部署文件並更新到生產環境
注:
  • 集羣的部署採用分步更新,先發布到線上集羣裏的某一個節點進行更新測試,測試通過後把這個節點加入集羣,再更新其他節點
  • 發佈成果的版本採用時間戳的形式
3. 工具
3.1 工具箱
  • Jenkins:用作發佈任務的觸發,實現發佈的持續化
  • SVN:發佈成果的版本管理工具,實現發佈內容的可追蹤、易回滾
  • Rundeck:用Java/Grails實現的開源自動化部署工具,幫助用戶在數據中心或者雲環境中自動化各種操作和流程。通過命令行或者web界面,用戶可以對任意數量的服務器進行遠程操作,大大降低了對服務器自動化的門檻。
3.2 Rundeck功能
  • 提供Web界面和命令行來執行shell命令和job
  • 工作流,自定義job步驟
  • 設置shell命令/job運行週期(類似cron table的功能)
  • 用戶權限控制,支持LDAP/ActiveDirectory
  • 保存歷史日誌
  • 提供Web API
通過以上功能,Rundeck可以在任意數量的服務器上批量執行不同的任務,降低對自動化的部署、執行、維護的工作難度。
3.3 Rundeck架構

3.4 Rundeck典型使用場景
  • 標準化服務器操作過程
    通過Rundeck定義日常標準的服務器操作過程,對服務器的操作通過Rundeck進行,便於權限控制、可視化與審計

  • 任務調度
    通過Rundeck實現任務的自動調度
  • 自動化部署
    通過持續集成系統調用Rundeck實現不同環境的自動化部署和部署驗證
  • 自助化測試環境
    通過Rundeck可以爲開發和測試提供自助化的測試環境,很方便基於不同版本的構件進行部署

  • 基於Rundeck的API和插件機制構建運維平臺


3.5 Rundeck安裝配置
1. 安裝
首先確認已經安裝了jdk
  1. <span class="s1" style="font-family: 微軟雅黑; line-height: 1.5;"> rpm -Uvh http://repo.rundeck.org/latest.rpm </span>
  2. <span style="font-family: 微軟雅黑; line-height: 1.5;">yum install rundec</span><span style="font-family: 微軟雅黑; line-height: 1.5; background-color: rgb(255, 255, 255);">k</span>
複製代碼
2.配置
在mysql數據庫創建數據庫rundeck,和對rundeck有所有權限的用戶rundeckuse/rundeckpassword
修改文件/etc/rundeck/rundeck-config.properties文件:
  1. <span style="font-family: 微軟雅黑; line-height: 1.5;"> grails.serverURL=http://該服務器IP地址:4440</span>

  2. <span style="font-family: 微軟雅黑; line-height: 1.5;">dataSource.dbCreate = update</span>

  3. <span style="font-family: 微軟雅黑; line-height: 1.5;">dataSource.url=jdbc:mysql://ip/rundeck?autoReconnect=true&useUnicode=yes&characterEncoding=UTF8</span>

  4. <span style="font-family: 微軟雅黑; line-height: 1.5;">dataSource.username = rundeckuser</span>

  5. <span style="font-family: 微軟雅黑; line-height: 1.5;">dataSource.password = rundeckpass</span><span style="font-family: 微軟雅黑; line-height: 1.5; background-color: rgb(255, 255, 255);">word</span>
複製代碼
啓動rundeck
  1. service rundeck start
複製代碼


4. 效果
  • 提升應用變更效率,包括速率和成功率
  • 實現部署自助化,開發、測試均可完成相應環境的發佈
5. 其他
5.1 自動化部署工具對比
自動化部署工具種類繁多,各有千秋,根據團隊實際需求和工具特性選擇適合當前階段的工具,避免過多追求新特性導致陡峭的學習曲線,避免對當前環境造成過多的侵入,在非生產環境進行充分的驗證。下面就常見的自動化部署工具進行簡單比較:
工具
開發語言
交互方式
支持OS
有無Agent
發佈時間
場景
備註
Puppet
Ruby
Web UI/CLI
Unix/Linux/Windows
2005年
基礎配置文件管理
配套工具:foreman
Chef
Ruby
Web UI/CLI
Unix/Linux/Windows
2009年
基礎配置文件管理

Rundeck
Java
Web UI/CLI
Unix/Linux/Windows
2010年
代碼批量發佈

SaltStack
Python
Web UI/CLI
Unix/Linux/Windows
2011年
基礎配置文件管理

Ansible
Python
Web UI/CLI
Linux/Windows
2012年
基礎配置文件管理和命令批量操作

Puppet:當前的主流工具,重量級,容易上手,擴展性強,但配置複雜,對管理員要求較高,需具備一定編程能力,
Chef:功能和成熟度稍遜於Puppet,重量級,設計原則是基礎設施即代碼,專注連接開發與運維
Rundeck:輕量級,WebUI免費
SaltStack:輕量級,有Agent但不是必須使用,採用ssh協議,Web界面功能稍弱,適合運維人員使用,支持去中心化
Ansible:輕量級,採用ssh協議,WebUI收費,支持YAML/JSON,容易上手,擴展性強,注重運維,支持推拉兩種模式,擅長應用部署,任務編排
服務器規模非常大,影響文件推送或下拉效率,建議參考Twitter的部署工具Murder,其基於BitTorrent技術實現P2P下載,大大提高了文件推送或下拉效率
5.2 Ansible基本介紹
  • 簡介
    Ansible是一款簡單的自動化運維工具,重點解決自動化應用部署、自動化配置管理、自動化雲服務管理。簡單理解Ansible是一款批量的在遠程服務器上執行命令的工具,支持Linux各個發行版和Windows系統。Ansible的兩種使用方式:Ad-hoc和Playbooks。
  • 工作原理
    Ansible會根據命令或者playbook生成shell或者python腳本,並推送到遠程服務器上執行,然後自動刪除shell,和其他自動化部署工具類似,都是批量的在遠程服務器上執行命令。
    Ansible支持Push和Pull兩種模式,Push即由Ansible管理端推送腳本到遠程服務器上執行,Pull則爲遠程服務器主動到Ansible管理端拉取腳本執行。
  • Ansible內部使用手冊
    根據官文檔和實戰案例編寫的內部使用手冊,該手冊會進行持續更新

5.3 其他問題

  • 爲何採用SVN管理上線成果,而不採用Git?
    A:上線成果一般爲二進制文件,使用Git存儲和傳輸時不會壓縮文件,存儲資源消耗大,且SVN使用簡單,適合成果的版本管理
  • Rundeck交流QQ羣:339569912
  • Rundeck官方文檔
  • Puppet適合部署操作系統軟件,中間件等
  • 使用SVN部署時,不使用svn update命令更新代碼,而是使用export方式,避免引入.svn目錄

同學們,歡迎大家留言討論,陸續還有更多的溼貨+乾貨,大家回覆越多,樓主更新越快

想了解更多運維和DevOps的資訊和實踐,關注公衆號


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章