仅限本地模式食谱中的厨师

Chef in local mode cookbooks only

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

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

我能够启动和配置本地 Vagrant 机器,但我不太确定该怎么做的一件事是让 Chef 加载本地版本的食谱,但仍与 Chef 服务器通信对于其他所有内容(环境、角色、数据包等),这样我就不必在每次进行要测试的更改时都通过 knife 上传食谱。这可能吗?

换句话说,我能否让 chef-client 仅针对食谱与本地 chef-zero 服务器对话,而与远程 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:

recipes/default.rb

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

现在,我知道我可以按照以下方式创建一些东西:

data_bags/main.json

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

并从那个数据包中读取我的厨房测试;但这正是我要避免的。是否可以:

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

测试厨房是驱赶流浪者的最佳途径。它提供了您正在寻找的与零号厨师的集成。使您能够在本地完全模拟您的生产 Chef 设置并针对多个平台测试您的食谱。

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

例子

使用社区说明书生成安装 java 的演示说明书。 Berkshelf(用于管理食谱依赖项)和 Chef zero 等工具会自动设置。

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:

伯克斯文件

此文件控制说明书依赖项的管理方式。特殊的 "metadata" 设置告诉 Berkshelf 引用食谱元数据文件。

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

metadata

metadata.rb

添加 "apt" 和 "java" 食谱作为依赖项:

name 'demo'
..
..

depends "apt"
depends "java"

recipes/default.rb

include_recipe "apt"
include_recipe "java"

test/integration/default/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 中的项目):

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

您可以使用 knife 下载您需要的 Chef 服务器对象。您可以 bootstrap 在 .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/

可能有一种不那么多余的方法来执行此操作,但这现在对我有用,并且由于我只想记录下来,所以我就这样离开了。