【问题标题】:Chef in local mode cookbooks only仅限本地模式的厨师食谱
【发布时间】:2015-08-23 09:23:16
【问题描述】:

我正在尝试设置工作流程以在本地开发 Chef 食谱。我们目前正在使用 Chef Server 和使用 chef-client 配置的节点。

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

我能够启动和配置本地 Vagrant 机器,但我不太确定如何做的一件事是让 Chef 加载本地版本的食谱,但仍然与 Chef 服务器对话以获取所有内容其他(环境、角色、数据包等),所以我不必在每次进行更改时都通过刀上传菜谱来测试。这可能吗?

换句话说,我可以让 Chef-client 与本地 Chef-zero 服务器仅针对食谱进行对话,而与远程 Chef 服务器对话以获取其他所有内容吗?或者可能会产生相同效果的不同方法?我愿意接受建议。

更新

我认为一个例子将有助于表达我在寻找什么。我意识到这可能不是我真正需要的,但我很好奇如何实现它。在这种情况下,配方从存储在远程 Chef 服务器中的数据包中读取

元数据.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"
}

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

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

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

【问题讨论】:

  • 我建议使用test-kitchen
  • @StephenKing 我也在尝试实现 test-kitchen 的使用,它真的很有用,但看起来这只会改变问题,因为我现在不是能够与我的厨师服务器交谈非食谱的东西,比如数据包和环境。我希望能够让 test-kitchen 与 Chef 服务器就所有除了菜谱进行对话,或者可能是一种不同的方法,比如除了菜谱之外让 chef-zero 代理所有内容,这有意义吗?

标签: vagrant chef-infra


【解决方案1】:

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

测试厨房已经取代了我过去进行厨师开发的旧工作流程。非常值得学习。

示例

使用社区食谱生成一个安装 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:

伯克斯文件

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

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

metadata

元数据.rb

将“apt”和“java”说明书添加为依赖项:

name 'demo'
..
..

depends "apt"
depends "java"

食谱/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 中的其他项目):

【讨论】:

  • 感谢马克的演练,这与我在过去几个小时里一直在玩的东西一致,它当然很有帮助,但这并不是我想要的.也许一个具体的例子会有所帮助:我有我的食谱“cookbookA”,运行列表在 .kitchen.yml 中定义为“recipe[CookbookA::default]”。我进行了局部更改并进行了厨房收敛以对其进行测试,这很有效。现在,食谱依赖于环境属性。我知道我可以创建一个环境文件并从中读取厨房,但我可以避免这种情况并读取实际的环境属性吗?
  • 我上面的评论空间有限,让我编辑我的问题。
  • 用示例编辑问题,我希望现在更清楚了。
  • @PatoArvizu chef_zero 使用“test/integration”目录作为其主厨存储库。在那里创建您的环境和数据包。例如使用角色请参阅上面的更新或此链接:stackoverflow.com/questions/29812546/…
  • @marc-oconnor 这正是我试图避免的,需要为环境、数据包等创建文件。我在下面发布了一个对我有用的解决方案的答案。这可能不是使用 test-kitchen 的最佳方式,但这正是我想要的。
【解决方案2】:

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

您可以使用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/

这可能是一种不那么多余的方法,但这对我来说现在很有效,因为我只是想记录这个,所以我就这样离开了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    相关资源
    最近更新 更多