Testinfra是一个功能强大的库,用于编写测试以验证基础架构的状态。此外,它与Ansible和Nagios结合使用,为架构相关代码(IaC)提供了一个简单的解决方案。
按照设计,Ansible传递机器的所需状态,以确保Ansible脚本或角色的内容部署到目标机器。但是,如果您需要确保所有基础架构更改都在Ansible中,该怎么办?或者想要随时验证服务器的状态?
Testinfra是一个基础架构测试框架,可以轻松编写单元测试来验证服务器的状态。它是一个使用强大的pytest测试引擎的Python库。
开始使用Testinfra
可以使用Python包管理器(pip)和Python虚拟环境轻松安装Testinfra。
$ python3 -m venv venv
$ source venv/bin/activate
(venv)$ pip install testinfra
Testinfra也可以在Fedora和CentOS EPEL存储库中使用。例如,在CentOS 7上,您可以使用以下命令安装它:
$ yum install -y epel-release
$ yum install -y python-testinfra
一个简单的测试脚本
在Testinfra中编写测试很容易。使用您选择的代码编辑器将以下内容添加到名为test_simple.py的文件中:
导入testinfra
Def test_os_release(host):断言host.file('/etc/os-release')。contains('Fedora')
Def test_sshd_inactive(host):
断言host.service('sshd')。is_running为False
默认情况下,Testinfra为可以访问不同辅助模块的测试用例提供主机对象。例如,第一个测试使用文件模块验证主机上文件的内容,第二个测试用例使用服务模块检查systemd服务的状态。
要在本地运行这些测试,请执行以下命令:
(venv)$ pytest test_simple.py
=================================测试会话开始================================
Platform linux - Python 3.7.3,pytest-4.4.1,py-1.8.0,pluggy-0.9.0
Rootdir:/home/cverna/Documents/Python/testinfra
插件: testinfra-3.0.0
收集了2个项目
Test_simple.py .
=======================================================================================================================
有关Testinfra API的完整列表,请参阅文档。
Testinfra和Ansible
Testinfra支持的后端之一是Ansible,这意味着Testinfra可以使用Ansible的清单文件和清单中定义的一组计算机直接测试它们。
我们使用以下清单文件作为示例:
[网络]
APP-frontend01
APP-frontend02
[数据库]
DB-backend01
我们希望确保我们的Apache Web服务器在app-frontend01和app-frontend02上运行。让我们在名为test_web.py的文件中编写一个测试:Def check_httpd_service(host):
'''检查httpd服务是否在主机上运行'''
断言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):
“””
使用Ansible验证是否已安装软件包
包模块
“””
断言不是host.ansible('package','name=httpd state=present')['changed']
默认情况下,启用Ansible的检查模式,这意味着Ansible将报告在远程主机上执行操作时发生的更改。
Testinfra和Nagios
现在我们可以轻松地运行测试来验证机器的状态,我们可以使用这些测试来触发监控系统上的警报。这是捕获意外更改的好方法。
Testinfra提供与Nagios的集成,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次通过,0次失败,0次在2.55秒内跳过
Testinfra是一个功能强大的库,用于编写测试以验证基础架构的状态。它还与Ansible和Nagios结合使用,为架构相关代码(IaC)提供了一个简单的解决方案。它也是使用Molecule开发Ansible角色期间添加测试的关键组件。