8

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

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

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

4

3 回答 3

10

我很高兴地发现 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]"
  ]
}
于 2015-04-25T04:05:46.527 回答
3

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

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

也就是说,我个人更喜欢使用角色食谱。如果您像我们一样有一组固定的环境,那么您也可以在角色说明书的属性文件中使用简单的条件来根据环境调整属性。这样,您就有了一个说明书,它通过包装其他说明书和设置变量来定义节点的整个配置。使用该设置,很容易设置验证确切生产系统的厨房测试。

于 2015-04-23T14:06:06.330 回答
1

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

您可以在规范文件中定义完整的运行列表并确保呈现的文件是正确的。

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


另一种方法是使用“角色说明书”,而不是使用厨师服务器上的角色,您可以在属性文件中定义您希望定义的属性,并使此说明书取决于角色运行列表的内容。

此角色食谱食谱将include_recipe仅引用您在角色运行列表中设置的食谱。

这里的主要优点是您可以在本食谱中包含您的规格,而与参考的食谱无关。

于 2015-04-23T09:18:30.827 回答