Testinfra 是一個功能強大的庫,可用於編寫測試來驗證基礎設施的狀態。另外它與 Ansible 和 Nagios 相結合,提供了一個用於架構即代碼 (IaC) 的簡單解決方案。html
根據設計,Ansible 傳遞機器的指望狀態,以確保 Ansible 劇本或角色的內容部署到目標機器上。可是,若是你須要確保全部基礎架構更改都在 Ansible 中,該怎麼辦?或者想隨時驗證服務器的狀態?python
Testinfra 是一個基礎架構測試框架,它能夠輕鬆編寫單元測試來驗證服務器的狀態。它是一個 Python 庫,使用強大的 pytest 測試引擎。linux
可使用 Python 包管理器(pip
)和 Python 虛擬環境輕鬆安裝 Testinfra。ios
$ python3 -m venv venv
$ source venv/bin/activate
(venv) $ pip install testinfra
複製代碼
Testinfra 也能夠經過 Fedora 和 CentOS 的 EPEL 倉庫中使用。例如,在 CentOS 7 上,你可使用如下命令安裝它:git
$ yum install -y epel-release
$ yum install -y python-testinfra
複製代碼
在 Testinfra 中編寫測試很容易。使用你選擇的代碼編輯器,將如下內容添加到名爲 test_simple.py
的文件中:github
import testinfra
def test_os_release(host):
assert host.file("/etc/os-release").contains("Fedora")
def test_sshd_inactive(host):
assert host.service("sshd").is_running is False
複製代碼
默認狀況下,Testinfra 爲測試用例提供了一個 host
對象,該對象能訪問不一樣的輔助模塊。例如,第一個測試使用 file
模塊來驗證主機上文件的內容,第二個測試用例使用 service
模塊來檢查 systemd 服務的狀態。web
要在本機運行這些測試,請執行如下命令:後端
(venv)$ pytest test_simple.py
================================ test session starts ================================
platform linux -- Python 3.7.3, pytest-4.4.1, py-1.8.0, pluggy-0.9.0
rootdir: /home/cverna/Documents/Python/testinfra
plugins: testinfra-3.0.0
collected 2 items
test_simple.py ..
================================ 2 passed in 0.05 seconds ================================
複製代碼
有關 Testinfra API 的完整列表,你能夠參考文檔。bash
Testinfra 支持的後端之一是 Ansible,這意味着 Testinfra 能夠直接使用 Ansible 的清單文件和清單中定義的一組機器來對它們進行測試。服務器
咱們使用如下清單文件做爲示例:
[web]
app-frontend01
app-frontend02
[database]
db-backend01
複製代碼
咱們但願確保咱們的 Apache Web 服務器在 app-frontend01
和 app-frontend02
上運行。讓咱們在名爲 test_web.py
的文件中編寫測試:
def check_httpd_service(host):
"""Check that the httpd service is running on the host"""
assert host.service("httpd").is_running
複製代碼
要使用 Testinfra 和 Ansible 運行此測試,請使用如下命令:
(venv) $ pip install ansible
(venv) $ py.test --hosts=web --ansible-inventory=inventory --connection=ansible test_web.py
複製代碼
在調用測試時,咱們使用 Ansible 清單文件的 [web]
組做爲目標計算機,並指定咱們要使用 Ansible 做爲鏈接後端。
Testinfra 還爲 Ansible 提供了一個很好的可用於測試的 API。該 Ansible 模塊可以在測試中運行 Ansible 動做,而且可以輕鬆檢查動做的狀態。
def check_ansible_play(host):
""" Verify that a package is installed using Ansible package module """
assert not host.ansible("package", "name=httpd state=present")["changed"]
複製代碼
默認狀況下,Ansible 的檢查模式已啓用,這意味着 Ansible 將報告在遠程主機上執行動做時會發生的變化。
如今咱們能夠輕鬆地運行測試來驗證機器的狀態,咱們可使用這些測試來觸發監控系統上的警報。這是捕獲意外的更改的好方法。
Testinfra 提供了與 Nagios 的集成,它是一種流行的監控解決方案。默認狀況下,Nagios 使用 NRPE 插件對遠程主機進行檢查,但使用 Testinfra 能夠直接從 Nagios 主控節點上運行測試。
要使 Testinfra 輸出與 Nagios 兼容,咱們必須在觸發測試時使用 --nagios
標誌。咱們還使用 -qq
這個 pytest 標誌來啓用 pytest 的靜默模式,這樣就不會顯示全部測試細節。
(venv) $ py.test --hosts=web --ansible-inventory=inventory --connection=ansible --nagios -qq line test.py
TESTINFRA OK - 1 passed, 0 failed, 0 skipped in 2.55 seconds
複製代碼
Testinfra 是一個功能強大的庫,可用於編寫測試以驗證基礎架構的狀態。 另外與 Ansible 和 Nagios 相結合,提供了一個用於架構即代碼 (IaC) 的簡單解決方案。 它也是使用 Molecule 開發 Ansible 角色過程當中添加測試的關鍵組件。
via: opensource.com/article/19/…
做者:Clement Verna 選題:lujun9972 譯者:geekpi 校對:wxy