引用:http://scienceofficersblog.blogspot.com/2016/02/testing-ansible-with-inspec.html
有太多帖子提到使用Chef inspec进行Ansible测试。但是他们通常会给出如下示例:
Ansible:
- hosts: all
user: root
tasks:
- debug: msg="debug {{inventory_hostname}}"
- apt: name=apache2 state=present
厨师检查:
impact 0.7
title "Test some simple resources"
describe package('apache2') do
it { should be_installed }
end
因此,如果我执行相同的Ansible块,将确保安装了apache2软件包。同样,有很多示例,例如应该打开端口80,因为如果我们在检查模式(空运行)下执行相同的剧本,那么我也将知道端口80是否在监听。
那么,为什么我们不能使用Ansible本身?当我们使用Ansible几乎可以做所有事情时,Chef inspec的确切必要性是什么?
答案 0 :(得分:1)
我不确定为什么人们似乎认为Inpec主厨对此是必要的。 Ansible拥有一个assert模块,该模块可以确保事物评估为真,这样您就可以有效地注册任务的输出并按期望声明事物。
https://docs.ansible.com/ansible/latest/modules/assert_module.html
实际上,这就是几乎所有Ansible集成测试都是在https://github.com/ansible/ansible/tree/devel/test/integration/targets上游编写的方式
答案 1 :(得分:1)
主要是因为这些示例非常非常简单。
对于同一个ansible块,我假设您希望安装apache,运行并监听端口80,一个更好的inspec示例将是:
impact 0.7
title "Test some simple resources"
describe package('apache2') do
it { should be_installed }
end
describe service('apache2') do
it { should be_installed }
it { should be_enabled }
it { should be_running }
end
describe port(80) do
it { should be_listening }
its('processes') {should include 'apache2'}
end
但是要点是,对所需的配置进行编码以及确保单独计划的测试可以采用TDD方法。
Inspec在格式化程序方面还有一个有趣的地方,它可以返回各种格式的审核信息。
最终,Inspec不需要测试Ansible,这是一种将“测试”和“动作”分开的做法,因此使ansible代码中的错误无法使apache侦听端口800的问题。就像您要它设置的一样(这很正常),将它们分开可以确保测试不是由操作代码派生的。