使用 Testinfra 和 Ansible 驗證服務器狀態

Testinfra 是一個功能強大的庫,可用於編寫測試來驗證基礎設施的狀態。另外它與 Ansible 和 Nagios 相結合,提供了一個用於架構即代碼 (IaC) 的簡單解決方案。html

Terminal command prompt on orange background
Terminal command prompt on orange background

根據設計,Ansible 傳遞機器的指望狀態,以確保 Ansible 劇本或角色的內容部署到目標機器上。可是,若是你須要確保全部基礎架構更改都在 Ansible 中,該怎麼辦?或者想隨時驗證服務器的狀態?python

Testinfra 是一個基礎架構測試框架,它能夠輕鬆編寫單元測試來驗證服務器的狀態。它是一個 Python 庫,使用強大的 pytest 測試引擎。linux

開始使用 Testinfra

可使用 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,這意味着 Testinfra 能夠直接使用 Ansible 的清單文件和清單中定義的一組機器來對它們進行測試。服務器

咱們使用如下清單文件做爲示例:

[web]
app-frontend01
app-frontend02

[database]
db-backend01
複製代碼

咱們但願確保咱們的 Apache Web 服務器在 app-frontend01app-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 做爲鏈接後端。

使用 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

如今咱們能夠輕鬆地運行測試來驗證機器的狀態,咱們可使用這些測試來觸發監控系統上的警報。這是捕獲意外的更改的好方法。

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

本文由 LCTT 原創編譯,Linux中國 榮譽推出

相關文章
相關標籤/搜索