iT邦幫忙

2025 iThome 鐵人賽

DAY 28
0
DevOps

不爆肝學習 Ansible 的短暫30天系列 第 28

Day28 - Ansible 技巧與最佳實務分享

  • 分享至 

  • xImage
  •  

今日目標

  • 掌握 Ansible 的進階應用技巧與優化方法
  • 了解大型專案和團隊協作的最佳實務
  • 學會提升 Ansible 使用效率的實戰策略
  • 為複雜環境的自動化管理做好準備

從個人工具到企業級解決方案

經過前面 27 天的學習,大家應該已經能夠熟練使用 Ansible 處理日常的自動化任務了。但在實際工作中,我們往往會遇到更複雜的挑戰
個人使用階段的特點:

  • 管理幾台到十幾台機器
  • Playbook 相對簡單,邏輯清晰
  • 一個人維護,不太需要考慮協作問題

團隊協作階段的挑戰:

  • 管理數百台甚至數千台機器
  • 多個環境 (開發、測試、生產)需要統一管理
  • 多人同時維護 Playbook,需要標準化和規範
  • 需要考慮權限控制、安全性、可審計性

今天我們就來討論如何從「能用」提升到「好用」、「團隊用」的層次。

進階變數處理的藝術

變數結構設計的哲學

在複雜的環境中,變數不再是簡單的 key-value 對,而是需要精心設計的數據結構。一個好的變數設計應該具備:

層次性:從全域到特定,從通用到專屬

# 推薦的層次結構
app:
  name: myapp
  version: "1.2.3"
  config:
    database:
      host: "{{ database_host }}"
      port: 5432
    cache:
      enabled: true
      ttl: 3600

可擴展性:新增功能時不需要重寫現有變數

  • 使用字典結構而非平面化變數
  • 預留擴展空間,避免硬編碼
  • 考慮向後兼容性

語義化:變數名稱要能表達其用途和範圍

  • 使用有意義的前綴:app_, db_, cache_
  • 環境相關的變數要明確標示:prod_, dev_
  • 避免縮寫,優先選擇完整的單詞

變數優先順序的實戰應用

理解變數優先順序不只是背誦順序,更重要的是知道在什麼情況下使用哪一層:

defaults/main.yml:設定合理的預設值

  • 適合放置大多數情況下都適用的配置
  • 提供後備選項,確保 Playbook 不會因為缺少變數而失敗

group_vars/:環境和角色的差異化配置

  • group_vars/all.yml:所有機器的共同配置
  • group_vars/production.yml:生產環境特定配置
  • group_vars/webservers.yml:Web 伺服器特定配置

host_vars/:個別機器的特殊需求

  • 只在該機器確實有特殊需求時才使用
  • 避免濫用,否則會導致管理困難

命令列 -e:臨時覆蓋和測試

  • 適合測試不同的配置值
  • 緊急情況下的快速調整

動態 Inventory 的實戰策略

什麼時候需要動態 Inventory

靜態 Inventory 的限制

  • 雲端環境中機器 IP 經常變動
  • 自動擴展的環境無法預先定義所有機器
  • 不同時間點的機器清單可能不同

動態 Inventory 的優勢

  • 即時獲取最新的機器資訊
  • 自動發現新加入的機器
  • 根據標籤和屬性自動分組

實務選擇建議

雲端服務整合

  • AWS EC2:使用 aws_ec2 插件
  • Azure:使用 azure_rm 插件
  • GCP:使用 gcp_compute 插件
  • 根據雲端服務的標籤自動分組

自建環境的解決方案

  • CMDB 整合:從配置管理資料庫獲取資訊
  • 監控系統整合:從 Prometheus、Zabbix 等獲取主機列表
  • 自定義腳本:根據具體需求編寫動態 Inventory 腳本

混合環境的策略

  • 將靜態和動態 Inventory 結合使用
  • 使用 inventory 目錄包含多個來源
  • 建立統一的分組和變數管理策略

舉個例子:大型電商平台的 Ansible 架構

讓我們看看一個處理雙十一流量的電商平台如何使用 Ansible:

環境架構概況

這個平台需要管理:

  • 300+ 台 Web 伺服器(跨多個可用區)
  • 50+ 台資料庫伺服器(主從架構)
  • 100+ 台快取伺服器(Redis 集群)
  • 20+ 台消息佇列伺服器
  • 多個環境:開發、測試、預生產、生產

變數組織策略

# group_vars/all.yml - 全域配置
company:
  name: "ecommerce-platform"
  timezone: "Asia/Taipei"
  log_level: "INFO"

# group_vars/production.yml - 生產環境
environment: "production"
monitoring:
  enabled: true
  retention_days: 90
security:
  strict_mode: true

分層管理思路

基礎設施層:使用動態 Inventory 自動發現機器

  • 從雲端 API 獲取機器清單
  • 根據標籤自動分組 (web、db、cache)
  • 自動處理機器的增減

應用層:按服務和環境組織

  • 每個微服務有獨立的 Role
  • 統一的部署和回滾流程
  • 版本管理和相依性處理

配置層:集中管理但允許客製化

  • 共用配置放在 group_vars/all.yml
  • 環境特定配置分別管理
  • 敏感資訊使用 Vault 加密

效能調優的進階策略

大規模部署的技巧

分批處理策略

  • 使用 serial 控制同時部署的機器數量
  • 根據業務重要性調整部署順序
  • 設定合理的失敗閾值

並行處理優化

  • 調整 forks 參數適應網路環境
  • 使用 strategy: free 讓機器獨立執行
  • 合理使用 async 處理耗時任務

網路和連線優化

SSH 連線優化

  • 啟用 SSH 多路復用 (ControlMaster)
  • 調整 SSH 超時設定
  • 使用 SSH 金鑰而非密碼認證

Facts 收集優化

  • 只收集必要的 Facts
  • 使用 Facts 快取減少重複收集
  • 考慮關閉 Facts 收集改用 setup 模組

任務執行優化

  • 合併相似的任務減少 SSH 連線次數
  • 使用 changed_whenfailed_when 精確控制狀態
  • 善用 createsremoves 參數避免不必要的執行

團隊協作的最佳實務

程式碼組織和版控策略

目錄結構標準化
建立團隊統一的目錄結構,讓每個人都能快速找到需要的檔案:

  • 明確的 roles/ 目錄結構
  • 統一的 inventories/ 管理方式
  • 清楚的 playbooks/ 命名規則

Git 工作流程

  • 主要分支保護:禁止直接推送到 main 分支
  • 功能分支開發:每個新功能或修復使用獨立分支
  • 程式碼審查機制:重要變更需要同僚審查
  • 自動化測試:整合 CI/CD 進行語法檢查和測試

角色權限和安全管理

分層權限設計

  • 開發者:可以修改開發環境的配置
  • 運維工程師:可以部署到測試和生產環境
  • 架構師:可以修改基礎架構和全域配置
  • 安全管理員:管理 Vault 密碼和敏感資訊

Vault 金鑰管理

  • 不同環境使用不同的 Vault 密碼
  • 定期輪換 Vault 密碼
  • 使用外部金鑰管理服務 (如 HashiCorp Vault、AWS KMS)
  • 建立金鑰存取的審計機制

文檔和知識分享

Playbook 文檔化
每個 Playbook 和 Role 都應該包含:

  • 用途說明和使用場景
  • 必要的變數和其預設值
  • 執行前提和相依性
  • 常見問題和解決方法

操作手冊維護

  • 部署流程的標準操作程序
  • 緊急狀況的處理步驟
  • 各環境的連線和存取資訊
  • 監控和告警的處理指南

知識傳承機制

  • 定期的技術分享會
  • 新人 Onboarding 指南
  • 最佳實務案例收集
  • 錯誤案例和教訓總結

持續改進的文化

監控和指標

執行效率監控

  • 追蹤 Playbook 執行時間
  • 監控失敗率和成功率
  • 分析瓶頸任務和優化機會

業務影響追蹤

  • 部署頻率和品質提升
  • 故障恢復時間縮短
  • 團隊生產力提升

自動化程度評估

定期評估哪些手工作業可以進一步自動化:

  • 重複性高的操作
  • 容易出錯的步驟
  • 耗時較長的流程
  • 需要多人協調的任務

技術債務管理

識別技術債務

  • 過時的 Playbook 和 Role
  • 重複的程式碼和邏輯
  • 硬編碼的配置和路徑
  • 缺乏測試的關鍵流程

償還策略

  • 制定技術債務清理計劃
  • 在新功能開發中順帶重構
  • 定期的程式碼審查和清理
  • 技術升級和工具更新

工具生態整合

與其他工具的協作

CI/CD 整合

  • Jenkins、GitLab CI、GitHub Actions
  • 自動觸發部署流程
  • 測試環境的自動化管理

監控系統整合

  • 部署完成後的健康檢查
  • 服務狀態的自動驗證
  • 告警和通知機制

配置管理整合

  • 與 Terraform 的協作分工
  • 與 Kubernetes 的補充關係
  • 與傳統配置管理工具的遷移策略

作業練習時間

練習一:變數架構設計

設計一個複雜應用的變數結構,包含:

  1. 至少三個環境的差異化配置
  2. 多層次的變數組織
  3. 敏感資訊的處理方式

練習二:效能優化實驗

在你的環境中測試:

  1. 不同 forks 設定對執行時間的影響
  2. Facts 快取的效果比較
  3. SSH 連線優化的實際效益

練習三:團隊協作模擬

建立一個小型的團隊協作環境:

  1. 設計合理的目錄結構和命名規則
  2. 建立程式碼審查的流程
  3. 撰寫操作文檔和最佳實務指南

明日預告

明天我們將進入倒數第二天,學習如何將前面所有的知識整合在一起!


上一篇
Day27 - Ansible 的安全強化與法規遵循
下一篇
Day29 - 來聊聊這 29 天 Ansible 的實戰心得
系列文
不爆肝學習 Ansible 的短暫30天30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言