一千萬個為什麽

搜索


基礎架構作為代碼告訴我們使用自動化構建的工具。大。像 ansible廚師傀儡salt stack 和其他人推動我們寫出基礎設施的外觀,同時解決分歧。

在Salt Stack中,這些位稱為各州。如果狀態與現實不符,該工具將為我們解決它。換句話說 - 我們正在為我們的基礎架構編寫測試,如果測試失敗,該工具將自行修復。至少這是主意。

XP教會我們使用TDD,問題在於它是否適用於基礎架構?工具表明它是。

我可以想象幾種類型的測試可能非常有用。

我們編寫與部署的服務捆綁在一起的煙霧測試,以確保端到端部署的服務正常運行並按預期運行。這將是一個API調用或/和systemctl檢查,以確保我們剛剛部署的工作。許多這樣的功能可以在相同的州進行覆蓋,因為像ansible這樣的工具聲明確保服務正在運行。

有一個項目 Molecule ,允許運行個人角色(作為負責人稱其狀態)對付碼頭或其他臨時虛擬化引擎。這迫使角色解耦,並允許在處理它們時獨立於劇本執行它們。測試大多允許嘲笑角色應該使用的變量。其他示例看起來像是一個重復的引擎,盡管(聲明一個文件屬於用戶...)。

ThoughtWorks tech radar right now praises tools like inspec, serverspec or goss for validating that the server meets the spec. But we are writing a spec, aren't we?

那麽,如果我們描述的是國家/角色的基礎架構,那麽進一步測試基礎架構是否有意義?我可以懷疑,在一個團隊提供規範和其他遵循規範的大型組織中,或者如果有大量角色可能需要運行其中的一個子集並從測試中獲得速度優勢,那麽這對於更大的組織會變得更加需要。如果你想為同一個問題想一個角色/狀態,我很難理解你為什麽要寫測試。

轉載註明原文: 基礎設施作為代碼和TDD

一共有 3 個回答:

簡而言之,我看到兩種類型的基礎架構測試:1)它是否具備運行應用程序所需的一切; 2)是否沒有任何多余的東西。

首先,您可以將實際軟件的測試套件視為您的基礎架構的一種“元測試”。只要您從頭開始為每次測試運行創建基礎架構,並且測試套件完全在該基礎架構上運行(即不使用外部服務),則整個套件為綠色的事實意味著您編寫的基礎架構也足夠了。

其次,特別是從安全角度來看,您可以針對您的基礎架構編寫測試。也就是說,如果您的基礎設施的一部分是運行Linux的虛擬機,則可以編寫一個測試,針對該虛擬機執行端口掃描,以確保沒有意外端口打開,這可能是由非預期的 apt-get install 副作用。或者你可以編寫測試,檢查是否有任何意外的文件在正確的測試套件完成後發生了變化。或者你可以檢查你的虛擬機或者Docker容器的 ps 輸出是否有意想不到的進程等等,建立​​白名單等等,並且如果一些第三方軟件包在一個未記錄的(或者未被註意到的方式)進行一些升級。

從某種程度上來說,這些第二種測試類似於您在傳統操作設置中所做的操作,即強化您的服務器並檢查入侵行為,避免全部資源等。

看起來這裏的每個人都認為IAC工具總是按預期運行,但我可以從(我自己的經驗)看出情況並非總是如此,否則單元測試實際上是無用的。

我記得有一張圖片說著“Ansible playbook跑了,一切都很好”,後面有一幢建築物在燃燒......

運行聲明狀態並讓服務器處於這種實際聲明的狀態與我的觀點和經驗至少有兩點不同。

一個廣泛而異質的環境,遍布多個DC,可通過公共網絡到達......有多種原因無法全部或部分應用一個州。

由於所有這些原因,單元測試還是有空間可以獲得實際服務器狀態的快照,而這又可能與目標狀態有所不同。

所以我會說是的,即使在IAC管理的環境中,單元測試也很有用。

修改

IaC代碼庫開發分支的非回歸方面呢?所以你可以在開發分支中對代碼進行更改,並將其合並到prod分支,希望不會破壞所有內容?單元測試是非常有價值的,通常很容易實現,我不明白為什麽沒有這個功能的代碼。

Reference (in french sorry for that): https://fr.slideshare.net/logilab/testinfra-pyconfr-2017

恕我直言,對於完全由IaaC狀態規範覆蓋的項目編寫TDD測試是相當多余的。這樣做意味著IaaC的有效性值得懷疑 - 如果是的話,為什麽要使用它?

從不同的預期IaaC本身(如果/如果正確完成的話)來看,它結合了已經測試並被認為可以可靠運行的功能。這是什麽使其具有吸引力並且使得編寫TDD匹配測試成為冗余。

例如,指定安裝有SSH的系統的IaaC配置已經包含了對正確安裝的SSH的可靠檢查,如果沒有,則正確安裝SSH的機制。這使得檢查SSH是否安裝冗余的TDD測試。如果您的IaaC配置也指定sshd啟動並偵聽特定端口,則TDD測試sshd運行並偵聽相應的端口也是多余的。

請註意,我的答案並非針對TDD或任何其他類型的測試,以檢查您的IaaC配置是否適合某個特定目的。這仍然有效,可用於開發IaaC規範時的TDD,CI或類似檢查 - 我相信@ AnoE的答案適用於此類情況。