bcome 0.3.4 → 0.4.0
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.
- checksums.yaml +4 -4
- data/bin/bcome +7 -0
- data/bin/boot.rb +11 -2
- data/documentation/configuration.md +1 -1
- data/documentation/example_non_shell_scripts/examples_script_basic_usage.rb +1 -1
- data/documentation/example_non_shell_scripts/examples_script_entire_estate.rb +1 -1
- data/documentation/example_non_shell_scripts/examples_script_platform_level.rb +1 -1
- data/documentation/examples/platform.yml-example +3 -15
- data/documentation/external_usage.md +27 -12
- data/documentation/images/direct_cmd_execution.png +0 -0
- data/documentation/images/direct_ssh.png +0 -0
- data/documentation/usage.md +11 -11
- data/lib/bcome/version.rb +1 -1
- data/lib/become_object.rb +21 -1
- data/lib/nodes/base.rb +9 -0
- data/lib/nodes/estate.rb +9 -1
- data/lib/stack/base.rb +25 -15
- data/lib/stack/environment.rb +2 -2
- data/lib/stack/estate.rb +0 -1
- metadata +8 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6679955d918e9393a9ec586ca27efefb93877575
|
4
|
+
data.tar.gz: 0edac73427d8221c6882854a6dfa5f6990f63aa6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 21d4e826fbaf8c9b1467766eeb704c0af00942893ee10b29fb7049d4948471a96d4155d756b7c07a7f19349f4abd8faf349d7f9417f8d7174e9cd8e5d7d6683c
|
7
|
+
data.tar.gz: e0c1972cb89cc5ace8ccf739d2301825cc120f6cbc098b71e89497d5e3c6d688eca63521479bf1e06c27f64936264fa9290f3eabe3fc3f16d55a4df7c4e8c46e
|
data/bin/bcome
CHANGED
@@ -21,6 +21,13 @@ end
|
|
21
21
|
# called with, e.g. bcome platform:environment:node_name:ssh
|
22
22
|
@ssh_to.node.ssh if @ssh_in && @ssh_to
|
23
23
|
|
24
|
+
## We're directly excuting a command on a n node indicated by a 'run' key at the end of our context breadrumb
|
25
|
+
# called with, e.g. bcome platform:environment:node_name:run "command to execute"
|
26
|
+
if @run_cmd && @run_on
|
27
|
+
params = ARGV[(1..(ARGV.size))].join("\s")
|
28
|
+
@run_on.node.run(params)
|
29
|
+
end
|
30
|
+
|
24
31
|
## We're going to directly execute a command on a node, indicated by the method name at the end of our context breadcrumb.
|
25
32
|
## This works for commands specified in the users own personal framework installation, either from a context command or from an orchestration hook
|
26
33
|
## e,g, bcome platform:environment:node_name:bootstrap
|
data/bin/boot.rb
CHANGED
@@ -67,7 +67,9 @@ if quick_context
|
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
|
-
|
70
|
+
direct_commands = ["run", "ssh"]
|
71
|
+
|
72
|
+
@no_shell = true if direct_commands.include?(quick_contexts.last)
|
71
73
|
|
72
74
|
#########################
|
73
75
|
## QUICK CONTEXT & BOOT #
|
@@ -94,6 +96,12 @@ if quick_contexts.any?
|
|
94
96
|
break
|
95
97
|
end
|
96
98
|
|
99
|
+
if resource_context_key == "run" && index == (quick_contexts.size - 1)
|
100
|
+
@run_cmd = true
|
101
|
+
@run_on = @context_object
|
102
|
+
break
|
103
|
+
end
|
104
|
+
|
97
105
|
next_context_resource = @context_object.resource_for_identifier(resource_context_key)
|
98
106
|
|
99
107
|
# If we can't find our context breadcrumb, the user is perhaps specifying a direct command to be run
|
@@ -101,8 +109,9 @@ if quick_contexts.any?
|
|
101
109
|
# orchestration on it).
|
102
110
|
# e.g. you have a context command called 'deploy'. You may want to do the following:
|
103
111
|
# bcome platform:environment:deploy
|
112
|
+
|
104
113
|
unless next_context_resource && index <= (quick_contexts.size - 1)
|
105
|
-
|
114
|
+
if @context_object.respond_to_bcome_context_method?(resource_context_key.to_sym)
|
106
115
|
@no_shell = true
|
107
116
|
@direct_execute_method = resource_context_key.to_sym
|
108
117
|
break
|
@@ -34,7 +34,7 @@ Name your configuration file “[platformName]_[EnvironmentName]-instances.yml,
|
|
34
34
|
|
35
35
|
Two examples are given below:
|
36
36
|
|
37
|
-
Example 1: Static instances accessible directly, without the need to
|
37
|
+
Example 1: Static instances accessible directly, without the need to traverse a jump host
|
38
38
|
|
39
39
|
```
|
40
40
|
---
|
@@ -1,22 +1,10 @@
|
|
1
|
-
|
1
|
+
---
|
2
2
|
### NOTE that you may add any attributes you like onto the platform config: using meta programming, bcome makes these accessible from the shell
|
3
3
|
|
4
|
-
---
|
5
|
-
## Example platforms list.
|
6
|
-
# Platform have environments
|
7
|
-
# environments have servers
|
8
4
|
- :name: "project_foo"
|
9
5
|
:description: "All the Foo environments"
|
10
6
|
:location: "Some information about where this is (optional)"
|
7
|
+
|
11
8
|
- :name: "project_bar"
|
12
9
|
:description: "All the Bar environments"
|
13
|
-
:
|
14
|
-
|
15
|
-
# Quick link example > bcome project_bar:app1
|
16
|
-
- :ref: "app1" # Provides a quick link to a server named 'app1' within Platform 'project_foo', and environment 'production'
|
17
|
-
:keys:
|
18
|
-
- "project_foo"
|
19
|
-
- "production"
|
20
|
-
- "app1"
|
21
|
-
|
22
|
-
|
10
|
+
:location: "Some information about where this is (optional)"
|
@@ -1,5 +1,32 @@
|
|
1
1
|
# External Usage
|
2
2
|
|
3
|
+
## Direct SSH to nodes
|
4
|
+
|
5
|
+
If you know the context breadcrumb for a node, you may SSH to it directly without accessing the node via the shell.
|
6
|
+
|
7
|
+
For example, you wish to SSH in to server 'instancename' in environment 'environment' for platform 'platform':
|
8
|
+
|
9
|
+
```
|
10
|
+
> bcome platform:environment:instancename:ssh
|
11
|
+
e.g.
|
12
|
+
> bcome myplatformname:production:appserver1:ssh
|
13
|
+
```
|
14
|
+

|
15
|
+
|
16
|
+
## Direct command execution on a selection
|
17
|
+
|
18
|
+
You can pass commands directly to be executed on all machines at a specific context level by using the 'run' suffix.
|
19
|
+
|
20
|
+
For example, you wish to discover the free memory on all machines in platform 'wbz' and environment 'prod':
|
21
|
+
|
22
|
+
```
|
23
|
+
> bcome wbz:prod:run "free -m"
|
24
|
+
```
|
25
|
+
|
26
|
+
The command is executed in parallel on all machines, with the output & status returned to the terminal.
|
27
|
+
|
28
|
+

|
29
|
+
|
3
30
|
## Scripting
|
4
31
|
|
5
32
|
Bcome may be used for scripting outside of the bcome shell.
|
@@ -32,15 +59,3 @@ see documentation/example_non_shell_scripts/examples_script_platform_level.rb
|
|
32
59
|
|
33
60
|
see documentation/example_non_shell_scripts/examples_script_entire_estate.rb
|
34
61
|
|
35
|
-
## Direct SSH to nodes
|
36
|
-
|
37
|
-
If you know the context breadcrumb for a node, you may use the bcome gem to SSH to it directly without accessing the node via the bcome shell.
|
38
|
-
|
39
|
-
```
|
40
|
-
|
41
|
-
> bcome platform:environment:instancename:ssh
|
42
|
-
e.g.
|
43
|
-
> bcome myplatformname:production:appserver1:ssh
|
44
|
-
|
45
|
-
```
|
46
|
-
|
Binary file
|
Binary file
|
data/documentation/usage.md
CHANGED
@@ -36,9 +36,9 @@ or, if with bundler
|
|
36
36
|
> describe
|
37
37
|
- Describe the resource object at the current context.
|
38
38
|
|
39
|
-
>
|
39
|
+
> cd
|
40
40
|
- Select a resource object, and switch to its context.
|
41
|
-
e.g. cd
|
41
|
+
e.g. cd identifier
|
42
42
|
|
43
43
|
> exit
|
44
44
|
- Close the current context
|
@@ -62,9 +62,9 @@ e.g. local "command"
|
|
62
62
|
> describe
|
63
63
|
- Describe the resource object at the current context.
|
64
64
|
|
65
|
-
>
|
65
|
+
> cd
|
66
66
|
- Select a resource object, and switch to its context.
|
67
|
-
e.g. cd
|
67
|
+
e.g. cd identifier
|
68
68
|
|
69
69
|
> exit
|
70
70
|
- Close the current context
|
@@ -88,9 +88,9 @@ e.g. local "command"
|
|
88
88
|
> describe
|
89
89
|
- Describe the resource object at the current context.
|
90
90
|
|
91
|
-
> cd
|
91
|
+
> cd
|
92
92
|
- Select a resource object, and switch to its context.
|
93
|
-
e.g. cd
|
93
|
+
e.g. cd identifier
|
94
94
|
|
95
95
|
> exit
|
96
96
|
- Close the current context
|
@@ -104,14 +104,14 @@ e.g. local "command"
|
|
104
104
|
|
105
105
|
> add
|
106
106
|
- Add a resource you wish to work on.
|
107
|
-
e.g. add
|
107
|
+
e.g. add identifier, OR add [array, of, identifiers]
|
108
108
|
|
109
109
|
> add!
|
110
110
|
- Add all resources from the current context.
|
111
111
|
|
112
112
|
> remove
|
113
113
|
- Remove a resource you no longer with to work on.
|
114
|
-
e.g. remove
|
114
|
+
e.g. remove identifier, OR remove [array, of, identifiers]
|
115
115
|
|
116
116
|
> clear!
|
117
117
|
- Remove all selected resources.
|
@@ -133,7 +133,7 @@ e.g. get 'remotepath'
|
|
133
133
|
e.g. run 'command'
|
134
134
|
|
135
135
|
> sudo
|
136
|
-
- Enters 'sudo' mode, resulting in 'get' or 'put' commands being
|
136
|
+
- Enters 'sudo' mode, resulting in 'get' or 'put' commands being executed remotely using 'sudo'. This assumes that you have passwordless sudo setup on each respective remote host.
|
137
137
|
|
138
138
|
### Instance level commands
|
139
139
|
|
@@ -146,9 +146,9 @@ e.g. run 'command'
|
|
146
146
|
> describe
|
147
147
|
- Describe the resource object at the current context.
|
148
148
|
|
149
|
-
>
|
149
|
+
> cd
|
150
150
|
- Select a resource object, and switch to its context.
|
151
|
-
e.g.
|
151
|
+
e.g. cd identifier
|
152
152
|
|
153
153
|
> exit
|
154
154
|
- Close the current context
|
data/lib/bcome/version.rb
CHANGED
data/lib/become_object.rb
CHANGED
@@ -50,9 +50,29 @@ module ::Bcome::BecomeObject
|
|
50
50
|
@resources ||= do_load_resources
|
51
51
|
end
|
52
52
|
|
53
|
+
def resource_identifiers
|
54
|
+
@resource_identifiers ||= resources.collect(&:identifier)
|
55
|
+
end
|
56
|
+
|
57
|
+
def identifier_for(resource)
|
58
|
+
r = resource.respond_to?(:identifier) ? resource.identifier : resource.to_s
|
59
|
+
return r
|
60
|
+
end
|
61
|
+
|
62
|
+
def has_potential_resources?
|
63
|
+
respond_to?(:config_path) # No path to config, no resources...
|
64
|
+
end
|
65
|
+
|
66
|
+
def is_stack_level_resource?(constant_name)
|
67
|
+
return unless has_potential_resources?
|
68
|
+
potential_resource_name = constant_name.to_s
|
69
|
+
return false unless resource_identifiers.any?
|
70
|
+
return resource_identifiers.select{|resource| identifier_for(resource) == potential_resource_name }.any?
|
71
|
+
end
|
72
|
+
|
53
73
|
def do_load_resources
|
54
74
|
config = YAML.load_file(config_path)
|
55
|
-
|
75
|
+
collection_klass.collection_from_config(self, config)
|
56
76
|
end
|
57
77
|
|
58
78
|
def resource_for_identifier(identifier)
|
data/lib/nodes/base.rb
CHANGED
@@ -13,6 +13,15 @@ module ::Bcome::Node
|
|
13
13
|
construct(meta_data)
|
14
14
|
end
|
15
15
|
|
16
|
+
## Runs a command over *every* machine in this node
|
17
|
+
def run(raw_command, bootstrap = false)
|
18
|
+
return unless machines
|
19
|
+
machines.pmap {|machine|
|
20
|
+
machine.run([raw_command], bootstrap)
|
21
|
+
}
|
22
|
+
return
|
23
|
+
end
|
24
|
+
|
16
25
|
def method_missing(method_sym, *arguments, &block)
|
17
26
|
if instance_variable_defined?("@#{method_sym}")
|
18
27
|
return instance_variable_get("@#{method_sym}")
|
data/lib/nodes/estate.rb
CHANGED
@@ -6,11 +6,19 @@ module ::Bcome::Node
|
|
6
6
|
def machines
|
7
7
|
platforms.collect(&:machines).flatten
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
def namespace
|
11
11
|
""
|
12
12
|
end
|
13
13
|
|
14
|
+
def run(raw_command, bootstrap = false)
|
15
|
+
return unless platforms
|
16
|
+
platforms.pmap {|platform|
|
17
|
+
platform.run(raw_command, bootstrap)
|
18
|
+
}
|
19
|
+
return
|
20
|
+
end
|
21
|
+
|
14
22
|
def environments
|
15
23
|
@environments ||= platforms.collect(&:environments).flatten
|
16
24
|
end
|
data/lib/stack/base.rb
CHANGED
@@ -9,6 +9,30 @@ module ::Bcome::Stack
|
|
9
9
|
node.machines
|
10
10
|
end
|
11
11
|
|
12
|
+
def self.const_missing(constant_name)
|
13
|
+
## Hook for direct access to stack level resources by constant name where
|
14
|
+
## cd ServerName should yield the same outcome as cd "ServerName" or cd :ServerName does
|
15
|
+
## This works at all stack levels, and so is applied to environments and platforms too
|
16
|
+
stack_level_instance = ::IRB.CurrentContext.workspace.main
|
17
|
+
return constant_name.to_s if stack_level_instance.is_stack_level_resource?(constant_name)
|
18
|
+
super
|
19
|
+
end
|
20
|
+
|
21
|
+
def method_missing(method_sym, *arguments, &block)
|
22
|
+
if command_for_context = command_for_context(method_sym)
|
23
|
+
execute_command_for_context(command_for_context)
|
24
|
+
elsif recipe = ::Bcome::Orchestrator::Recipe.by_identifier(method_sym.to_s, self)
|
25
|
+
puts "Executing Command Recipe #{recipe.recipe_identifier}".informational
|
26
|
+
puts "Description: #{recipe.description}".command
|
27
|
+
recipe.execute!(machines)
|
28
|
+
return
|
29
|
+
else
|
30
|
+
# Else, this could be a resource level item
|
31
|
+
return method_sym.to_s if is_stack_level_resource?(method_sym)
|
32
|
+
super
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
12
36
|
def has_sub_nodes?
|
13
37
|
return true
|
14
38
|
end
|
@@ -29,19 +53,6 @@ module ::Bcome::Stack
|
|
29
53
|
return (command_for_context(method_sym) || ::Bcome::Orchestrator::Recipe.by_identifier(method_sym.to_s, self)) ? true : false
|
30
54
|
end
|
31
55
|
|
32
|
-
def method_missing(method_sym, *arguments, &block)
|
33
|
-
if command_for_context = command_for_context(method_sym)
|
34
|
-
execute_command_for_context(command_for_context)
|
35
|
-
elsif recipe = ::Bcome::Orchestrator::Recipe.by_identifier(method_sym.to_s, self)
|
36
|
-
puts "Executing Command Recipe #{recipe.recipe_identifier}".informational
|
37
|
-
puts "Description: #{recipe.description}".command
|
38
|
-
recipe.execute!(machines)
|
39
|
-
return
|
40
|
-
else
|
41
|
-
super
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
56
|
def construct_node
|
46
57
|
node_attributes = meta_data
|
47
58
|
|
@@ -59,7 +70,6 @@ module ::Bcome::Stack
|
|
59
70
|
end
|
60
71
|
|
61
72
|
def init
|
62
|
-
puts "loading resources #{self.class} "
|
63
73
|
node
|
64
74
|
end
|
65
75
|
|
@@ -97,7 +107,7 @@ module ::Bcome::Stack
|
|
97
107
|
[
|
98
108
|
{ :command => "list / ls", :description => "List all available resources at the current context." },
|
99
109
|
{ :command => "describe", :description => "Describe the resource object at the current context." },
|
100
|
-
{ :command => "cd
|
110
|
+
{ :command => "cd NodeName", :description => "Select a resource object, and switch to its context.", :usage => "cd YourServerName" },
|
101
111
|
{ :command => "exit", :description => "Return to the previous context" },
|
102
112
|
{ :command => "exit!", :description => "Close all contexts, and exit Become."},
|
103
113
|
{ :command => "local", :description => "Execute a shell command on your local machine.", :usage => 'local "command"'},
|
data/lib/stack/environment.rb
CHANGED
@@ -27,9 +27,9 @@ module ::Bcome::Stack
|
|
27
27
|
|
28
28
|
def menu_items
|
29
29
|
super + [
|
30
|
-
{ :command => "add", :description => "Add a resource you wish to work on.", :usage => "add
|
30
|
+
{ :command => "add", :description => "Add a resource you wish to work on.", :usage => "add MyServerIdentifier, OR add [array, of, identifiers]" },
|
31
31
|
{ :command => "add!", :description => "Add all resources from the current context." },
|
32
|
-
{ :command => "remove", :description => "Remove a resource you no longer with to work on.", :usage => "remove
|
32
|
+
{ :command => "remove", :description => "Remove a resource you no longer with to work on.", :usage => "remove MyServerIdentifier, OR remove [array, of, identifiers]" },
|
33
33
|
{ :command => "clear!", :description => "Remove all selected resources." },
|
34
34
|
{ :command => "selections", :description => "Show all added resources.", :usage => "selections / s"},
|
35
35
|
{ :command => "run", :description => "Execute a command on all selected resources", :usage => "run 'command'" },
|
data/lib/stack/estate.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bcome
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Guillaume Roderick (Webzakimbo)
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-08-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk
|
@@ -116,8 +116,9 @@ dependencies:
|
|
116
116
|
version: 1.1.1
|
117
117
|
description: Provides a console interface for traversing a hierarchy of platforms
|
118
118
|
-> environment -> servers, and exposes common administration tools for the managemenent
|
119
|
-
either of individual servers, or groups
|
120
|
-
configuration
|
119
|
+
either of individual servers, or groups of servers. The system is driven from simple
|
120
|
+
configuration and is extensible. It integrates with AWS EC2 for dynamic network
|
121
|
+
discovery. Machines may be interacted with directly from the command line.
|
121
122
|
email:
|
122
123
|
- guillaume@webzakimbo.com
|
123
124
|
executables:
|
@@ -139,6 +140,8 @@ files:
|
|
139
140
|
- documentation/examples/platform.yml-example
|
140
141
|
- documentation/external_usage.md
|
141
142
|
- documentation/functions.md
|
143
|
+
- documentation/images/direct_cmd_execution.png
|
144
|
+
- documentation/images/direct_ssh.png
|
142
145
|
- documentation/installation.md
|
143
146
|
- documentation/usage.md
|
144
147
|
- filters/ec2_filter.rb
|
@@ -213,5 +216,5 @@ rubyforge_project:
|
|
213
216
|
rubygems_version: 2.2.2
|
214
217
|
signing_key:
|
215
218
|
specification_version: 4
|
216
|
-
summary: Toolkit for managing
|
219
|
+
summary: Toolkit for managing machines - simplify your workflow.
|
217
220
|
test_files: []
|