dreadpiratepj-poolparty 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +12 -0
- data/Manifest +115 -0
- data/README.txt +140 -0
- data/Rakefile +27 -0
- data/bin/instance +61 -0
- data/bin/pool +62 -0
- data/config/cloud_master_takeover +17 -0
- data/config/create_proxy_ami.sh +582 -0
- data/config/haproxy.conf +29 -0
- data/config/heartbeat.conf +8 -0
- data/config/heartbeat_authkeys.conf +2 -0
- data/config/installers/ubuntu_install.sh +77 -0
- data/config/monit.conf +9 -0
- data/config/monit/haproxy.monit.conf +7 -0
- data/config/monit/nginx.monit.conf +0 -0
- data/config/nginx.conf +24 -0
- data/config/reconfigure_instances_script.sh +18 -0
- data/config/sample-config.yml +23 -0
- data/config/scp_instances_script.sh +12 -0
- data/lib/core/array.rb +13 -0
- data/lib/core/exception.rb +9 -0
- data/lib/core/float.rb +13 -0
- data/lib/core/hash.rb +11 -0
- data/lib/core/kernel.rb +12 -0
- data/lib/core/module.rb +22 -0
- data/lib/core/object.rb +18 -0
- data/lib/core/proc.rb +15 -0
- data/lib/core/string.rb +49 -0
- data/lib/core/time.rb +41 -0
- data/lib/modules/callback.rb +133 -0
- data/lib/modules/ec2_wrapper.rb +82 -0
- data/lib/modules/safe_instance.rb +31 -0
- data/lib/modules/vlad_override.rb +82 -0
- data/lib/poolparty.rb +105 -0
- data/lib/poolparty/application.rb +170 -0
- data/lib/poolparty/init.rb +6 -0
- data/lib/poolparty/master.rb +329 -0
- data/lib/poolparty/monitors.rb +13 -0
- data/lib/poolparty/monitors/cpu.rb +19 -0
- data/lib/poolparty/monitors/memory.rb +26 -0
- data/lib/poolparty/monitors/web.rb +23 -0
- data/lib/poolparty/optioner.rb +16 -0
- data/lib/poolparty/plugin.rb +43 -0
- data/lib/poolparty/plugin_manager.rb +67 -0
- data/lib/poolparty/provider.rb +2 -0
- data/lib/poolparty/provider/packages/essential.rb +6 -0
- data/lib/poolparty/provider/packages/git.rb +4 -0
- data/lib/poolparty/provider/packages/haproxy.rb +20 -0
- data/lib/poolparty/provider/packages/heartbeat.rb +4 -0
- data/lib/poolparty/provider/packages/monit.rb +6 -0
- data/lib/poolparty/provider/packages/rsync.rb +4 -0
- data/lib/poolparty/provider/packages/ruby.rb +37 -0
- data/lib/poolparty/provider/packages/s3fuse.rb +11 -0
- data/lib/poolparty/provider/provider.rb +60 -0
- data/lib/poolparty/remote_instance.rb +216 -0
- data/lib/poolparty/remoter.rb +106 -0
- data/lib/poolparty/remoting.rb +112 -0
- data/lib/poolparty/scheduler.rb +103 -0
- data/lib/poolparty/tasks.rb +29 -0
- data/lib/poolparty/tasks/cloud.rake +57 -0
- data/lib/poolparty/tasks/development.rake +38 -0
- data/lib/poolparty/tasks/ec2.rake +20 -0
- data/lib/poolparty/tasks/instance.rake +63 -0
- data/lib/poolparty/tasks/plugins.rake +30 -0
- data/lib/poolparty/tasks/server.rake +42 -0
- data/lib/poolparty/tmp.rb +46 -0
- data/lib/s3/s3_object_store_folders.rb +44 -0
- data/misc/basics_tutorial.txt +142 -0
- data/poolparty.gemspec +72 -0
- data/spec/application_spec.rb +39 -0
- data/spec/callback_spec.rb +194 -0
- data/spec/core_spec.rb +15 -0
- data/spec/helpers/ec2_mock.rb +44 -0
- data/spec/kernel_spec.rb +11 -0
- data/spec/master_spec.rb +203 -0
- data/spec/monitors/cpu_monitor_spec.rb +38 -0
- data/spec/monitors/memory_spec.rb +50 -0
- data/spec/monitors/misc_monitor_spec.rb +50 -0
- data/spec/monitors/web_spec.rb +39 -0
- data/spec/optioner_spec.rb +22 -0
- data/spec/plugin_manager_spec.rb +31 -0
- data/spec/plugin_spec.rb +101 -0
- data/spec/pool_binary_spec.rb +10 -0
- data/spec/poolparty_spec.rb +15 -0
- data/spec/provider_spec.rb +17 -0
- data/spec/remote_instance_spec.rb +149 -0
- data/spec/remoter_spec.rb +65 -0
- data/spec/remoting_spec.rb +84 -0
- data/spec/scheduler_spec.rb +75 -0
- data/spec/spec_helper.rb +39 -0
- data/spec/string_spec.rb +28 -0
- data/web/static/conf/nginx.conf +22 -0
- data/web/static/site/images/balloon.png +0 -0
- data/web/static/site/images/cb.png +0 -0
- data/web/static/site/images/clouds.png +0 -0
- data/web/static/site/images/railsconf_preso_img.png +0 -0
- data/web/static/site/index.html +71 -0
- data/web/static/site/javascripts/application.js +3 -0
- data/web/static/site/javascripts/corner.js +178 -0
- data/web/static/site/javascripts/jquery-1.2.6.pack.js +11 -0
- data/web/static/site/misc.html +42 -0
- data/web/static/site/storage/pool_party_presentation.pdf +0 -0
- data/web/static/site/stylesheets/application.css +100 -0
- data/web/static/site/stylesheets/reset.css +17 -0
- data/web/static/src/layouts/application.haml +25 -0
- data/web/static/src/pages/index.haml +25 -0
- data/web/static/src/pages/misc.haml +5 -0
- data/web/static/src/stylesheets/application.sass +100 -0
- metadata +260 -0
@@ -0,0 +1,20 @@
|
|
1
|
+
namespace(:ec2) do
|
2
|
+
task :init do
|
3
|
+
Application.options
|
4
|
+
end
|
5
|
+
# Start a new instance in the cloud
|
6
|
+
desc "Add and start an instance to the pool"
|
7
|
+
task :start_new_instance => [:init] do
|
8
|
+
puts PoolParty::Remoting.new.launch_new_instance!
|
9
|
+
end
|
10
|
+
# Stop all the instances via command-line
|
11
|
+
desc "Stop all running instances"
|
12
|
+
task :stop_running_instances => [:init] do
|
13
|
+
Thread.new {`ec2-describe-instances | grep INSTANCE | grep running | awk '{print $2}' | xargs ec2-terminate-instances`}
|
14
|
+
end
|
15
|
+
# Reboot the instances via commandline
|
16
|
+
desc "Restart all running instances"
|
17
|
+
task :restart_running_instances => [:init] do
|
18
|
+
Thread.new {`ec2-describe-instances | grep INSTANCE | grep running | awk '{print $2}' | xargs ec2-reboot-instances`}
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
namespace(:instance) do
|
2
|
+
# Find the instance we want to deal with
|
3
|
+
# interface can be: num=0, i=0, inst=0, 0
|
4
|
+
# defaults to the master instance (0)
|
5
|
+
task :init do
|
6
|
+
num = (ENV['num'] || ENV["i"] || ENV["inst"] || ARGV.shift || 0).to_i
|
7
|
+
raise Exception.new("Please set the number of the instance (i.e. num=1, i=1, or as an argument)") unless num
|
8
|
+
@node = PoolParty::Master.new.get_node(num)
|
9
|
+
end
|
10
|
+
# Ssh into the node
|
11
|
+
desc "Remotely login to the remote instance"
|
12
|
+
task :ssh => [:init] do
|
13
|
+
@node.ssh
|
14
|
+
end
|
15
|
+
desc "Send a file to the remote instance"
|
16
|
+
task :exec => :init do
|
17
|
+
@node.ssh ENV['cmd']
|
18
|
+
end
|
19
|
+
# Send a file to the remote instance
|
20
|
+
# as designated by src='' and dest=''
|
21
|
+
desc "Send a file to the remote instance"
|
22
|
+
task :scp => :init do
|
23
|
+
@node.scp ENV['src'], ENV['dest']
|
24
|
+
end
|
25
|
+
# Execute a command on the remote instance as designated
|
26
|
+
# by cmd=''
|
27
|
+
desc "Execute cmd on a remote instance"
|
28
|
+
task :exec => [:init] do
|
29
|
+
cmd = ENV['cmd'] || "ls -l"
|
30
|
+
puts @node.ssh(cmd.runnable)
|
31
|
+
end
|
32
|
+
# Restart all the services monitored by monit
|
33
|
+
desc "Restart all the services"
|
34
|
+
task :reload => [:init] do
|
35
|
+
@node.restart_with_monit
|
36
|
+
end
|
37
|
+
# Start all the services monitored by monit
|
38
|
+
desc "Start all services"
|
39
|
+
task :load => [:init] do
|
40
|
+
@node.start_with_monit
|
41
|
+
end
|
42
|
+
# Stop the services monitored by monit
|
43
|
+
desc "Stop all services"
|
44
|
+
task :stop => [:init] do
|
45
|
+
@node.stop_with_monit
|
46
|
+
end
|
47
|
+
# Install the required services on this node
|
48
|
+
desc "Install stack on this node"
|
49
|
+
task :install => :init do
|
50
|
+
@node.install
|
51
|
+
end
|
52
|
+
# Turnoff this instance
|
53
|
+
desc "Teardown instance"
|
54
|
+
task :shutdown => :init do
|
55
|
+
`ec2-terminate-instances #{@node.instance_id}`
|
56
|
+
end
|
57
|
+
# Configure this node and start the services
|
58
|
+
desc "Configure the stack on this node"
|
59
|
+
task :configure => :init do
|
60
|
+
@node.configure
|
61
|
+
@node.restart_with_monit
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
namespace(:plugin) do
|
2
|
+
task :init do
|
3
|
+
@command = ARGV.shift # Get rid of the command
|
4
|
+
@name = (ENV['location'] || ENV["l"] || ARGV.shift)
|
5
|
+
unless @name
|
6
|
+
puts <<-EOM
|
7
|
+
Usage:
|
8
|
+
rake #{@command} location
|
9
|
+
|
10
|
+
Example:
|
11
|
+
rake #{@command} git://github.com/auser/pool-party-plugins.git
|
12
|
+
|
13
|
+
Check the help does for more information how to install a plugin
|
14
|
+
http://poolpartyrb.com
|
15
|
+
|
16
|
+
EOM
|
17
|
+
exit
|
18
|
+
end
|
19
|
+
end
|
20
|
+
desc "Install a plugin from a git repository"
|
21
|
+
task :install => :init do |command|
|
22
|
+
PoolParty::PluginManager.install_plugin @name
|
23
|
+
end
|
24
|
+
desc "Remove an installed plugin"
|
25
|
+
task :remove => :init do |command|
|
26
|
+
PoolParty::PluginManager.remove_plugin @name
|
27
|
+
end
|
28
|
+
rule "" do |t|
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# Tasks to be run on the server
|
2
|
+
namespace(:server) do
|
3
|
+
task :init do
|
4
|
+
PoolParty::Coordinator.init(false)
|
5
|
+
end
|
6
|
+
# bundle, upload and register your bundle on the server
|
7
|
+
desc "Bundle, upload and register your ami"
|
8
|
+
task :all => [:bundle, :upload, :register] do
|
9
|
+
puts "== your ami is ready"
|
10
|
+
end
|
11
|
+
# Cleanup the /mnt directory
|
12
|
+
desc "Clean the /mnt directory"
|
13
|
+
task :clean_mnt do
|
14
|
+
`rm -rf /mnt/image* img*`
|
15
|
+
end
|
16
|
+
# Before we can bundle, we have to make sure we have the cert and pk files
|
17
|
+
desc "Ensure the required bundle files are present in /mnt"
|
18
|
+
task :check_bundle_files do
|
19
|
+
raise Exception.new("You must have a private key in your /mnt directory") unless File.exists?("/mnt/pk-*.pem")
|
20
|
+
raise Exception.new("You must have your access key in your /mnt directory") unless File.exists?("/mnt/cert-*.pem")
|
21
|
+
end
|
22
|
+
# Bundle the image
|
23
|
+
desc "Bundle this image into the /mnt directory"
|
24
|
+
task :bundle => [:clean_mnt, :check_bundle_files] do
|
25
|
+
puts `ec2-bundle-vol -k /mnt/pk-*.pem -u '#{Planner.user_id}' -d /mnt -c /mnt/cert-*.pem -r i386`
|
26
|
+
end
|
27
|
+
# Upload the bundle into the app_name bucket
|
28
|
+
desc "Upload the bundle to your bucket with a unique name: deletes old ami"
|
29
|
+
task :upload => [:init, :delete_bucket] do
|
30
|
+
puts `ec2-upload-bundle -b #{Planner.app_name} -m /mnt/image.manifest.xml -a #{Planner.access_key} -s #{Planner.secret_access_key}`
|
31
|
+
end
|
32
|
+
# Register the bucket with amazon and get back an ami
|
33
|
+
desc "Register the bundle with amazon"
|
34
|
+
task :register do
|
35
|
+
puts `ec2-register -K /mnt/pk-*.pem -C /mnt/cert-*.pem #{Planner.app_name}/image.manifest.xml`
|
36
|
+
end
|
37
|
+
# Delete the bucket
|
38
|
+
desc "Delete the bucket with the bundle under tha app name"
|
39
|
+
task :delete_bucket do
|
40
|
+
Planner.app_name.delete_bucket
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__))
|
2
|
+
require "backcall"
|
3
|
+
require "remoter"
|
4
|
+
class Test
|
5
|
+
include PoolParty::Remoter
|
6
|
+
include Callbacks
|
7
|
+
|
8
|
+
after :initialize, :set_hosts
|
9
|
+
def rt
|
10
|
+
@rt ||= Rake::RemoteTask
|
11
|
+
end
|
12
|
+
|
13
|
+
def set_hosts(c)
|
14
|
+
rt.host "myslice", :app, :db
|
15
|
+
end
|
16
|
+
|
17
|
+
def rtask(name, *args, &block)
|
18
|
+
rt.remote_task(name.to_sym => args, &block)
|
19
|
+
end
|
20
|
+
|
21
|
+
def scp local, remote
|
22
|
+
require "tempfile"
|
23
|
+
rtask(:scp) do
|
24
|
+
put remote do
|
25
|
+
open(local).read
|
26
|
+
end
|
27
|
+
end.execute
|
28
|
+
end
|
29
|
+
before :scp, :set_hosts
|
30
|
+
def ssh command=nil, &block
|
31
|
+
block = Proc.new do
|
32
|
+
run command
|
33
|
+
end
|
34
|
+
rtask(:ssh, &block).execute
|
35
|
+
end
|
36
|
+
before :ssh, :set_hosts
|
37
|
+
end
|
38
|
+
|
39
|
+
t = Test.new
|
40
|
+
t.scp("/Users/auser/Sites/work/citrusbyte/internal/gems/pool-party/pool/CHANGELOG", "ho")
|
41
|
+
t.ssh("ls -l")
|
42
|
+
t.ssh <<-EOE
|
43
|
+
ls -l
|
44
|
+
mv ho CHANGELOG
|
45
|
+
cat CHANGELOG
|
46
|
+
EOE
|
@@ -0,0 +1,44 @@
|
|
1
|
+
=begin rdoc
|
2
|
+
S3 overloads
|
3
|
+
=end
|
4
|
+
module AWS
|
5
|
+
module S3
|
6
|
+
class S3Object
|
7
|
+
class << self
|
8
|
+
|
9
|
+
alias :original_store :store
|
10
|
+
def store(key, data, bucket = nil, options = {})
|
11
|
+
store_folders(key, bucket, options) if options[:use_virtual_directories]
|
12
|
+
original_store(key, data, bucket, options)
|
13
|
+
end
|
14
|
+
|
15
|
+
def streamed_store(key, filepath, bucket = nil, options = {})
|
16
|
+
store_folders(key, bucket, options) if options[:use_virtual_directories]
|
17
|
+
store(key,File.open(filepath), bucket)
|
18
|
+
end
|
19
|
+
|
20
|
+
def store_directory(directory, bucket, options = {})
|
21
|
+
Dir[File.join(directory, "*")].each do |file|
|
22
|
+
streamed_store("#{File.basename(File.dirname(file))}/#{File.basename(file)}", file, bucket, options.update(:use_virtual_directories => true))
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def store_folders(key, bucket = nil, options = {})
|
27
|
+
folders = key.split("/")
|
28
|
+
folders.slice!(0)
|
29
|
+
folders.pop
|
30
|
+
current_folder = "/"
|
31
|
+
folders.each {|folder|
|
32
|
+
current_folder += folder
|
33
|
+
store_folder(current_folder, bucket, options)
|
34
|
+
current_folder += "/"
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
def store_folder(key, bucket = nil, options = {})
|
39
|
+
original_store(key + "_$folder$", "", bucket, options) # store the magic entry that emulates a folder
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
PoolParty, a tutorial.
|
2
|
+
|
3
|
+
To get PoolParty up and running on your very own ec2 instances, you have to do a few things in preparation first.
|
4
|
+
|
5
|
+
First, install the gem with:
|
6
|
+
|
7
|
+
sudo gem install auser-poolparty -s http://gems.github.com
|
8
|
+
|
9
|
+
First, head on over to http://aws.amazon.com and sign up for an account. Make sure you make note of the access key and the secret access key on the access identifiers page. Also, scroll down to the bottom of that page and download your x.509 certificate and the private one as well. You only can generate that once, so make sure you download it immediately. Finally, take note of your account id.
|
10
|
+
|
11
|
+
Now, let's get to some PoolParty setup. PoolParty only requires one file, a configuration file. Once you get this setup, PoolParty will do the rest for you, so let's get started editing the config file.
|
12
|
+
|
13
|
+
There is a generator in progress, so if by the time you read this and you have the gem installed, type
|
14
|
+
|
15
|
+
which poolparty
|
16
|
+
|
17
|
+
If you get a response, then the generator has been built and you can skip this section and go right to the next 'using it' section, however, if not or you just want to understand the innerworkings, read on.
|
18
|
+
|
19
|
+
config/config.yml
|
20
|
+
PoolParty makes the guess that your config is in a file and is in config/config.yml in your base project directory. However, this is not necessary if you do not want a configuration file, since all options can be added at runtime using switches on the command-line. That being said, the easiest way is to write a config file.
|
21
|
+
|
22
|
+
The minimal config file looks like this:
|
23
|
+
|
24
|
+
:access_key: "1XCTNEK1CC5BQXXXXXXX"
|
25
|
+
:secret_access_key: "Q2qJHP0S2iOKikn9glB+XXXX/XXXXXXXX/XXXXXXX"
|
26
|
+
:ami: "ami-3057b259"
|
27
|
+
|
28
|
+
That's it. However,a more complete one would look more like this:
|
29
|
+
|
30
|
+
:app_name: "test_app"
|
31
|
+
:user_id: "1619-6456-1111"
|
32
|
+
:access_key: "1XCTNEK1CC5BQXXXXXXX"
|
33
|
+
:secret_access_key: "Q2qJHP0S2iOKikn9glB+XXXX/XXXXXXXX/XXXXXXX"
|
34
|
+
:ami: "ami-3057b259"
|
35
|
+
:size: small
|
36
|
+
:polling_time: "5.minutes"
|
37
|
+
:minimum_instances: 2
|
38
|
+
:maximum_instances: 10
|
39
|
+
:ec2_dir: "/Users/user/.ec2"
|
40
|
+
:keypair: user
|
41
|
+
:os: ubuntu
|
42
|
+
:host_port: 80
|
43
|
+
:shared_bucket: "pool-party-app-data"
|
44
|
+
:environment: production
|
45
|
+
:contract_when:
|
46
|
+
web > 10
|
47
|
+
cpu < 0.2
|
48
|
+
:expand_when:
|
49
|
+
cpu > 0.45
|
50
|
+
web < 10
|
51
|
+
|
52
|
+
Most of it should be self-explanatory, but a few points are necessary to describe. ec2_dir and keypair are for your location development machine. If you didn't create a keypair, not to worry, put in anything here. If you did, it's the name of the keypair you added. This is important for working with the instances after you get them up.
|
53
|
+
|
54
|
+
If you put in a bucket in the shared_bucket key, the instances will automount that bucket to the /data drive. If you leave it out or don't include it, then it won't.
|
55
|
+
|
56
|
+
The master instance takes care of monitoring the cloud for you. If the the parameters you set in the contract_when and expand_when are met, then the cloud will respond accordingly. Those are based on monitors that are included in PoolParty.
|
57
|
+
|
58
|
+
The installation of the required software for PoolParty is taken care of by PoolParty. That being said, PoolParty makes no assumptions of what the cloud's responsibilities will be. See 'Using' later on.
|
59
|
+
|
60
|
+
Monitors
|
61
|
+
The monitors are flexible and extensible. Currently included in PoolParty are monitors that monitor web requests and cpu and memory percentages. Writing a monitor or a plugin are out of the scope of this tutorial, but will be included in future tutorials.
|
62
|
+
|
63
|
+
Configuring
|
64
|
+
It can be tedious setting up just your development machine. This is why PoolParty makes it super easy for you in just one rake task.
|
65
|
+
|
66
|
+
If you are not familiar with ruby, I suggest you look into it, it's a beautiful language. However, PoolParty is language-agnostic, so not to worry.
|
67
|
+
|
68
|
+
Create a file in your development directory called Rakefile and add this to it.
|
69
|
+
|
70
|
+
require 'rubygems'
|
71
|
+
require 'poolparty'
|
72
|
+
|
73
|
+
PoolParty.include_tasks
|
74
|
+
|
75
|
+
That's it, pretty simple and a bunch of tasks are available to you directly!
|
76
|
+
Your development directory should look like this:
|
77
|
+
|
78
|
+
./
|
79
|
+
config/
|
80
|
+
config.yml
|
81
|
+
Rakefile
|
82
|
+
|
83
|
+
Now, once you have this setup and your config file setup, you can type
|
84
|
+
|
85
|
+
rake dev:setup
|
86
|
+
|
87
|
+
That's it and you should be able to type ec2-describe-images (provided you have installed the ec2-api-tools, available here: http://developer.amazonwebservices.com/connect/entry.jspa?externalID=351&categoryID=88) at this point and you are set.
|
88
|
+
|
89
|
+
You will find yourself with a .<keypair_name>_pool_keys file in your home directory. Anytime you want to setup a new cloud or simply check on this one, all you have to do is type:
|
90
|
+
|
91
|
+
source ~/.<keypair_name>_pool_keys
|
92
|
+
|
93
|
+
and your'll be ready to switch over to editing the new cloud.
|
94
|
+
|
95
|
+
Using:
|
96
|
+
When it's easy to maintain a cloud, it's even easier to use.
|
97
|
+
|
98
|
+
There are two binaries included with PoolParty when you install them. Working with the cloud, you can use the binary: pool. Working with the instance, you can use the binary: instance.
|
99
|
+
|
100
|
+
Start your pool by typing:
|
101
|
+
|
102
|
+
pool start
|
103
|
+
|
104
|
+
It may take a minute. PoolParty is starting your cloud and configuring the master at this point. You may be asked to confirm an ssh connection. This only happens the first time so other pool commands won't ask you again.
|
105
|
+
|
106
|
+
To check on your cloud, simply type:
|
107
|
+
|
108
|
+
pool list
|
109
|
+
|
110
|
+
and you will be presented with the list of your cloud and their roles
|
111
|
+
|
112
|
+
If you want to stop the pool, it's as straightforward as:
|
113
|
+
|
114
|
+
pool stop
|
115
|
+
|
116
|
+
There are a other commands you have available to you on the pool site. If you are hosting your master off-site, rather than on EC2, you can type on the master machine:
|
117
|
+
|
118
|
+
pool maintain
|
119
|
+
|
120
|
+
and it will bootup as the master, watching the other instances in the cloud.
|
121
|
+
|
122
|
+
If you want to log into a specific instance, you can do so with the command:
|
123
|
+
|
124
|
+
instance ssh -i num
|
125
|
+
|
126
|
+
The num is the number in the list from: pool list. It defaults to logging into the master if the number is not supplied.
|
127
|
+
|
128
|
+
You have some more options when working with instances. You can
|
129
|
+
|
130
|
+
instance ssh
|
131
|
+
instance scp src='' dest=''
|
132
|
+
instance cmd cmd='ls -la'
|
133
|
+
instance start|stop|install|restart
|
134
|
+
instance start_maintain
|
135
|
+
|
136
|
+
The last command will force the instance to become the new master.
|
137
|
+
|
138
|
+
Those are the basics of PoolParty.
|
139
|
+
|
140
|
+
You can check it out at http://poolpartyrb.com/.
|
141
|
+
|
142
|
+
If you are interested in active development, check out the source at github at http://github.com/auser/pool-party/tree/master. Active discussion is held here: http://groups.google.com/group/poolpartyrb. Of course, the latest and greatest information will always be released first at http://blog.citrusbyte.com.
|
data/poolparty.gemspec
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
|
2
|
+
# Gem::Specification for Poolparty-0.0.8
|
3
|
+
# Originally generated by Echoe
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = %q{poolparty}
|
7
|
+
s.version = "0.0.8"
|
8
|
+
|
9
|
+
s.specification_version = 2 if s.respond_to? :specification_version=
|
10
|
+
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
|
+
s.authors = ["Ari Lerner"]
|
13
|
+
s.date = %q{2008-06-20}
|
14
|
+
s.description = %q{Run your entire application off EC2, managed and auto-scaling}
|
15
|
+
s.email = %q{ari.lerner@citrusbyte.com}
|
16
|
+
s.executables = ["instance", "pool"]
|
17
|
+
s.extra_rdoc_files = ["bin/instance", "bin/pool", "CHANGELOG", "lib/core/array.rb", "lib/core/exception.rb", "lib/core/float.rb", "lib/core/hash.rb", "lib/core/kernel.rb", "lib/core/module.rb", "lib/core/object.rb", "lib/core/proc.rb", "lib/core/string.rb", "lib/core/time.rb", "lib/modules/callback.rb", "lib/modules/ec2_wrapper.rb", "lib/modules/safe_instance.rb", "lib/modules/vlad_override.rb", "lib/poolparty/application.rb", "lib/poolparty/init.rb", "lib/poolparty/master.rb", "lib/poolparty/monitors/cpu.rb", "lib/poolparty/monitors/memory.rb", "lib/poolparty/monitors/web.rb", "lib/poolparty/monitors.rb", "lib/poolparty/optioner.rb", "lib/poolparty/plugin.rb", "lib/poolparty/plugin_manager.rb", "lib/poolparty/provider/packages/essential.rb", "lib/poolparty/provider/packages/git.rb", "lib/poolparty/provider/packages/haproxy.rb", "lib/poolparty/provider/packages/heartbeat.rb", "lib/poolparty/provider/packages/monit.rb", "lib/poolparty/provider/packages/rsync.rb", "lib/poolparty/provider/packages/ruby.rb", "lib/poolparty/provider/packages/s3fuse.rb", "lib/poolparty/provider/provider.rb", "lib/poolparty/provider.rb", "lib/poolparty/remote_instance.rb", "lib/poolparty/remoter.rb", "lib/poolparty/remoting.rb", "lib/poolparty/scheduler.rb", "lib/poolparty/tasks/cloud.rake", "lib/poolparty/tasks/development.rake", "lib/poolparty/tasks/ec2.rake", "lib/poolparty/tasks/instance.rake", "lib/poolparty/tasks/plugins.rake", "lib/poolparty/tasks/server.rake", "lib/poolparty/tasks.rb", "lib/poolparty/tmp.rb", "lib/poolparty.rb", "lib/s3/s3_object_store_folders.rb", "README.txt"]
|
18
|
+
s.files = ["archives/ruby-1.8.6-p111.tar.gz", "bin/instance", "bin/pool", "CHANGELOG", "config/cloud_master_takeover", "config/create_proxy_ami.sh", "config/haproxy.conf", "config/heartbeat.conf", "config/heartbeat_authkeys.conf", "config/installers/ubuntu_install.sh", "config/monit/haproxy.monit.conf", "config/monit/nginx.monit.conf", "config/monit.conf", "config/nginx.conf", "config/reconfigure_instances_script.sh", "config/sample-config.yml", "config/scp_instances_script.sh", "lib/core/array.rb", "lib/core/exception.rb", "lib/core/float.rb", "lib/core/hash.rb", "lib/core/kernel.rb", "lib/core/module.rb", "lib/core/object.rb", "lib/core/proc.rb", "lib/core/string.rb", "lib/core/time.rb", "lib/modules/callback.rb", "lib/modules/ec2_wrapper.rb", "lib/modules/safe_instance.rb", "lib/modules/vlad_override.rb", "lib/poolparty/application.rb", "lib/poolparty/init.rb", "lib/poolparty/master.rb", "lib/poolparty/monitors/cpu.rb", "lib/poolparty/monitors/memory.rb", "lib/poolparty/monitors/web.rb", "lib/poolparty/monitors.rb", "lib/poolparty/optioner.rb", "lib/poolparty/plugin.rb", "lib/poolparty/plugin_manager.rb", "lib/poolparty/provider/packages/essential.rb", "lib/poolparty/provider/packages/git.rb", "lib/poolparty/provider/packages/haproxy.rb", "lib/poolparty/provider/packages/heartbeat.rb", "lib/poolparty/provider/packages/monit.rb", "lib/poolparty/provider/packages/rsync.rb", "lib/poolparty/provider/packages/ruby.rb", "lib/poolparty/provider/packages/s3fuse.rb", "lib/poolparty/provider/provider.rb", "lib/poolparty/provider.rb", "lib/poolparty/remote_instance.rb", "lib/poolparty/remoter.rb", "lib/poolparty/remoting.rb", "lib/poolparty/scheduler.rb", "lib/poolparty/tasks/cloud.rake", "lib/poolparty/tasks/development.rake", "lib/poolparty/tasks/ec2.rake", "lib/poolparty/tasks/instance.rake", "lib/poolparty/tasks/plugins.rake", "lib/poolparty/tasks/server.rake", "lib/poolparty/tasks.rb", "lib/poolparty/tmp.rb", "lib/poolparty.rb", "lib/s3/s3_object_store_folders.rb", "Manifest", "misc/basics_tutorial.txt", "Rakefile", "README.txt", "spec/application_spec.rb", "spec/callback_spec.rb", "spec/core_spec.rb", "spec/helpers/ec2_mock.rb", "spec/kernel_spec.rb", "spec/master_spec.rb", "spec/monitors/cpu_monitor_spec.rb", "spec/monitors/memory_spec.rb", "spec/monitors/misc_monitor_spec.rb", "spec/monitors/web_spec.rb", "spec/optioner_spec.rb", "spec/plugin_manager_spec.rb", "spec/plugin_spec.rb", "spec/pool_binary_spec.rb", "spec/poolparty_spec.rb", "spec/provider_spec.rb", "spec/remote_instance_spec.rb", "spec/remoter_spec.rb", "spec/remoting_spec.rb", "spec/scheduler_spec.rb", "spec/spec_helper.rb", "spec/string_spec.rb", "tmp/node0-pool-party-ha.cf", "tmp/node0-pool-party-haresources", "tmp/node0-pool-party-hosts", "tmp/node1-pool-party-ha.cf", "tmp/node1-pool-party-haresources", "tmp/node1-pool-party-hosts", "tmp/pool-party-haproxy.cfg", "web/static/conf/nginx.conf", "web/static/site/images/balloon.png", "web/static/site/images/cb.png", "web/static/site/images/clouds.png", "web/static/site/images/railsconf_preso_img.png", "web/static/site/index.html", "web/static/site/javascripts/application.js", "web/static/site/javascripts/corner.js", "web/static/site/javascripts/jquery-1.2.6.pack.js", "web/static/site/misc.html", "web/static/site/storage/pool_party_presentation.pdf", "web/static/site/stylesheets/application.css", "web/static/site/stylesheets/reset.css", "web/static/src/layouts/application.haml", "web/static/src/pages/index.haml", "web/static/src/pages/misc.haml", "web/static/src/stylesheets/application.sass", "poolparty.gemspec"]
|
19
|
+
s.has_rdoc = true
|
20
|
+
s.homepage = %q{http://blog.citrusbyte.com}
|
21
|
+
s.post_install_message = %q{ Thanks for installing PoolParty!
|
22
|
+
|
23
|
+
Please check out the documentation for any questions or check out the google groups at
|
24
|
+
http://groups.google.com/group/poolpartyrb
|
25
|
+
|
26
|
+
Don't forget to check out the plugins for extending PoolParty!
|
27
|
+
|
28
|
+
For more information, check http://poolpartyrb.com
|
29
|
+
*** Ari Lerner @ <ari.lerner@citrusbyte.com> ***
|
30
|
+
}
|
31
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Poolparty", "--main", "README.txt"]
|
32
|
+
s.require_paths = ["lib"]
|
33
|
+
s.rubyforge_project = %q{poolparty}
|
34
|
+
s.rubygems_version = %q{1.1.1}
|
35
|
+
s.summary = %q{Run your entire application off EC2, managed and auto-scaling}
|
36
|
+
|
37
|
+
s.add_dependency(%q<aws-s3>, [">= 0"])
|
38
|
+
s.add_dependency(%q<amazon-ec2>, [">= 0"])
|
39
|
+
s.add_dependency(%q<aska>, [">= 0"])
|
40
|
+
s.add_dependency(%q<git>, [">= 0"])
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
# # Original Rakefile source (requires the Echoe gem):
|
45
|
+
#
|
46
|
+
# require 'rubygems'
|
47
|
+
# require 'echoe'
|
48
|
+
# require 'lib/poolparty'
|
49
|
+
#
|
50
|
+
# task :default => :test
|
51
|
+
#
|
52
|
+
# Echoe.new("poolparty") do |p|
|
53
|
+
# p.author = "Ari Lerner"
|
54
|
+
# p.email = "ari.lerner@citrusbyte.com"
|
55
|
+
# p.summary = "Run your entire application off EC2, managed and auto-scaling"
|
56
|
+
# p.url = "http://blog.citrusbyte.com"
|
57
|
+
# p.dependencies = %w(aws-s3 amazon-ec2 aska git)
|
58
|
+
# p.install_message =<<-EOM
|
59
|
+
# Thanks for installing PoolParty!
|
60
|
+
#
|
61
|
+
# Please check out the documentation for any questions or check out the google groups at
|
62
|
+
# http://groups.google.com/group/poolpartyrb
|
63
|
+
#
|
64
|
+
# Don't forget to check out the plugins for extending PoolParty!
|
65
|
+
#
|
66
|
+
# For more information, check http://poolpartyrb.com
|
67
|
+
# *** Ari Lerner @ <ari.lerner@citrusbyte.com> ***
|
68
|
+
# EOM
|
69
|
+
# p.include_rakefile = true
|
70
|
+
# end
|
71
|
+
#
|
72
|
+
# PoolParty.include_tasks
|