NO IMAGE

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的資訊和實踐,關注公眾號