【问题标题】:Testing Chef roles and environments测试 Chef 角色和环境
【发布时间】:2015-06-30 23:53:12
【问题描述】:

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

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

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

【问题讨论】:

    标签: testing tdd chef-infra role test-kitchen


    【解决方案1】:

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

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

    Chefspec 文档中有一部分关于它here


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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        我很高兴地发现 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 将无法编译

        test/integration/default/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]"
          ]
        }
        

        【讨论】:

        • 我希望厨房页面或 Chef 的文档能更好地记录这一点。如果不问别人,我永远不记得在哪里或如何解决这个问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-04
        • 1970-01-01
        • 1970-01-01
        • 2015-12-21
        • 2017-06-27
        • 1970-01-01
        相关资源
        最近更新 更多