人们如何测试opsworks cookbook?

时间:2014-03-24 11:43:52

标签: chef aws-opsworks

我使用目前使用Capistrano的乘客对nginx上的铁路应用程序的动态配置实例进行了相当复杂的部署。我试图通过创建堆栈,图层,实例和动态应用程序部署来自动化Opsworks上的整个过程。现有的Opsworks配方都没有接近我所需要的,所以我开始自己定制的烹饪书。我正在尝试使用测试厨房和流浪汉测试它们,但Opsworks烹饪书有太多的自定义依赖项在本地使用。因此,我似乎陷入困境,要么只使用我自己的配方来重新发明轮子,这些配方不依赖于Opsworks烹饪书,或者试图在AWS上测试我的烹饪书,这是缓慢而昂贵的。

是否有人在Opsworks上进行任何自定义菜谱开发,如果是这样,您如何测试它?您是否正在使用任何社区食谱,如果是这样,他们在Opsworks上工作有多痛苦?

6 个答案:

答案 0 :(得分:6)

我们正在使用Opsworks和很多自定义烹饪书,以及流浪汉。虽然测试覆盖范围远非完美,但它的工作非常顺畅,也适用于社区烹饪书。我们的食谱库是公开的:https://github.com/till/easybib-cookbooks

这个回购的有趣部分是:

浏览我们的食谱应该会为您的问题提供更多提示。我们用Travis测试我们的食谱,并且根本不测试opsworks烹饪书。虽然我必须注意到我目前在那里玩一些想法如何将它们集成到我们的测试运行中,因为没有他们的提供者,测试我们的部署cookbook几乎是不可能的。

答案 1 :(得分:6)

Opsworks现在支持Chef 11.10和Berkshelf(http://berkshelf.com/)来管理依赖关系,这使得使用自定义菜谱。许多。更容易。

我对测试厨房(https://github.com/test-kitchen/test-kitchen)与Vagrant&主厨Solo进行本地测试。

此外,您可以从堆栈设置页面手动运行Opsworks堆栈上的特定配方。看看这里:http://docs.aws.amazon.com/opsworks/latest/userguide/workingcookbook-manual.html

您还可以在Opsworks部署期间使用一些自定义JSON运行cookbook测试:http://docs.aws.amazon.com/opsworks/latest/userguide/troubleshoot-debug-test.html

答案 2 :(得分:3)

此页面上有很多有用的建议,但我强烈建议所有人查看Mike Greiling的博文Simplify OpsWorks Development With Packer和他的github repo opsworks-vm ,它们可以帮助您模拟整个操作系统堆栈,包括opsworks代理的安装,因此您还可以同时测试应用部署配方,多个层,多个实例等。这真是令人印象深刻。

Ubuntu 14.04快速入门

注意:这不能从ubuntu虚拟机完成,因为virtualbox不支持64位计算机的嵌套虚拟化。

  1. 安装ChefDK
    1. mkdir /tmp/packages && cd /tmp/packages
    2. wget https://opscode-omnibus-packages.s3.amazonaws.com/ubuntu/12.04/x86_64/chefdk_0.8.1-1_amd64.deb
    3. sudo dpkg -i chefdk_0.8.0-1_amd64.deb
    4. cd /opt/chefdk/
    5. chef verify
    6. which ruby
    7. echo 'eval "$(chef shell-init bash)"' >> ~/.bash_profile && source ~/.bash_profile
  2. 安装VirtualBox
    1. echo 'deb http://download.virtualbox.org/virtualbox/debian vivid contrib' > /etc/apt/sources.list.d/virtualbox.list
    2. wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -
    3. sudo apt-get update -qqy
    4. sudo apt-get install virtualbox-5.0 dkms
  3. 安装Vagrant
    1. cd /tmp/packages
    2. wget https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.4_x86_64.deb
    3. sudo dpkg -i vagrant_1.7.4_x86_64.deb
    4. vagrant plugin install vagrant-berkshelf
    5. vagrant plugin install vagrant-omnibus
    6. vagrant plugin list
  4. 安装Packer
    1. mkdir /opt/packer && cd /opt/packer
    2. wget https://dl.bintray.com/mitchellh/packer/packer_0.8.6_linux_amd64.zip
    3. unzip packer_0.8.6_linux_amd64.zip
    4. echo 'PATH=$PATH:/opt/packer' >> ~/.bash_profile && source ~/.bash_profile
  5. 使用Packer构建Mike Greiling的opsworks-vm虚拟框图像
    1. mkdir ~/packer && cd ~/packer
    2. git clone https://github.com/pixelcog/opsworks-vm.git
    3. cd opsworks-vm
    4. rake build install
    5. 这会将新的虚拟机vm安装到〜/ .vagrant.d / boxes / ubuntu1404-opsworks /
  6. 要模拟单个opsworks实例,请创建一个新的Vagrantfile,如下所示:

    Vagrant.configure("2") do |config|
      config.vm.box = "ubuntu1404-opsworks"
      config.vm.provision :opsworks, type: 'shell', args: 'path/to/dna.json'
    end
    

    dna.json文件路径是相对于Vagrantfile设置的,应包含您希望发送给OpsWorks Chef的任何JSON数据。

    例如:

    {
      "deploy": {
        "my-app": {
          "application_type": "php",
          "scm": {
            "scm_type": "git",
            "repository": "path/to/my-app"
          }
        }
      },
      "opsworks_custom_cookbooks": {
        "enabled": true,
        "scm": {
          "repository": "path/to/my-cookbooks"
        },
        "recipes": [
          "recipe[opsworks_initial_setup]",
          "recipe[dependencies]",
          "recipe[mod_php5_apache2]",
          "recipe[deploy::default]",
          "recipe[deploy::php]",
          "recipe[my_custom_cookbook::configure]"
        ]
      }
    }
    

    要模拟多个opsworks实例并包含图层,请参阅下面包含AWS OpsWorks "Getting Started" Examplestack.json

    Vagrantfile(适用于多个实例)

    Vagrant.configure("2") do |config|
    
      config.vm.box = "ubuntu1404-opsworks"
    
      # Create the php-app layer
      config.vm.define "app" do |layer|
    
        layer.vm.provision "opsworks", type:"shell", args:[
          'ops/dna/stack.json',
          'ops/dna/php-app.json'
        ]
    
        # Forward port 80 so we can see our work
        layer.vm.network "forwarded_port", guest: 80, host: 8080
        layer.vm.network "private_network", ip: "10.10.10.10"
      end
    
      # Create the db-master layer
      config.vm.define "db" do |layer|
    
        layer.vm.provision "opsworks", type:"shell", args:[
          'ops/dna/stack.json',
          'ops/dna/db-master.json'
        ]
    
        layer.vm.network "private_network", ip: "10.10.10.20"
      end
    end
    

    stack.json

    {
      "opsworks": {
        "layers": {
          "php-app": {
            "instances": {
              "php-app1": {"private-ip": "10.10.10.10"}
            }
          },
          "db-master": {
            "instances": {
              "db-master1": {"private-ip": "10.10.10.20"}
            }
          }
        }
      },
      "deploy": {
        "simple-php": {
          "application_type": "php",
          "document_root": "web",
          "scm": {
            "scm_type": "git",
            "repository": "dev/simple-php"
          },
          "memcached": {},
          "database": {
            "host": "10.10.10.20",
            "database": "simple-php",
            "username": "root",
            "password": "correcthorsebatterystaple",
            "reconnect": true
          }
        }
      },
      "mysql": {
        "server_root_password": "correcthorsebatterystaple",
        "tunable": {"innodb_buffer_pool_size": "256M"}
      },
      "opsworks_custom_cookbooks": {
        "enabled": true,
        "scm": {
          "repository": "ops/cookbooks"
        }
      }
    }
    

    对于那些不熟悉流浪汉的人,你只需要vagrant up来启动实例。然后,您可以在本地修改您的食谱,并通过使用vagrant provision.对现有实例重新运行厨师来应用任何更改您可以执行vagrant destroyvagrant up从头开始

答案 3 :(得分:2)

Opsworks cookbook以他们的自定义盒子为基础,因此设置本地VM可以在其中运行他们的烹饪书,这是一个挑战,

幸运的是,他们的Ubuntu盒已经被这个项目重新创建。 https://github.com/wwestenbrink/vagrant-opsworks

在此基础上,我建立了一个本地流浪汉环境,运行opsworks cookbook和我自己的一个。 https://github.com/erupenkman/opsworks-example

通过这种方式,您可以在部署之前在几乎相同的本地环境中进行测试。

答案 4 :(得分:0)

Checkout Travis-ci和sous-chef你可能会发现它适合测试食谱等,并且他们也有opsworks的部署配置。

https://github.com/michaelklishin/sous-chef http://docs.travis-ci.com/user/deployment/opsworks/

答案 5 :(得分:0)

我能够使用Chef + Kitchen + Vagrant解决这个问题

这是我的包装器:https://github.com/elitechance/opsworks-cookbooks-wrapper

以下是如何测试

git clone https://github.com/elitechance/opsworks-cookbooks-wrapper.git

git clone https://github.com/aws/opsworks-cookbooks.git

cd opsworks-cookbooks-wrapper

cp .kitchen.sample.yml .kitchen.yml

cp Berksfile.sample Berksfile

cp metadata.sample.rb metadata.rb

最后一个命令将模拟OpsWorks NodeJs设置配方,有关详细信息,请参阅.kitchen.sample.yml

$ chef exec kitchen setup

KNOWN BUGS

第一次运行$ chef exec kitchen setup时,您会遇到以下错误:

  

运行处理程序:[2016-04-08T17:08:34 + 00:00]错误:运行异常处理程序运行处理程序完成[2016-04-08T17:08:34 + 00:00]错误:异常处理程序完成Chef客户失败了。 43资源更新时间01分02秒[2016-04-08T17:08:34 + 00:00]致命:Stacktrace转储到/tmp/kitchen/cache/chef-stacktrace.out [2016-04-08T17:08:34 +00:00]致命:如果您提交错误报告,请提供stacktrace.out文件的内容[2016-04-08T17:08:34 + 00:00] ERROR:对于remote_file的ruby_blockFallback [/tmp/rubygems-2.2 .2.tgz]有一个错误:NoMethodError:remote_file / tmp / ruby​​gems-2.2.2.tgz有一个错误:NoMethodError:[:create]:Array的未定义方法`to_sym'[2016-04-08T17:08:34 +00:00]致命:Chef :: Exceptions :: ChildConvergeError:Chef run process退出失败(退出代码1)

再次运行:

$ chef exec kitchen setup