standup 0.3.3 → 0.3.4
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/README.md +11 -16
- data/VERSION +1 -1
- data/bin/standup +7 -6
- data/lib/standup.rb +11 -2
- data/lib/standup/node.rb +2 -1
- data/lib/standup/scripts/base.rb +55 -19
- data/lib/standup/scripts/node.rb +46 -0
- data/scripts/allocate_ip.rb +1 -1
- data/scripts/appconsole.rb +1 -1
- data/scripts/basics.rb +1 -1
- data/scripts/delayed_job.rb +1 -1
- data/scripts/ec2.rb +1 -1
- data/scripts/generate.rb +3 -6
- data/scripts/generate/script.rb +1 -1
- data/scripts/init.rb +1 -1
- data/scripts/localize.rb +4 -6
- data/scripts/monit.rb +1 -1
- data/scripts/passenger.rb +1 -1
- data/scripts/postgresql.rb +1 -1
- data/scripts/ruby.rb +1 -1
- data/scripts/setup.rb +3 -2
- data/scripts/shell.rb +2 -1
- data/scripts/status.rb +5 -2
- data/scripts/terminate.rb +1 -1
- data/scripts/update.rb +1 -1
- data/scripts/watchlog.rb +1 -1
- data/scripts/webapp.rb +1 -1
- data/standup.gemspec +3 -2
- metadata +5 -4
data/README.md
CHANGED
@@ -4,15 +4,16 @@ Standup is an application deployment and infrastructure management tool for Rail
|
|
4
4
|
|
5
5
|
## Basic usage
|
6
6
|
|
7
|
-
0.
|
8
|
-
0.
|
9
|
-
0.
|
10
|
-
0.
|
11
|
-
0.
|
7
|
+
0. `gem install standup`
|
8
|
+
0. `cd path/to/your/rails/project`
|
9
|
+
0. `standup init`
|
10
|
+
0. Fill in actual settings in generated file `config/standup.yml`
|
11
|
+
0. `standup setup`
|
12
|
+
0. `standup status`
|
12
13
|
|
13
14
|
## Tweaking default scripts
|
14
15
|
|
15
|
-
0.
|
16
|
+
0. `standup localize <script_name>`
|
16
17
|
0. Script file `config/standup/<script_name>.rb` will be copied from gem.
|
17
18
|
0. Script's own files, like configs etc. under `config/standup/<script_name>`, if any, will be copied from gem too.
|
18
19
|
0. You can edit them and standup will use them instead of default.
|
@@ -20,7 +21,7 @@ Standup is an application deployment and infrastructure management tool for Rail
|
|
20
21
|
|
21
22
|
## Creating new scripts
|
22
23
|
|
23
|
-
0.
|
24
|
+
0. `standup generate <script_name>`
|
24
25
|
0. Script file `config/standup/<script_name>.rb` will be created with empty script stub.
|
25
26
|
0. Edit it as you want, it's now available for standup.
|
26
27
|
|
@@ -43,18 +44,12 @@ For example, if you want to add `rescue` to your configuration, you need to:
|
|
43
44
|
|
44
45
|
## To do
|
45
46
|
|
46
|
-
-
|
47
|
-
`setup` script need to be run for each node
|
48
|
-
`shell` script is meant to be run for one specific node
|
49
|
-
`init` script does not relate to any node at all.
|
50
|
-
|
51
|
-
- If there is more than one node in standup.yml, require node name(s) or `all` explicitly set:
|
52
|
-
`standup shell web`
|
53
|
-
`standup update db,web`
|
54
|
-
`standup setup all`
|
47
|
+
- `standup -v`
|
55
48
|
|
56
49
|
- **?** Script sequences: rework default script as script sequence
|
57
50
|
|
51
|
+
- ERB processing for script files
|
52
|
+
|
58
53
|
## Copyright
|
59
54
|
|
60
55
|
Copyright (c) 2010 Ilia Ablamonov, Cloud Castle Inc.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.4
|
data/bin/standup
CHANGED
@@ -8,14 +8,14 @@ opt_parser = Trollop::Parser.new do
|
|
8
8
|
banner 'Standup is an application deployment and infrastructure management tool for Rails and Amazon EC2.'
|
9
9
|
banner ''
|
10
10
|
banner 'Usage:'
|
11
|
-
banner ' standup script [
|
11
|
+
banner ' standup [options] <script> [script arguments]'
|
12
12
|
banner ''
|
13
|
-
banner 'where script is one of the following:'
|
13
|
+
banner 'where <script> is one of the following:'
|
14
14
|
banner ''
|
15
15
|
|
16
16
|
offset = Standup.scripts.keys.map(&:length).max + 2
|
17
|
-
Standup.scripts.each do |name
|
18
|
-
banner "#{"%-#{offset}s" % name} #{
|
17
|
+
Standup.scripts.keys.sort.each do |name|
|
18
|
+
banner "#{"%-#{offset}s" % name} #{Standup.scripts[name].description}"
|
19
19
|
end
|
20
20
|
|
21
21
|
banner ''
|
@@ -33,9 +33,10 @@ end
|
|
33
33
|
exit if ARGV.empty?
|
34
34
|
|
35
35
|
script_name = ARGV.shift
|
36
|
+
script = Standup.scripts[script_name]
|
36
37
|
|
37
|
-
if
|
38
|
-
|
38
|
+
if script
|
39
|
+
script.execute
|
39
40
|
else
|
40
41
|
opt_parser.die "unknown script #{script_name}", nil
|
41
42
|
end
|
data/lib/standup.rb
CHANGED
@@ -10,6 +10,7 @@ require 'standup/settings'
|
|
10
10
|
require 'standup/ec2'
|
11
11
|
require 'standup/remoting'
|
12
12
|
require 'standup/scripts/base'
|
13
|
+
require 'standup/scripts/node'
|
13
14
|
require 'standup/node'
|
14
15
|
|
15
16
|
module Standup
|
@@ -44,9 +45,17 @@ module Standup
|
|
44
45
|
@@scripts
|
45
46
|
end
|
46
47
|
|
47
|
-
def self.script &block
|
48
|
+
def self.script type = :node, &block
|
48
49
|
name = block.__file__.match(/([^\/]*)\.rb$/)[1]
|
49
|
-
|
50
|
+
superclass = case type
|
51
|
+
when :node
|
52
|
+
Scripts::Node
|
53
|
+
when :local
|
54
|
+
Scripts::Base
|
55
|
+
else
|
56
|
+
raise ArgumentError, "Unknown script type #{type}"
|
57
|
+
end
|
58
|
+
script_class = Class.new(superclass, &block)
|
50
59
|
script_class.name = name
|
51
60
|
Standup::Scripts.const_set name.camelize, script_class
|
52
61
|
scripts[name] = script_class
|
data/lib/standup/node.rb
CHANGED
data/lib/standup/scripts/base.rb
CHANGED
@@ -3,14 +3,9 @@ require 'active_support/hash_with_indifferent_access'
|
|
3
3
|
module Standup
|
4
4
|
module Scripts
|
5
5
|
class Base
|
6
|
-
def initialize
|
7
|
-
|
8
|
-
|
9
|
-
@params = if node.params[name].is_a? Hash
|
10
|
-
ActiveSupport::HashWithIndifferentAccess.new self.class.default_params.merge(node.params[name])
|
11
|
-
else
|
12
|
-
node.params[name] || self.class.default_params
|
13
|
-
end
|
6
|
+
def initialize *args
|
7
|
+
merge_params self.class.default_params
|
8
|
+
merge_params Settings[name]
|
14
9
|
end
|
15
10
|
|
16
11
|
class_attribute :name
|
@@ -20,21 +15,14 @@ module Standup
|
|
20
15
|
|
21
16
|
class_attribute :description
|
22
17
|
|
23
|
-
|
24
|
-
:to => :@node
|
25
|
-
|
26
|
-
delegate :download, :upload, :remote_update, :exec, :sudo, :in_dir, :in_temp_dir, :file_exists?, :install_package, :install_packages, :install_gem,
|
27
|
-
:to => :remoting
|
28
|
-
|
29
|
-
attr_accessor :node, :params
|
18
|
+
attr_accessor :params
|
30
19
|
|
31
20
|
def name
|
32
21
|
self.class.name
|
33
22
|
end
|
34
23
|
|
35
|
-
def
|
36
|
-
bright_p
|
37
|
-
run
|
24
|
+
def put_title
|
25
|
+
bright_p name, HighLine::CYAN
|
38
26
|
end
|
39
27
|
|
40
28
|
def script_file filename
|
@@ -46,7 +34,55 @@ module Standup
|
|
46
34
|
nil
|
47
35
|
end
|
48
36
|
|
49
|
-
def
|
37
|
+
def self.execute
|
38
|
+
new.run
|
39
|
+
end
|
40
|
+
|
41
|
+
protected
|
42
|
+
|
43
|
+
def merge_params param_overrides
|
44
|
+
@params = if param_overrides.is_a? Hash
|
45
|
+
ActiveSupport::HashWithIndifferentAccess.new((@params || {}).merge(param_overrides))
|
46
|
+
else
|
47
|
+
param_overrides || @params
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def argument arg_pattern, arg_name = arg_pattern, variants = nil
|
52
|
+
self.class.argument arg_pattern, arg_name, variants
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.argument arg_pattern, arg_name = arg_pattern, variants = nil
|
56
|
+
script_description = description
|
57
|
+
script_name = name
|
58
|
+
opt_parser = Trollop::Parser.new do
|
59
|
+
banner script_description
|
60
|
+
banner ''
|
61
|
+
banner 'Usage:'
|
62
|
+
banner " standup #{script_name} [options] #{arg_pattern}"
|
63
|
+
banner ''
|
64
|
+
if variants
|
65
|
+
banner "where <#{arg_name}> is one of the following:"
|
66
|
+
banner ''
|
67
|
+
variants.each { |v| banner v }
|
68
|
+
banner ''
|
69
|
+
end
|
70
|
+
banner "and [options] are:"
|
71
|
+
banner ''
|
72
|
+
|
73
|
+
stop_on_unknown
|
74
|
+
end
|
75
|
+
Trollop::with_standard_exception_handling opt_parser do
|
76
|
+
opt_parser.parse ARGV
|
77
|
+
raise Trollop::HelpNeeded if ARGV.empty?
|
78
|
+
end
|
79
|
+
|
80
|
+
result = ARGV.shift
|
81
|
+
if variants && !variants.include?(result)
|
82
|
+
opt_parser.die "unknown #{arg_name} #{result}", nil
|
83
|
+
end
|
84
|
+
result
|
85
|
+
end
|
50
86
|
end
|
51
87
|
end
|
52
88
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Standup
|
2
|
+
module Scripts
|
3
|
+
class Node < Base
|
4
|
+
def initialize node
|
5
|
+
super
|
6
|
+
merge_params node.params[name]
|
7
|
+
@node = node
|
8
|
+
@remoting = nil
|
9
|
+
end
|
10
|
+
|
11
|
+
delegate :instance, :open_port, :open_ports, :remoting, :scripts,
|
12
|
+
:to => :@node
|
13
|
+
|
14
|
+
delegate :download, :upload, :remote_update, :exec, :sudo, :in_dir, :in_temp_dir, :file_exists?, :install_package, :install_packages, :install_gem,
|
15
|
+
:to => :remoting
|
16
|
+
|
17
|
+
attr_accessor :node
|
18
|
+
|
19
|
+
def put_title
|
20
|
+
bright_p "#{@node.name}:#{name}", HighLine::CYAN
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.execute
|
24
|
+
all_nodes = Settings.nodes.keys
|
25
|
+
|
26
|
+
nodes = if all_nodes.length > 1
|
27
|
+
node_args = argument('<node[,node]>', 'node', ['all'] + all_nodes).strip.split(',')
|
28
|
+
|
29
|
+
if node_args.include? 'all'
|
30
|
+
all_nodes
|
31
|
+
else
|
32
|
+
node_args
|
33
|
+
end
|
34
|
+
else
|
35
|
+
all_nodes
|
36
|
+
end
|
37
|
+
|
38
|
+
run_on_nodes nodes
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.run_on_nodes nodes
|
42
|
+
nodes.each {|node| Standup::Node.new(node).run_script name}
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/scripts/allocate_ip.rb
CHANGED
data/scripts/appconsole.rb
CHANGED
data/scripts/basics.rb
CHANGED
data/scripts/delayed_job.rb
CHANGED
data/scripts/ec2.rb
CHANGED
data/scripts/generate.rb
CHANGED
@@ -1,14 +1,11 @@
|
|
1
|
-
Standup.script do
|
1
|
+
Standup.script :local do
|
2
2
|
self.description = 'Generate script'
|
3
3
|
|
4
4
|
def run
|
5
|
-
|
6
|
-
bright_p "Specify script name with SCRIPT=name argument"
|
7
|
-
return
|
8
|
-
end
|
5
|
+
script_name = argument '<script name>'
|
9
6
|
|
10
7
|
FileUtils.mkdir_p(Standup.local_scripts_path)
|
11
8
|
FileUtils.copy script_file('script.rb'),
|
12
|
-
File.expand_path("#{
|
9
|
+
File.expand_path("#{script_name}.rb", Standup.local_scripts_path)
|
13
10
|
end
|
14
11
|
end
|
data/scripts/generate/script.rb
CHANGED
data/scripts/init.rb
CHANGED
data/scripts/localize.rb
CHANGED
@@ -1,14 +1,12 @@
|
|
1
|
-
Standup.script do
|
1
|
+
Standup.script :local do
|
2
2
|
self.description = 'Put specified script into project configuration'
|
3
3
|
|
4
4
|
def run
|
5
|
-
|
6
|
-
|
7
|
-
return
|
8
|
-
end
|
5
|
+
variants = Standup.scripts.keys.sort.select{|script_name| File.exists? File.expand_path("#{script_name}.rb", Standup.gem_scripts_path)}
|
6
|
+
script_name = argument '<script name>', 'script name', variants
|
9
7
|
|
10
8
|
FileUtils.mkdir_p(Standup.local_scripts_path)
|
11
|
-
[
|
9
|
+
[script_name, "#{script_name}.rb"].each do |path|
|
12
10
|
path = File.expand_path(path, Standup.gem_scripts_path)
|
13
11
|
if File.exists? path
|
14
12
|
FileUtils.cp_r path, Standup.local_scripts_path
|
data/scripts/monit.rb
CHANGED
data/scripts/passenger.rb
CHANGED
data/scripts/postgresql.rb
CHANGED
data/scripts/ruby.rb
CHANGED
data/scripts/setup.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
|
-
Standup.script do
|
1
|
+
Standup.script :node do
|
2
2
|
self.description = 'Do all setup from scratch and/or incrementally'
|
3
3
|
|
4
4
|
self.default_params = 'ec2 basics monit ruby postgresql passenger webapp update'
|
5
5
|
|
6
6
|
def run
|
7
7
|
params.strip.split.each do |name|
|
8
|
-
scripts[name].
|
8
|
+
scripts[name].put_title
|
9
|
+
scripts[name].run
|
9
10
|
end
|
10
11
|
end
|
11
12
|
|
data/scripts/shell.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Standup.script do
|
1
|
+
Standup.script :node do
|
2
2
|
self.description = 'Run remote shell (e.g. bash)'
|
3
3
|
|
4
4
|
def run
|
@@ -6,6 +6,7 @@ Standup.script do
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def make_shell shell_command = ''
|
9
|
+
return unless instance
|
9
10
|
command = "#{node.ssh_string} -t '#{shell_command}'"
|
10
11
|
bright_p command
|
11
12
|
Kernel.exec command
|
data/scripts/status.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Standup.script do
|
1
|
+
Standup.script :node do
|
2
2
|
self.description = 'Check nodes status and display useful info'
|
3
3
|
|
4
4
|
def run
|
@@ -6,10 +6,13 @@ Standup.script do
|
|
6
6
|
puts "Node: #{node.name}"
|
7
7
|
puts "State: #{instance.state}"
|
8
8
|
puts "IP: #{instance.external_ip}"
|
9
|
-
puts "SSH String: #{node.ssh_string}"
|
10
9
|
else
|
11
10
|
puts "Node: #{node.name}"
|
12
11
|
puts "State: not running"
|
13
12
|
end
|
14
13
|
end
|
14
|
+
|
15
|
+
def self.execute
|
16
|
+
run_on_nodes Standup::Settings.nodes.keys
|
17
|
+
end
|
15
18
|
end
|
data/scripts/terminate.rb
CHANGED
data/scripts/update.rb
CHANGED
data/scripts/watchlog.rb
CHANGED
data/scripts/webapp.rb
CHANGED
data/standup.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{standup}
|
8
|
-
s.version = "0.3.
|
8
|
+
s.version = "0.3.4"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Ilia Ablamonov", "Cloud Castle Inc."]
|
12
|
-
s.date = %q{2010-11-
|
12
|
+
s.date = %q{2010-11-11}
|
13
13
|
s.default_executable = %q{standup}
|
14
14
|
s.email = %q{ilia@flamefork.ru}
|
15
15
|
s.executables = ["standup"]
|
@@ -35,6 +35,7 @@ Gem::Specification.new do |s|
|
|
35
35
|
"lib/standup/node.rb",
|
36
36
|
"lib/standup/remoting.rb",
|
37
37
|
"lib/standup/scripts/base.rb",
|
38
|
+
"lib/standup/scripts/node.rb",
|
38
39
|
"lib/standup/settings.rb",
|
39
40
|
"scripts/allocate_ip.rb",
|
40
41
|
"scripts/appconsole.rb",
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: standup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
9
|
+
- 4
|
10
|
+
version: 0.3.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ilia Ablamonov
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-11-
|
19
|
+
date: 2010-11-11 00:00:00 +03:00
|
20
20
|
default_executable: standup
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -152,6 +152,7 @@ files:
|
|
152
152
|
- lib/standup/node.rb
|
153
153
|
- lib/standup/remoting.rb
|
154
154
|
- lib/standup/scripts/base.rb
|
155
|
+
- lib/standup/scripts/node.rb
|
155
156
|
- lib/standup/settings.rb
|
156
157
|
- scripts/allocate_ip.rb
|
157
158
|
- scripts/appconsole.rb
|