仅限本地模式食谱中的厨师
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"
}
并从那个数据包中读取我的厨房测试;但这正是我要避免的。是否可以:
- 指示test-kitchen从厨师服务器获取实际数据包,
- 让 chef-zero 检索数据包的临时副本以进行本地测试,或者
- 快速"dump"本地远程Chef服务器的内容?
我希望这是有道理的。如有必要,我可以添加一些上下文。
测试厨房是驱赶流浪者的最佳途径。它提供了您正在寻找的与零号厨师的集成。使您能够在本地完全模拟您的生产 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/
可能有一种不那么多余的方法来执行此操作,但这现在对我有用,并且由于我只想记录下来,所以我就这样离开了。
我正在尝试建立一个工作流来在本地开发 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"
}
并从那个数据包中读取我的厨房测试;但这正是我要避免的。是否可以:
- 指示test-kitchen从厨师服务器获取实际数据包,
- 让 chef-zero 检索数据包的临时副本以进行本地测试,或者
- 快速"dump"本地远程Chef服务器的内容?
我希望这是有道理的。如有必要,我可以添加一些上下文。
测试厨房是驱赶流浪者的最佳途径。它提供了您正在寻找的与零号厨师的集成。使您能够在本地完全模拟您的生产 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/
可能有一种不那么多余的方法来执行此操作,但这现在对我有用,并且由于我只想记录下来,所以我就这样离开了。