测试Chef角色和环境

时间:2015-04-23 02:27:50

标签: testing tdd chef role test-kitchen

我是Chef的新手,并且一直在使用Test Kitchen测试我的食谱的有效性,这非常有用。现在,我在最初运行Chef之前尝试确保生产节点上的特定于环境的属性是正确的。这些将在角色中定义。

例如,我可能会使用带有开发设置的Vagrant框进行收敛,这会对菜谱进行验证。我希望能够测试生产节点的角色。我想我希望这些测试作为描述我的环境的真相来源。看看Test Kitchen的文档,这似乎超出了它的范围。

我的假设是否正确?在第一次在生产节点上运行Chef以确保它具有正确的设置之前,是否有更好的方法来测试食谱?

3 个答案:

答案 0 :(得分:9)

我很高兴地发现chef_zero使用“test / integration”目录作为它的主厨库。

只需在

下创建您的角色即可
  • 测试/集成/角色

实施例

标准厨师食谱布局。

├── attributes
│   └── default.rb
├── Berksfile
├── Berksfile.lock
├── chefignore
├── .kitchen.yml
├── metadata.rb
├── README.md
├── recipes
│   └── default.rb
└── test
    └── integration
        ├── default
        │   └── serverspec
        │       ├── default_spec.rb
        │       └── spec_helper.rb
        └── roles
            └── demo.json

.kitchen.yml

---
driver:
  name: vagrant

provisioner:
  name: chef_zero

platforms:
  - name: ubuntu-14.04

suites:
  - name: default
    run_list:
      - role[demo]
    attributes:

注意:

  • 供应商是chef_zero
  • 运行列表配置为使用角色

配方/ default.rb

file "/opt/helloworld.txt" do
  content "#{node['demo']['greeting']}"
end

属性/ default.rb

default['demo']['greeting'] = "hello world"

注意:

  • 没有默认
  • ,Cookbook将无法编译

测试/集成/默认/ serverspec / default_spec.rb

require 'spec_helper'

describe file('/opt/helloworld.txt') do

  it { should be_file }
  its(:content) { should match /this came from my role/ }

end

注意:

  • 集成测试正在查找由角色属性
  • 设置的内容

测试/集成/角色/ demo.json

{
  "name": "demo",
  "default_attributes": {
    "demo": {
      "greeting": "this came from my role"
    }
  },
  "run_list": [
    "recipe[demo]"
  ]
}

答案 1 :(得分:3)

您可以在.kitchen.yml中设置角色和环境,因此您当然可以使用测试厨房进行测试。

....
provisioner:
  roles_path: path/to/your/role/files
  client_rb:
    environment: your_environment
.....

那就是说,我个人更喜欢使用角色烹饪书。如果您有一组固定的环境,那么您也可以在角色cookbook的属性文件中使用简单的条件来调整基于环境的属性。这样,您就可以通过包装其他cookbook和设置变量来定义整个节点配置。通过该设置,可以非常轻松地设置厨房测试,以验证确切的生产系统。

答案 2 :(得分:1)

在验证属性时,您应该使用的Test Kitchen部分是ChefSpec。

您可以在spec文件中定义完整的运行列表,并确保渲染的文件正确无误。

有关于它here的Chefspec文档的一部分。

另一种方法是拥有一个"角色食谱",而不是在厨师服务器上使用角色,你定义你想在属性文件中定义的属性,并使这本食谱取决于什么角色运行列表将是。

此角色菜谱配方只有include_recipe引用您在角色运行列表中设置的配方。

这里的主要优点是您可以在参考本烹饪书中独立于参考食谱中包含您的规格。