内容简介:Testinfra 是一个功能强大的库,可用于编写测试来验证基础设施的状态。另外它与 Ansible 和 Nagios 相结合,提供了一个用于架构即代码 (IaC) 的简单解决方案。根据设计,
Testinfra 是一个功能强大的库,可用于编写测试来验证基础设施的状态。另外它与 Ansible 和 Nagios 相结合,提供了一个用于架构即代码 (IaC) 的简单解决方案。
根据设计, Ansible 传递机器的期望状态,以确保 Ansible 剧本或角色的内容部署到目标机器上。但是,如果你需要确保所有基础架构更改都在 Ansible 中,该怎么办?或者想随时验证服务器的状态?
Testinfra 是一个基础架构测试框架,它可以轻松编写单元测试来验证服务器的状态。它是一个 Python 库,使用强大的 pytest 测试引擎。
开始使用 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
的文件中:
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 服务的状态。
要在本机运行这些测试,请执行以下命令:
(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 collected2items test_simple.py.. ================================ 2passed in 0.05seconds================================
有关 Testinfra API 的完整列表,你可以参考 文档 。
Testinfra 和 Ansible
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 作为连接后端。
使用 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- 1passed, 0failed, 0skipped in 2.55seconds
Testinfra 是一个功能强大的库,可用于编写测试以验证基础架构的状态。 另外与 Ansible 和 Nagios 相结合,提供了一个用于架构即代码 (IaC) 的简单解决方案。 它也是使用 Molecule 开发 Ansible 角色过程中添加测试的关键组件。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Vue中的验证登录状态
- 设计一种无状态的验证码
- 正则表达式验证身份证号码和邮箱、判断checked选中状态
- javascript – 有可能使用angularJs将状态从状态传递到状态吗?
- 表单正则验证及文件上传验证功能
- 前端状态管理与有限状态机
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。