持續基礎設施:另一個 CI

2018-12-04 23:46:00

想要提升你的 DevOps 效率嗎?將基礎設施當成你的 CI 流程中的重要的一環。

持續交付(CD)和持續整合(CI)是 DevOps 的兩個眾所周知的方面。但在 CI 大肆流行的今天卻忽略了另一個關鍵性的 I基礎設施infrastructure

曾經有一段時間 “基礎設施”就意味著無頭headless的黑盒子、龐大的伺服器,和高聳的機架 —— 更不用說漫長的採購流程和對盈餘負載的錯誤估計。後來到了虛擬機器時代,把基礎設施處理得很好,虛擬化 —— 以前的世界從未有過這樣。我們不再需要管理實體的伺服器。僅僅是簡單的點選,我們就可以建立和銷毀、開始和停止、升級和降級我們的伺服器。

有一個關於銀行的流行故事:它們實現了數位化,並且引入了線上表格,使用者需要手動填寫表格、列印,然後郵寄回銀行(LCTT 譯註:我真的遇到過有人問我這樣的需求怎麼辦)。這就是我們今天基礎設施遇到的情況:使用新技術來做和以前一樣的事情。

在這篇文章中,我們會看到在基礎設施管理方面的進步,將基礎設施視為一個版本化的元件並試著探索不可變伺服器immutable server的概念。在後面的文章中,我們將了解如何使用開源工具來實現持續的基礎設施。

continuous infrastructure pipeline

實踐中的持續整合流程

這是我們熟悉的 CI,儘早發布、經常發布的迴圈流程。這個流程缺少一個關鍵的元件:基礎設施。

突擊小測試:

  • 你怎樣建立和升級你的基礎設施?
  • 你怎樣控制和追溯基礎設施的改變?
  • 你的基礎設施是如何與你的業務進行匹配的?
  • 你是如何確保在正確的基礎設施設定上進行測試的?

要回答這些問題,就要了解持續基礎設施continuous infrastructure。把 CI 構建流程分為程式碼持續整合continuous integration code(CIc)和基礎設施持續整合continuous integration infrastructure(CIi)來並行開發和構建程式碼和基礎設施,再將兩者融合到一起進行測試。把基礎設施構建視為 CI 流程中的重要的一環。

pipeline with infrastructure

包含持續基礎設施的 CI 流程

關於 CIi 定義的幾個方面:

  1. 程式碼

    通過程式碼來建立基礎設施架構,而不是通過安裝。基礎設施如程式碼Infrastructure as code(IaC)是使用設定指令碼建立基礎設施的現代最流行的方法。這些指令碼遵循典型的編碼和單元測試週期(請參閱下面關於 Terraform 指令碼的範例)。

  2. 版本

    IaC 元件在原始碼倉庫中進行版本管理。這讓基礎設施的擁有了版本控制的所有好處:一致性,可追溯性,分支和標記。

  3. 管理

    通過編碼和版本化的基礎設施管理,你可以使用你所熟悉的測試和發布流程來管理基礎設施的開發。

CIi 提供了下面的這些優勢:

  1. 一致性Consistency

    版本化和標記化的基礎設施意味著你可以清楚的知道你的系統使用了哪些元件和設定。這建立了一個非常好的 DevOps 實踐,用來鑑別和管理基礎設施的一致性。

  2. 可重現性Reproducibility

    通過基礎設施的標記和基線,重建基礎設施變得非常容易。想想你是否經常聽到這個:“但是它在我的機器上可以執行!”現在,你可以在原生的測試平台中快速重現類似生產環境,從而將環境像變數一樣在你的偵錯過程中刪除。

  3. 可追溯性Traceability

    你是否還記得曾經有過多少次尋找到底是誰更改了資料夾許可權的經歷,或者是誰升級了 ssh 包?程式碼化的、版本化的,發布的基礎設施消除了臨時性變更,為基礎設施的管理帶來了可追蹤性和可預測性。

  4. 自動化Automation

    藉助指令碼化的基礎架構,自動化是下一個合乎邏輯的步驟。自動化允許你按需建立基礎設施,並在使用完成後銷毀它,所以你可以將更多寶貴的時間和精力用在更重要的任務上。

  5. 不變性Immutability

    CIi 帶來了不可變基礎設施等創新。你可以建立一個新的基礎設施元件而不是通過升級(請參閱下面有關不可變設施的說明)。

持續基礎設施是從執行基礎環境到執行基礎元件的進化。像處理程式碼一樣,通過證實的 DevOps 流程來完成。對傳統的 CI 的重新定義包含了缺少的那個 “i”,從而形成了連貫的 CD 。

(CIc + CIi) = CI -> CD

基礎設施如程式碼 (IaC)

CIi 流程的一個關鍵推動因素是基礎設施如程式碼infrastructure as code(IaC)。IaC 是一種使用組態檔進行基礎設施建立和升級的機制。這些組態檔像其他的程式碼一樣進行開發,並且使用版本管理系統進行管理。這些檔案遵循一般的程式碼開發流程:單元測試、提交、構建和發布。IaC 流程擁有版本控制帶給基礎設施開發的所有好處,如標記、版本一致性,和修改可追溯。

這有一個簡單的 Terraform 指令碼用來在 AWS 上建立一個雙層基礎設施的簡單範例,包括虛擬私有雲(VPC)、彈性負載(ELB),安全組和一個 NGINX 伺服器。Terraform 是一個通過指令碼建立和更改基礎設施架構和開源工具。

terraform script

Terraform 指令碼建立雙層架構設施的簡單範例

完整的指令碼請參見 GitHub

不可變基礎設施

你有幾個正在執行的虛擬機器,需要更新安全修補程式。一個常見的做法是推播一個遠端指令碼單獨更新每個系統。

要是不更新舊系統,如何才能直接丟棄它們並部署安裝了新安全修補程式的新系統呢?這就是不可變基礎設施immutable infrastructure。因為之前的基礎設施是版本化的、標籤化的,所以安裝修補程式就只是更新該指令碼並將其推播到發布流程而已。

現在你知道為什麼要說基礎設施在 CI 流程中特別重要了嗎?