仅限本地模式厨师的厨师

时间:2015-06-08 19:07:32

标签: vagrant chef

我正在尝试建立一个工作流程来在本地开发Chef cookbook。我们目前正在使用Chef Server和使用chef-client的配置节点。

作为新工作流程的一部分,我们希望能够开始使用Vagrant在本地测试烹饪书,以避免在云中远程计算机上进行测试。

我能够启动和配置本地Vagrant机器,但我不确定如何做的一件事是让Chef加载本地版本的cookbook,但仍然可以与Chef服务器讨论一切否则(环境,角色,数据包等),所以每次我做一个我要测试的更改时,我都不必通过刀上传这本菜谱。这可能吗?

换句话说,我可以让厨师 - 客户与当地的厨师 - 零服务器仅为烹饪书,而对远程厨师服务器进行其他一切的讨论吗?或者可能采用不同的方法产生相同的效果?我愿意接受建议。

更新

我认为一个例子将有助于表达我正在寻找的东西。我意识到这可能不是我真正需要的,但我很好奇如何实现它。在此方案中,配方从存储在远程Chef服务器

中的数据条读取

metadata.rb

name             'proxy-cookbook'
version          '0.0.0'

.kitchen.yml

---
driver:
  name: vagrant

provisioner:
  name: chef_zero

platforms:
  - name: ubuntu-12.04

suites:
  - name: default
    run_list:
      - recipe[proxy-cookbook::default]
    attributes:

配方/ default.rb

...
key = data_bag_item("key", "main")
....

现在,我知道我可以创建以下内容:

data_bags / main.json

{
  "id": "main",
  "key": "s3cr3tk3y"
}

从我的数据包中读取厨房测试;但这正是我想要避免的。是否有可能:

  • 指示测试厨房从厨师服务器获取实际数据包
  • 让chef-zero检索数据包的临时副本以进行本地测试,或
  • 在本地快速“转储”远程Chef服务器的内容吗?

我希望这是有道理的。如有必要,我可以添加一些上下文。

2 个答案:

答案 0 :(得分:1)

测试厨房是驱赶流浪汉的最佳方式。它提供了您正在寻找的厨师零点的集成。使您能够在本地完全模拟您的生产厨师设置,并在多个平台上测试您的食谱。

测试厨房取代了我以前用于厨师开发的旧工作流程。非常值得学习。

实施例

生成使用社区食谱安装java的演示食谱。像Berkshelf(管理食谱依赖)和厨师零的工具会自动设置。

chef generate cookbook demo

创建以下文件:

└── demo
    ├── .kitchen.yml
    ├── Berksfile
    ├── metadata.rb
    ├── recipes
    │   └── default.rb
    └── test
        └── integration
            ├── default
            │   └── serverspec
            │       └── default_spec.rb

.kitchen.yml

更新平台版本。厨房被告知使用流浪汉和厨师零。

---
driver:
  name: vagrant

provisioner:
  name: chef_zero

platforms:
  - name: ubuntu-14.04
  - name: centos-6.6

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

Berksfile

此文件控制如何管理cookbook依赖项。特殊的“元数据”设置告诉Berkshelf引用cookbook元数据文件。

source 'https://supermarket.chef.io'

metadata

metadata.rb

将“apt”和“java”cookbook添加为依赖项:

name 'demo'
..
..

depends "apt"
depends "java"

配方/ default.rb

include_recipe "apt"
include_recipe "java"

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

测试JDK包的安装

require 'spec_helper'

describe package("openjdk-6-jdk") do
  it { should be_installed }
end

运行示例

$ kitchen verify default-ubuntu-1404
-----> Starting Kitchen (v1.4.0)

       ..
       ..

       Package "openjdk-6-jdk"
         should be installed

       Finished in 0.1007 seconds (files took 0.268 seconds to load)
       1 example, 0 failures

       Finished verifying <default-ubuntu-1404> (0m13.73s).
-----> Kitchen is finished. (0m14.20s)

更新

以下示例演示如何使用带有角色的测试厨房(适用于数据包和其他要加载到chef-zero中的项目):

答案 1 :(得分:0)

我想我找到了我想要的东西。

您可以使用knife下载所需的Chef服务器对象。您可以在.kitchen.yml中引导它,这样您就不必每次都手动执行此操作。

.kitchen.yml

...
driver:
  name: vagrant
  pre_create_command: 'mkdir -p chef-server; knife download /data_bags /roles /environments --chef-repo-path chef-server/'
...
provisioner:
  name: chef_zero
  data_bags_path: chef-server/data_bags
  roles_path: chef-server/roles
  environments_path: chef-server/environments
  client_rb:
    environment: development
...

然后我将chef-server目录添加到.gitignore

的.gitignore

chef-server/

这可能有一种不那么冗余的方式,但这对我来说现在很有用,因为我只是想记录下来,我就这样离开了。