【问题标题】:Chef workflow for new cookbooks新食谱的厨师工作流程
【发布时间】:2014-03-20 11:23:44
【问题描述】:

在编写自己的食谱时,我发现自己经常处于这个循环中:

  1. 在我的本地计算机上更改食谱
  2. 将修改后的食谱上传到厨师服务器
  3. 在远程机器上运行 chef-client
  4. 重复

由于我是新来的厨师,我经常非常重复这个循环,但我发现从厨师服务器频繁上传和下载相当麻烦。

经验丰富的厨师用户如何缓解这个循环?我通过免费的托管解决方案学习了 Chef,但我不确定我是否应该只使用 Chef-solo 并在我拥有许多服务器和更多使用 Chef 的经验之后再回到托管版本。

是否有一种工作流程,我可以在使用托管 Chef 但无需上传它们的情况下,直接在远程机器上快速尝试更改我的食谱?

【问题讨论】:

  • 你看过 Berkshelf + TK + Vagrant 吗?
  • 我听说过这个组合,但我认为这是一个更高级的主题,只与测试有关。我只有一台小型服务器和两台仅供我使用的工作站,并注册为免费托管厨师的节点。目前我只想获得经验,熟悉厨师并快速运行我的修改,而不需要涉及许多机器缓慢往返的循环。我什至不得不将 Berkshelf 替换为图书管理员,因为它迫使我采用更适合具有多个 devops 的服务器场的复杂工作流程

标签: workflow chef-infra chef-solo


【解决方案1】:

我在笔记本电脑上使用Vagrant 在本地进行所有开发。当食谱准备好后,它会被推送到新的 Git 存储库主页并集成到我的生产厨师服务器基础架构中。

以下示例在 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
  2. metadata.rb
  3. recipes/default.rb

运行 vagrant 将启动使用 chef-client 配置的虚拟机。 chef zero 插件将运行 chef-server 的本地嵌入式实例。 berkself 插件用于自动加载说明书依赖。

vagrant up

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

vagrant provision

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

vagrant destroy -f && vagrant up

流浪文件

控制 vagrant 的操作。在这种情况下,我只启动了一个使用 chef-client 配置的 VM:

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

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

元数据.rb

将 nginx 添加为说明书依赖项:

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

食谱/default.rb

运行默认的 nginx 配方

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

include_recipe "nginx"

【讨论】:

    【解决方案2】:

    我在测试期间大部分时间都在经历这个循环。但是,当我需要尝试对食谱进行一些小改动时,我也会使用 Chef solo。如果您有一台带有本地厨师存储库副本的测试机器,那么您可以尝试在那里进行更改并单独运行厨师以查看结果。这样就不用上传了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 2019-01-29
      • 2014-12-05
      • 1970-01-01
      相关资源
      最近更新 更多