新食谱的厨师工作流程

时间:2014-03-20 11:23:44

标签: workflow chef chef-solo

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

  1. 在我的本地计算机上更改食谱
  2. 将修改后的食谱上传到厨师服务器
  3. 在远程计算机上运行chef-client
  4. 重复
  5. 由于我是厨师的新手,我经常重复这个周期非常,但我发现从厨师服务器那里经常上传和下载相当麻烦。

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

    是否有一个工作流程,我可以在使用托管Chef但不上传的情况下直接在我的远程计算机上尝试更改我的cookbook?

2 个答案:

答案 0 :(得分:4)

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

以下示例在虚拟机映像上运行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< - 调用社区食谱配方和LWRP
  4. 运行vagrant将启动使用chef-client配置的虚拟机。 chef zero插件将运行chef-server的本地嵌入式实例。 berkself插件用于自动加载cookbook依赖项。

    vagrant up
    

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

    vagrant provision
    

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

    vagrant destroy -f && vagrant up
    

    Vagrantfile

    控制流浪者的行动。在这种情况下,我只启动一个使用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插件将下载cookbook依赖项,当与chef-zero结合使用时,将在每次配置运行期间上传cookbook。

    metadata.rb

    将nginx添加为cookbook依赖项:

    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 已预先配置为从社区cookbook存储库加载元数据文件中列出的cookbook依赖项。

    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"
    

答案 1 :(得分:1)

我在测试期间的大部分时间都经历过这个循环。但是当我需要在食谱中尝试几个小的改动时,我也使用Chef solo。如果您的测试机器上有您的厨师仓库的本地副本,那么您可以尝试在那里进行更改并运行Chef solo来查看结果。这样就无法上传。