一千萬個為什麽

搜索

如何構建DevOps相關代碼並在代碼庫中進行配置?



我們一直在成長為一家公司,我們的產品在不斷擴大,我們的DevOps相關活動和努力也在不斷增長 - 我們已經使用部署管道和其他插件從Bamboo轉變為更靈活和可配置的Jenkins。切換到Ansible並開始在內部使用Docker。

所有這些都需要一定程度的編碼或配置 - Ansible腳本和配置,Jenkins groovy腳本,Dockerfiles和YAML配置。

目前,我們已經為 jenkinsansibledockerother創建了一個單獨的“ops” (這是一個糟糕的名字,但現在所有“其他”DevOps自動化的東西都在那裏)。

我們的方法感覺不正確,可能無法擴展,但將DevOps相關代碼保存在代碼庫或存儲庫中的最佳實踐和建議是什麽?

轉載註明原文: 如何構建DevOps相關代碼並在代碼庫中進行配置?

一共有 4 個回答:

我可以回答bout docker,使用docker的最佳實踐之一是將docker文件和compose文件保存在項目的同一個存儲庫中,因此,無論您在何處克隆項目,都可以構建Docker鏡像,這對於例如保留多個版本的docker撰寫文件(prod,staging,dev),以便您可以構建映像並為每個env運行具有特定選項的容器,例如,可以使用特定網絡並運行更多依賴性容器或任何其他設備。

每個工具的代碼進入它自己的回購。例如,

  1. Jenkins Groovy模板進入Jenkins回購
  2. Ansible YAML劇本本身的回購(包括角色,任務,庫存子目錄
  3. 自己的倉庫中的Cloudformation/Terrform模板
  4. 自己的Docker文件 5 ..等等

這將有助於您在流程編排和每個環境的各個分支機構方面更好地擴展

這將為您提供更細化的控制,並將所有版本開銷卸載到版本控制系統。還為每個環境創建單獨的分支,並為每個生產版本標記代碼(就像我們為應用程序代碼庫所做的那樣)。思考Infra並根據代碼進行處理。 (任何流程變更都必須編碼並發送到QA,SIT,UAT,然後再轉到PROD)。

例如,您可能在生產(主分支)中運行Ansible的V2.1,但在Prod(主分支)中運行的Docker容器的V2.0,

同樣,將DB腳本/ bash腳本保存在其自己的存儲庫中,也許可以配置健康檢查文件(JSON/YAML),以顯示每個已部署URL中所有工具/部件的版本,以便進行跟蹤和自動化。 (以便您的webhooks讀取URL並自動部署)

您所描述的代碼和配置的當前組織由所涉及的技術解決方案構成。這是一個糟糕的設計,會在我們的維護活動中增加很多開銷,並且也會以我們的方式添加大量的陷阱。相反,該組織應該圍繞我們正在部署的 artefact 進行構建。

其原因是我們想要考慮人為因素(例如,一個碼頭圖像或一個軟件包)作為以下動詞的對象:

  • 構建
  • 測試
  • 部署

考慮我們想要執行的一組最小的自動化任務。如果我們想要改變測試動詞的實現方式,可以很容易地訪問相應存儲庫中與該artefact相對應的文件夾,然後發現需要更新的jenkins特定自動化項目。相反,如果自動化配方是圍繞技術解決方案構建的,那麽我們需要弄清jenkins參與測試過程並找到與制造相關的自動化項目。在復雜的情況下,圍繞技術解決方案的組織會使更新變得非常困難,因為我們必須事先知道某些服務中涉及的所有技術解決方案以相應地更新它們。

例如,包含網站和微服務“a”代碼的存儲庫可能具有以下專用於操作的子目錄:

./ops/website
./ops/micro-service-a

每個腳本都有三個腳本,稱為 buildtestdeploy 。現在已經澄清了自動化項目的組織,讓我們將註意力轉向配置。

有關配置組織的主要條件和要求由 deploy 動詞在應用於類似服務的artefact時設置。 deploy 謂詞應該具有以下參數:

  • 要部署的artefact的版本,
  • artefact的部署目標,它描述部署的制品將運行的具體環境(例如應該與之對話的群集和端點)
  • 它應該用來連接到其他端點(例如數據庫)的證書
  • 運行時配置(如緩存條目應存活多久等)

從操作的角度來看,這種參數化的細分與部署問題的自然度自由度相匹配 - 除了可能與運行時配置捆綁在一起的證書之外,但最好將它們分開以避免不小心散布它們。

區分Ops,Dev和DevOps會促進隔離並強制實施“拋棄它”的思維方式。為了增加團隊之間的合作,人們應該將所有內容放在構建和部署項目所需的存儲庫中。

話雖如此,這個問題的答案是:

如何構建DevOps相關代碼並在代碼庫中進行配置?

如果需要配置來運行項目,那麽應該把它放在同一個目錄中。