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

  • 在我的本地计算机上更改食谱
  • 将修改后的食谱上传到厨师服务器
  • 在远程机器上运行厨师客户端
  • 重复

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

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

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

    最佳答案

    我使用 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
    

    编辑以下文件(详情如下):
  • Vagrantfile
  • metadata.rb
  • recipes/default.rb
    运行 vagrant 将启动一个使用 Chef-client 配置的虚拟机。 chef zero 插件将运行一个本地嵌入的 Chef-server 实例。 berkself 插件用于自动加载说明书依赖项。
    vagrant up
    

    以下命令将重新运行厨师客户端(以下编辑):
    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
    

    综合插件负责安装所需版本的厨师。 Berkshelf 插件将下载食谱依赖项,当与厨师零结合时,将在每次供应运行期间上传食谱。

    元数据.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"
    

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

  • 10-14 16:08