Testinfra是一个功能强大的库,用于编写测试以验证基础架构的状态。此外,它还与Ansible和Nagios集成,为基础架构即代码(IaC)提供简单的解决方案。通过设计,Ansible传达机器的期望状态,以确保将Ansible剧本或角色的内容部署到目标机器。但是,如果您需要确保所有基础架构更改都在Ansible中怎么办?或者想随时验证服务器的状态?Testinfra是一个基础架构测试框架,可以轻松编写单元测试来验证服务器的状态。它是一个使用强大的pytest测试引擎的Python库。可以使用Python包管理器(pip)和Python虚拟环境轻松安装Testinfra入门。$python3-mvenvvenv$sourcevenv/bin/activate(venv)$pipinstalltestinfraTestinfra也可以通过Fedora和CentOS的EPEL存储库获得。例如,在CentOS7上,您可以使用以下命令安装它:$yuminstall-yepel-release$yuminstall-ypython-testinfra一个简单的测试脚本在Testinfra中编写测试很容易。使用您选择的代码编辑器,将以下内容添加到名为test_simple.py的文件中:):asserthost.service("sshd").is_runningisFalse默认情况下,Testinfra为测试用例提供了宿主对象,可以访问不同的辅助模块。例如,第一个测试使用file模块来验证主机上文件的内容,第二个测试用例使用service模块来检查systemd服务的状态。要在本地运行这些测试,请执行以下命令:(venv)$pytesttest_simple.py===================================测试会话开始==================================平台linux--Python3.7.3,pytest-4.4.1,py-1.8.0,pluggy-0.9.0rootdir:/home/cverna/Documents/Python/testinfraplugins:testinfra-3.0.0collected2itemstest_simple.py..===================================2在0.05秒内通过==================================完整的TestinfraAPI列表可以参考文档。Testinfra和Ansible支持的后端之一是Ansible,这意味着Testinfra可以直接使用Ansible的清单文件和清单中定义的一组机器来测试它们。我们使用以下清单文件作为示例:[web]app-frontend01app-frontend02[database]db-backend01我们要确保我们的ApacheWeb服务器在app-frontend01和app-frontend02上运行。让我们把测试写在一个名为test_web.py的文件中:defcheck_httpd_service(host):"""检查httpd服务是否正在主机上运行"""asserthost.service("httpd").is_running来使用Testinfra来运行此测试使用Ansible,使用以下命令:(venv)$pipinstallansible(venv)$py.test--hosts=web--ansible-inventory=inventory--connection=ansibletest_web.py调用测试时,我们使用Ansible清单文件的[web]组作为目标机器,并指定我们要使用Ansible作为连接后端。使用Ansible模块Testinfra还为可用于测试的Ansible提供了一个很好的API。这个Ansible模块支持在测试中运行Ansible操作,并且可以轻松检查操作的状态。defcheck_ansible_play(host):"""验证是否使用Ansible包模块安装包"""assertnothost.ansible("package","name=httpdstate=present")["changed"]默认情况下,Ansible的检查模式已启用,这意味着Ansible将报告在远程主机上执行操作时发生的更改。Testinfra和Nagios现在我们可以轻松地运行测试来验证机器的状态,我们可以使用它来触发监控系统上的警报。这是捕捉意外变化的好方法。Testinfra提供与Nagios的集成,Nagios是一种流行的监控解决方案。默认情况下,Nagios使用NRPE插件对远程主机执行检查,但使用Testinfra可以直接从Nagios主节点运行测试。为了使Testinfra输出与Nagios兼容,我们必须在触发测试时使用--nagios标志。我们还使用-qqpytest标志启用pytest的静默模式,以便不显示所有测试详细信息。(venv)$py.test--hosts=web--ansible-inventory=inventory--connection=ansible--nagios-qqlinetest.pyTESTINFRAOK-1passed,0failed,0skippedin2.55secondsTestinfra是一个强大的A可用于编写测试以验证基础架构状态的库。还与Ansible和Nagios相结合,为基础设施即代码(IaC)提供了一个简单的解决方案。它也是使用Molecule为Ansible角色开发添加测试的关键组件。
