人们如何测试opsworks烹饪书?

22

我有一个相当复杂的部署,使用Passenger在Nginx上动态配置了一些Rail应用程序的实例。目前我正在使用Capistrano来完成整个过程的自动化操作。我正试图在Opsworks上创建堆栈、层、实例和动态应用程序部署。但是,现有的Opsworks配方都不能满足我的需求,因此我开始使用自己的自定义食谱。我正尝试使用test-kitchen和vagrant对它们进行测试,但是Opsworks食谱有太多自定义依赖项,无法在本地使用。所以我似乎陷入两难境地:要么重新发明轮子,只使用自己的食谱而不依赖于Opsworks食谱,要么尝试在AWS上测试我的食谱,这很慢也很昂贵。

有人在Opsworks上开发自定义食谱吗?如果是这样,你是如何测试它的?你是否使用任何社区食谱?如果是,那么让它们在Opsworks上工作起来有多痛苦?

6个回答

6

我们使用Opsworks和许多自定义的cookbook,以及vagrant。虽然测试覆盖范围远非完美,但它可以很好地适应社区cookbook。我们的cookbook存储库是公开的:https://github.com/till/easybib-cookbooks

这个存储库中有一些有趣的部分:

浏览我们的cookbook应该会给你一些有关你的问题的提示。我们使用Travis测试我们的cookbook,并且根本不测试opsworks cookbook。尽管我必须指出,我目前正在那里玩弄一些想法,以便在我们的测试运行中集成它们,因为没有它们的providers,测试我们的deploy cookbook几乎是不可能的。


第一和第二个链接出现404错误。 - Gilles Quénot

6
Opsworks现在支持Chef 11.10和Berkshelf (http://berkshelf.com/) 来管理依赖项,这使得使用自定义cookbook变得更加容易。

我一直很满意使用Test Kitchen (https://github.com/test-kitchen/test-kitchen)和Vagrant & Chef Solo进行本地测试。

此外,您可以从Opsworks堆栈的堆栈设置页面手动运行特定的recipes。请看这里: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


1
这听起来不错,但是如何测试依赖于OpsWorks cookbooks的自定义cookbooks呢?目前我能想到的唯一方法是将它们作为子模块包含,并在Berksfile中根据某些特定条件进行要求。 - Hugo

4
这个页面上有很多有用的建议,但我强烈建议大家查看Mike Greiling的博客文章Simplify OpsWorks Development With Packer和他的github仓库opsworks-vm,这可以帮助您模拟整个OpsWorks堆栈,包括安装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. 这将安装一个新的虚拟机到 ~/.vagrant.d/boxes/ubuntu1404-opsworks/

为了模拟一个单个的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 "入门"示例,其中包括下面的stack.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不熟悉,您只需执行vagrant up就可以启动实例。然后您可以在本地修改您的cookbook,任何更改都可以通过使用vagrant provision重新运行chef来应用于现有实例。 您可以执行vagrant destroyvagrant up以从头开始。


2
Opsworks的cookbooks是建立在他们自定义的boxes之上的,所以在本地VM中设置一个可以运行他们和你自己cookbooks的环境是一项挑战。幸运的是,这个项目已经重新创建了他们的Ubuntu box。在此基础上,我建立了一个本地vagrant环境,可以运行Opsworks cookbooks和我的一个cookbook。使用这个环境,你可以在部署之前在一个几乎相同的本地环境中进行测试。请参考:https://github.com/wwestenbrink/vagrant-opsworkshttps://github.com/erupenkman/opsworks-example。请注意保留HTML标签。

为Windows Server拥有同样的东西肯定是很好的。目前测试配方还是相当麻烦的。 - CB-Dan

1

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

已知的错误

第一次运行$ 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] 致命错误:堆栈跟踪转储到/tmp/kitchen/cache/chef-stacktrace.out[2016-04-08T17:08:34+00:00] 致命错误:如果您提交错误报告,请提供stacktrace.out文件的内容[2016-04-08T17:08:34+00:00] 错误:ruby_blockFallback for remote_file[/tmp/rubygems-2.2.2.tgz] had an error: NoMethodError: remote_file/tmp/rubygems-2.2.2.tgz had an error: NoMethodError: undefined method `to_sym' for [:create]:Array [2016-04-08T17:08:34+00:00] 致命错误:Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)

只需再次运行:

$ chef exec kitchen setup


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接