workflow - 新 Recipe 的 Chef 工作流程

标签 workflow chef-infra chef-solo

在编写自己的 Recipe 时,我发现自己一直处于这个循环中:

  1. 更改本地计算机上的 Recipe
  2. 将修改后的 Recipe 上传到 Chef 服务器
  3. 在远程计算机上运行 Chef-client
  4. 重复

由于我是 Chef 新手,所以我经常极其重复这个循环,但我发现如此频繁地从 Chef 服务器上传和下载相当麻烦。

经验丰富的 Chef 用户如何缓解这个循环?我通过免费托管解决方案学习了 Chef,但我不确定仅使用 Chef-solo 是否会更好,一旦我拥有许多服务器并且拥有更多 Chef 经验,稍后再回到托管版本。

是否有一个工作流程,让我可以在使用托管 Chef 时直接在远程计算机上快速尝试对 Recipe 进行更改,但无需上传它们?

最佳答案

我使用 Vagrant 在我的笔记本电脑上本地进行所有开发。当 Recipe 准备好后,它会被推送到新的 Git 存储库主目录,并集成到我的生产 Chef 服务器基础设施中。

以下示例在 virtualbox 镜像上运行 nginx。

示例

安装vagrant插件(只需完成一次):

vagrant plugin install vagrant-omnibus
vagrant plugin install vagrant-berkshelf
vagrant plugin install vagrant-chef-zero

使用Berkshelf生成新的application cookbook .

$ berks cookbook demo
      create  demo/files/default
      create  demo/templates/default
      create  demo/attributes
      create  demo/definitions
      create  demo/libraries
      create  demo/providers
      create  demo/recipes
      create  demo/resources
      create  demo/recipes/default.rb
      create  demo/metadata.rb
      create  demo/LICENSE
      create  demo/README.md
      create  demo/Berksfile
      create  demo/Thorfile
      create  demo/chefignore
      create  demo/.gitignore
         run  git init from "./demo"
      create  demo/Gemfile
      create  demo/Vagrantfile

编辑以下文件(详细信息如下):

  1. Vagrantfile <-- 控制 vagrant 的操作
  2. metadata.rb <-- 列出社区说明书依赖项
  3. recipes/default.rb <-- 调用社区 Recipe 和 LWRP

运行 vagrant 将启动使用 Chef-client 配置的虚拟机。 chef zero插件将运行 Chef 服务器的本地嵌入式实例。 berkself插件用于自动加载cookbook依赖项。

vagrant up

以下命令将重新运行 Chef-client(进行以下编辑):

vagrant provision

最后,使用本地虚拟化进行开发的真正巨大优势是,您可以拆除所有内容并从头开始重新构建:

vagrant destroy -f && vagrant up

流浪文件

控制 vagrant 的操作。在本例中,我仅启动一个使用 Chef-client 进行配置的虚拟机:

Vagrant.require_plugin "vagrant-omnibus"
Vagrant.require_plugin "vagrant-berkshelf"
Vagrant.require_plugin "vagrant-chef-zero"

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  # Box config
  config.vm.box = "saucy64"
  config.vm.box_url = "http://cloud-images.ubuntu.com/vagrant/saucy/current/saucy-server-cloudimg-amd64-vagrant-disk1.box"

  # Virtualbox config
  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", 1024]
  end

  # Networking config
  config.vm.network "private_network", ip: "10.0.0.10"

  # Plugin config
  config.omnibus.chef_version = :latest
  config.chef_zero.enabled = true
  config.berkshelf.enabled = true

  # Chef config
  config.vm.provision :chef_client do |chef|
    chef.add_recipe "demo"
  end
end

综合插件负责安装所需版本的 Chef。 Berkshelf 插件将下载说明书依赖项,并与 Chef-zero 结合使用时,将在每次配置运行期间上传说明书。

元数据.rb

将 nginx 添加为 Recipe 依赖项:

name             'demo'
maintainer       'YOUR_NAME'
maintainer_email 'YOUR_EMAIL'
license          'All rights reserved'
description      'Installs/Configures demo'
long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
version          '0.1.0'

depends "nginx"

Berksfile 已预先配置为从社区说明书存储库加载元数据文件中列出的说明书依赖项。

site :opscode

metadata

Recipe/default.rb

运行默认的 nginx 配方

#
# Cookbook Name:: demo
# Recipe:: default
#
# Copyright (C) 2014 YOUR_NAME
# 
# All rights reserved - Do Not Redistribute
#

include_recipe "nginx"

关于workflow - 新 Recipe 的 Chef 工作流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22531452/

相关文章:

github - 如何共享/扩展/重用/引用 GitHub 工作流?

vagrant - 我可以将部分 Chef.json 移动到数据包吗?

chef-infra - 如何禁用与Chef-Client的 Recipe 同步?

flash - 如何集成 Flash Professional 和 Flash Builder?

.net - Windows 工作流版本 4 和 Visual Studio 2008

ruby-on-rails - 是否有具有用户定义状态的 Ruby on Rails 工作流 gem?

deployment - 在 Chef 中存储密码?

python - 你将如何使用 chef 安装 python 模块?

chef-infra - 使用 chef (solo) 如何设置 root 用户的密码?

chef-solo - 如何覆盖包装工 Chef solo 供应商中的属性