原文https://martinfowler.com/bliki/InfrastructureAsCode.html
基礎設施即代碼是一種像其他軟件系統一樣通過源代碼定義計算資源和網絡基礎設施的方法。代碼可以被用來進行評審和反復構建(https://martinfowler.com/bliki/ReproducibleBuild.html) ,遵循測試實踐, 完全適合持續交付(https://martinfowler.com/bliki/ContinuousDelivery.html) 。 它是過去十年用來適應不斷增長的云計算平臺(https://martinfowler.com/bliki/CloudComputing.html) 的方法,并且以后會成為處理計算基礎設施的主要方法。
我在石器時代(https://www.thoughtworks.com/insights/blog/infrastructure-code-iron-age-cloud-age) 長大,當要發布一個新的服務應用意味著要去找些硬件來運行,為了讓硬件滿足應用需求需要配置硬件,并將應用部署到硬件上。管理這些硬件通常是昂貴的,但也是長期的,通常是幾個月。但現在我們活在云時代,啟動一個服務器只是幾秒的事,只需要互聯網和一個信用卡。這是一個動態基礎設施,軟件命令用于創建服務器(通常是虛擬機,也可以是裸機的安裝包),管理和銷毀它們,手頭不需要有螺絲刀。
實踐
基礎設施即代碼基于一些實踐:
- 使用定義文件:所有配置都定義在可執行的配置定義文件里,如shell腳本,Ansible playbook,Chef recipe,或者Puppet manifests。任何時間不需要登錄服務器做一些運行時調整。任何此類調整都會造成SnowflakeServer(https://martinfowler.com/bliki/SnowflakeServer.html) ,這些變更都要在開發編碼時進行最后的調整。這意味著用代碼做變更需要很快。幸運的是計算機執行代碼很快,它們管理上百臺服務器比任何人類打字都快。
- 自說明系統與處理:與給人類看的文檔說明,并依賴一般標準的人類可靠性,代碼更加精確且在運行時絕對一致。如果可能,其他人類可讀的文檔可以從這些代碼里生成。
- 版本化所有東西: 將所有這些代碼放在源代碼管理中。這樣所有的配置和所有的變更都可以被審查并記錄,你可以用重復構建(https://martinfowler.com/bliki/ReproducibleBuild.html) 來幫助發現問題。
- 持續測試系統并處理:測試能讓電腦在基礎設施配置中快速的發現許多錯誤。用現代的軟件系統,你可以給你的基礎設施代碼設置部署流水線(https://martinfowler.com/bliki/DeploymentPipeline.html) ,這樣你可以實踐基礎設施變更的持續交付(https://martinfowler.com/bliki/ContinuousDelivery.html) 。
- 小步變更而不是批量變更:基礎設施更新的越大,越有可能存在問題并更難檢測錯誤,尤其是一些相互影響的情況。 小變更對于找錯誤更容易而且容易回滾。 當變更基礎設施時頻率能減少難度(https://martinfowler.com/bliki/FrequencyReducesDifficulty.html) 。
- 保證服務持續運行:系統升級或修復不能接受宕機。藍綠部署(https://martinfowler.com/bliki/BlueGreenDeployment.html) 和并行變更(https://martinfowler.com/bliki/ParallelChange.html) 技術能保證進行小變更而不需要損失可用性。
收益
這些動態基礎設施技術都讓我們很容易的啟動新的服務器,當新的配置替換上去或負載變小時安全的銷毀機器。創建新服務器只是通過運行腳本來按需創建服務實例的一個例子。這種方式非常適合PhoenixServers(https://martinfowler.com/bliki/PhoenixServer.html) 和ImmutableServers(https://martinfowler.com/bliki/ImmutableServer.html) 。
用代碼定義服務器配置意味著在服務器間有絕對的一致性。手動調整配置往往像雪花一樣會有一些微妙的差異,經常會導致詭異的問題并難以調試。這個問題在有不一致的監控時更早,所以一樣用代碼保證監控也是一致的。
最重要的是用配置代碼保證變更更安全,在升級應用和系統軟件時承擔更小的風險。問題可以被定位和更快的修復,最差的情況下也可以回滾到上一次的工作配置。
將基礎設施像版本控制一樣管理有利于兼容性和審查。每一行你對配置的變更都可以被記錄并不容易出問題。
所有這些在你需要控制更多服務器時都顯得更重要了 ,如果你正在向微服務(https://martinfowler.com/microservices) 遷移,基礎設施及代碼成為一個必要的能力。基礎設施即代碼技術可以用來管理大集群服務器,無論是配置服務器和處理它們如何進行交互。
文章列表