我使用目前使用Capistrano的乘客对nginx上的铁路应用程序的动态配置实例进行了相当复杂的部署。我试图通过创建堆栈,图层,实例和动态应用程序部署来自动化Opsworks上的整个过程。现有的Opsworks配方都没有接近我所需要的,所以我开始自己定制的烹饪书。我正在尝试使用测试厨房和流浪汉测试它们,但Opsworks烹饪书有太多的自定义依赖项在本地使用。因此,我似乎陷入困境,要么只使用我自己的配方来重新发明轮子,这些配方不依赖于Opsworks烹饪书,或者试图在AWS上测试我的烹饪书,这是缓慢而昂贵的。
是否有人在Opsworks上进行任何自定义菜谱开发,如果是这样,您如何测试它?您是否正在使用任何社区食谱,如果是这样,他们在Opsworks上工作有多痛苦?
答案 0 :(得分:6)
我们正在使用Opsworks和很多自定义烹饪书,以及流浪汉。虽然测试覆盖范围远非完美,但它的工作非常顺畅,也适用于社区烹饪书。我们的食谱库是公开的:https://github.com/till/easybib-cookbooks
这个回购的有趣部分是:
is_aws
为真时包含,否则我们会退回到默认的应用程序部署。 浏览我们的食谱应该会为您的问题提供更多提示。我们用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虚拟机完成,因为virtualbox不支持64位计算机的嵌套虚拟化。
mkdir /tmp/packages && cd /tmp/packages
wget https://opscode-omnibus-packages.s3.amazonaws.com/ubuntu/12.04/x86_64/chefdk_0.8.1-1_amd64.deb
sudo dpkg -i chefdk_0.8.0-1_amd64.deb
cd /opt/chefdk/
chef verify
which ruby
echo 'eval "$(chef shell-init bash)"' >> ~/.bash_profile && source ~/.bash_profile
echo 'deb http://download.virtualbox.org/virtualbox/debian vivid contrib' > /etc/apt/sources.list.d/virtualbox.list
wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -
sudo apt-get update -qqy
sudo apt-get install virtualbox-5.0 dkms
cd /tmp/packages
wget https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.4_x86_64.deb
sudo dpkg -i vagrant_1.7.4_x86_64.deb
vagrant plugin install vagrant-berkshelf
vagrant plugin install vagrant-omnibus
vagrant plugin list
mkdir /opt/packer && cd /opt/packer
wget https://dl.bintray.com/mitchellh/packer/packer_0.8.6_linux_amd64.zip
unzip packer_0.8.6_linux_amd64.zip
echo 'PATH=$PATH:/opt/packer' >> ~/.bash_profile && source ~/.bash_profile
mkdir ~/packer && cd ~/packer
git clone https://github.com/pixelcog/opsworks-vm.git
cd opsworks-vm
rake build install
要模拟单个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" Example的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 up
来启动实例。然后,您可以在本地修改您的食谱,并通过使用vagrant provision.
对现有实例重新运行厨师来应用任何更改您可以执行vagrant destroy
和vagrant 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
第一次运行$ 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 / rubygems-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