Chef infra 为开发人员环境提供chef server和vagrant而不注册节点

Chef infra 为开发人员环境提供chef server和vagrant而不注册节点,chef-infra,vagrant,chef-solo,berkshelf,Chef Infra,Vagrant,Chef Solo,Berkshelf,我希望创建一个基于web的应用程序的开发环境,使用vagrant在VM上安装应用程序服务器和数据库服务器。我正在使用开源的chef server和vagrant与chef_clientprovisioner。但是,每次配置开发人员节点时,chef_clientprovisioner都会在chef服务器上创建一个客户端节点。这是不可取的,因为许多开发人员将使用此设置。这样的节点可能会被创建和销毁多次。因此,不需要在chef服务器上维护此类节点的列表 chef_solo是另一个选项,但它要求系统中存

我希望创建一个基于web的应用程序的开发环境,使用vagrant在VM上安装应用程序服务器和数据库服务器。我正在使用开源的chef server和vagrant与
chef_client
provisioner。但是,每次配置开发人员节点时,
chef_client
provisioner都会在chef服务器上创建一个客户端节点。这是不可取的,因为许多开发人员将使用此设置。这样的节点可能会被创建和销毁多次。因此,不需要在chef服务器上维护此类节点的列表

chef_solo
是另一个选项,但它要求系统中存在食谱。我们也使用chef服务器作为烹饪书的存储库。因此,开发人员不需要在他/她的系统中有特定的食谱。我还研究了Berkself,在那里我可以配置chef_api的路径。但这也需要一个节点。以下是我的流浪汉档案:

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "precise64-chef"
  config.vm.network :private_network, ip: "33.33.33.10"
  config.omnibus.chef_version = '11.8.2'
  config.vm.provision "chef_client" do |chef|
    chef.log_level = :debug
    chef.environment = "development"
    chef.delete_node = true
    chef.delete_client = true
    chef.node_name = "sample_app"
    chef.chef_server_url = "https://chef-server-url"
    chef.validation_key_path = "chef-validator.pem"
    chef.add_role "base"
    chef.add_role "pg_client"
    chef.add_role "application_server"
    chef.add_role "db_server"
    chef.add_recipe "deploy_application"
  end
end
我不希望在chef服务器上创建
sample\u应用程序
节点。否则这符合我的目的。欢迎使用chef server提供开发人员环境的任何其他策略。

即时解决方案 屠夫插件 我想到的直接答案是使用插件。这将自动删除chef服务器上的开发者客户端和节点条目

长期解决方案 既然您知道Berkshellf,我假设您有一个典型的企业场景,其中几个开发人员正在共享本地开发的食谱

这是我和厨师正在做的

Chef cookbook存储库模式 保留一个chef server实例作为cookbooks的存储库。每个发布的烹饪书版本都推送到这里,供chef的所有内部用户使用

要维护存储库cookbooks,请使用Jenkins为cookbooks实现CI流程。Jenkins jobs从本地GIT存储库或社区cookbook站点获取数据。这种方法的优点是测试可以使用自动化,QA规则可以使用类似的工具实现。通过这种方式,构建失败有助于提高组织内部使用的食谱的整体质量

我认为,当Berkshellf的家伙们最终发布时,这种存储库模式是我们将要做得更多的事情(另请参阅)

用书架装烹饪书 Berkshelf用于控制将烹饪书加载到所有厨师服务器(dev或prod)中。以下是“Berksfile”的演示:

“chef_api”指令告诉Berkshellf从本地chef cookbook存储库加载所有烹饪书,而不是默认从社区存储库加载

这使得创建主chef服务器的“类似于生产”的副本变得非常简单。它还实现了berkshelf的一个更神奇的方面。系统中的每个食谱都可以有自己的简单Berksfile:

chef_api "https://cookbook.repo.myorg.com/", node_name: "dev1", client_key: "/path/to/dev1/private/key/key.pem"

cookbook "apache2"
cookbook "mysql"
...
chef_api "https://cookbook.repo.myorg.com/".....

metadata
“metadata”语句告诉Berkshelf加载烹饪书元数据文件中作为依赖项列出的烹饪书。这太棒了,一个简单的“berks上传”,所有我需要的烹饪书都会自动加载到我的development chef服务器中

使用Spiceweasel加载chef服务器 非常有用的工具。集成Berkshelf并生成用于从加载厨师服务器的所有其他刀命令

发展:零厨师和流浪汉 一旦食谱得到控制(使用Berkshelf),我的建议是采用。然后,每个开发人员都可以拥有自己的本地管理的chef服务器实例

以下是我经常安装的支持chef cookbook开发的vagrant插件:

  • :确保我正在运行指定版本的chef客户端
  • :下载并管理我的食谱
  • :运行chef server的本地副本

一旦一本烹饪书准备好了,它就会被提交和推送。Jenkins将拿起新版本并自动加载到cookbook存储库中。

这非常有用。一旦我尝试了这种方法,我会将这个答案标记为已被接受。谢谢你的帮助。对我来说,开发人员是java开发人员,他们不维护厨师烹饪书。他们的系统上不会有chef repo,但会使用chef进行本地部署。使用
chef_client
是否可以首先不向chef服务器注册节点?因为我使用角色来定义运行列表,所以Berkshell在这里可能没有用处。我们希望与chef一起简化本地部署。这是一个正确的用例吗?我不这么认为。Chef客户端实体由每个客户端必须对Chef server进行的初始注册创建。节点数据在chef运行结束时创建,基本上是在chef运行期间创建的节点对象的转储。在我看来,最好的方法是使用厨师零插件为流浪者。这样,每个chef服务器实例都在本地运行,只需依靠Berkshelf来保持烹饪书的同步。角色之类的东西也可以保存在git repo中,并由chef zero加载。试试看!