knife-stackbuilder 0.5.2
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 +7 -0
- data/README.md +115 -0
- data/Rakefile +42 -0
- data/bin/stackbuilder_debug +0 -0
- data/lib/chef/knife/stack_build.rb +114 -0
- data/lib/chef/knife/stack_delete.rb +50 -0
- data/lib/chef/knife/stack_initialize_repo.rb +62 -0
- data/lib/chef/knife/stack_upload_certificates.rb +38 -0
- data/lib/chef/knife/stack_upload_cookbooks.rb +49 -0
- data/lib/chef/knife/stack_upload_data_bags.rb +36 -0
- data/lib/chef/knife/stack_upload_environments.rb +31 -0
- data/lib/chef/knife/stack_upload_repo.rb +39 -0
- data/lib/chef/knife/stack_upload_roles.rb +33 -0
- data/lib/chef/knife/stackbuilder_base.rb +32 -0
- data/lib/stackbuilder/chef/repo.rb +442 -0
- data/lib/stackbuilder/chef/stack_generic_node.rb +67 -0
- data/lib/stackbuilder/chef/stack_node_manager.rb +251 -0
- data/lib/stackbuilder/chef/stack_provider.rb +77 -0
- data/lib/stackbuilder/chef/stack_vagrant_node.rb +72 -0
- data/lib/stackbuilder/common/config.rb +44 -0
- data/lib/stackbuilder/common/errors.rb +18 -0
- data/lib/stackbuilder/common/helpers.rb +379 -0
- data/lib/stackbuilder/common/semaphore.rb +54 -0
- data/lib/stackbuilder/common/teeio.rb +29 -0
- data/lib/stackbuilder/stack/node_manager.rb +38 -0
- data/lib/stackbuilder/stack/node_provider.rb +21 -0
- data/lib/stackbuilder/stack/node_task.rb +424 -0
- data/lib/stackbuilder/stack/stack.rb +224 -0
- data/lib/stackbuilder/version.rb +8 -0
- data/lib/stackbuilder.rb +53 -0
- metadata +100 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8de9741b23271b0bafcd08a39d7fe5f5e7a53030
|
4
|
+
data.tar.gz: 8d134e95054c1bb253f477fa4d10eed38e34ca74
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 16f91cc0f5846a7710a50cde9ba66cf2fad80c91a82a3d35246c4109ec6a3d9abfece254b6ff5dd0d68ab533c499c6bdccac8f5e170984c4f24900802b8b5c89
|
7
|
+
data.tar.gz: 12fcdbf1f952293f844e4ef8379e565e36148393a16a7ac8a26517639328bc29642ccc51d3dc794c57ffaaceadf34d23deed1cf4ae673684743305e7e219c3bc
|
data/README.md
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
# Knife StackBuilder plugin
|
2
|
+
|
3
|
+
## Usage
|
4
|
+
|
5
|
+
```
|
6
|
+
knife stack initialize repo
|
7
|
+
|
8
|
+
Initializes or validates an existing stack repo. The stack repo should contain the
|
9
|
+
following folders along with a Berksfile.
|
10
|
+
|
11
|
+
* cookbooks
|
12
|
+
* environments
|
13
|
+
* secrets
|
14
|
+
* databags
|
15
|
+
* roles
|
16
|
+
* stacks
|
17
|
+
|
18
|
+
--path
|
19
|
+
|
20
|
+
Path to create and initialize the stack chef repository. If the repository already
|
21
|
+
exists then any it will be validated. If the provided path begins with git:, http:
|
22
|
+
or https:, it will be assumed to be a git repo. A branch/label may be specified
|
23
|
+
by preceding it with a : after the path.
|
24
|
+
|
25
|
+
i.e. http://github.com/mevansam/mystack:tag1
|
26
|
+
|
27
|
+
--cert_path | --certs
|
28
|
+
|
29
|
+
If "--cert_path" is specified then it should point to a directory with a folder for
|
30
|
+
each server domain name containing that server's certificate files.
|
31
|
+
|
32
|
+
If instead "--certs" are specified then it should provide a comma separated list of
|
33
|
+
server domain names for which self-signed certificates will be generated.
|
34
|
+
|
35
|
+
--envs
|
36
|
+
|
37
|
+
Comma separated list of environments to generate.
|
38
|
+
|
39
|
+
--cookbooks
|
40
|
+
|
41
|
+
A comma separated list of cookbooks and their versions to be added to the Berksfile.
|
42
|
+
|
43
|
+
i.e. "mysql:=5.6.1, wordpress:~> 2.3.0"
|
44
|
+
```
|
45
|
+
|
46
|
+
```
|
47
|
+
knife stack upload cookbook[s]
|
48
|
+
```
|
49
|
+
|
50
|
+
```
|
51
|
+
knife stack upload environment[s]
|
52
|
+
```
|
53
|
+
|
54
|
+
```
|
55
|
+
knife stack upload role[s]
|
56
|
+
```
|
57
|
+
|
58
|
+
```
|
59
|
+
knife stack upload data bag[s]
|
60
|
+
```
|
61
|
+
|
62
|
+
```
|
63
|
+
knife stack upload repo
|
64
|
+
```
|
65
|
+
|
66
|
+
```
|
67
|
+
knife stack build
|
68
|
+
```
|
69
|
+
|
70
|
+
## Design
|
71
|
+
|
72
|
+
### Berkshelf Cookbook Repository Management
|
73
|
+
|
74
|
+
### Externalizing configuration values and order of evaluation
|
75
|
+
|
76
|
+
#### Requesting user input for non-persisted values
|
77
|
+
|
78
|
+
#### Including common yaml configurations
|
79
|
+
|
80
|
+
#### Processing node attributes
|
81
|
+
|
82
|
+
### Converging a cluster using target nodes
|
83
|
+
|
84
|
+
* Magic variables
|
85
|
+
|
86
|
+
### Dependency management and orchestration
|
87
|
+
|
88
|
+
## To Do:
|
89
|
+
|
90
|
+
* Use Chef Pushy instead of Knife SSH
|
91
|
+
* Add option to execute Chef Push jobs on events
|
92
|
+
|
93
|
+
## Contributing
|
94
|
+
|
95
|
+
1. Fork the repository on Github
|
96
|
+
2. Write your change
|
97
|
+
3. Write tests for your change (if applicable)
|
98
|
+
4. Run the tests, ensuring they all pass
|
99
|
+
5. Submit a Pull Request
|
100
|
+
|
101
|
+
## License and Authors
|
102
|
+
|
103
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
104
|
+
you may not use this file except in compliance with the License.
|
105
|
+
You may obtain a copy of the License at
|
106
|
+
|
107
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
108
|
+
|
109
|
+
Unless required by applicable law or agreed to in writing, software
|
110
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
111
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
112
|
+
See the License for the specific language governing permissions and
|
113
|
+
limitations under the License.
|
114
|
+
|
115
|
+
Author: Mevan Samaratunga (mevansam@gmail.com)
|
data/Rakefile
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# Copyright (c) 2014 Mevan Samaratunga
|
2
|
+
|
3
|
+
$:.unshift(File.expand_path("../../rake", __FILE__))
|
4
|
+
|
5
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __FILE__)
|
6
|
+
|
7
|
+
require "rubygems"
|
8
|
+
require "bundler"
|
9
|
+
Bundler.setup(:default, :test)
|
10
|
+
|
11
|
+
require "rake"
|
12
|
+
begin
|
13
|
+
require "rspec/core/rake_task"
|
14
|
+
rescue LoadError
|
15
|
+
end
|
16
|
+
|
17
|
+
gem_helper = Bundler::GemHelper.new(Dir.pwd)
|
18
|
+
|
19
|
+
desc "Build gem into the pkg directory"
|
20
|
+
task "build" do
|
21
|
+
gem_helper.build_gem
|
22
|
+
end
|
23
|
+
|
24
|
+
desc "Build and install into gem environment"
|
25
|
+
task "install" do
|
26
|
+
Rake::Task["bundler:install"].invoke
|
27
|
+
gem_helper.install_gem
|
28
|
+
end
|
29
|
+
|
30
|
+
if defined?(RSpec)
|
31
|
+
namespace :spec do
|
32
|
+
desc "Run Unit Tests"
|
33
|
+
rspec_task = RSpec::Core::RakeTask.new(:unit) do |t|
|
34
|
+
t.pattern = "spec/**/*_spec.rb"
|
35
|
+
t.rspec_opts = %w(--format progress --colour)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
desc "Run tests"
|
40
|
+
task :spec => %w(spec:unit)
|
41
|
+
task :default => :spec
|
42
|
+
end
|
File without changes
|
@@ -0,0 +1,114 @@
|
|
1
|
+
# Copyright (c) 2014 Mevan Samaratunga
|
2
|
+
|
3
|
+
require 'chef/knife/stackbuilder_base'
|
4
|
+
|
5
|
+
class Chef
|
6
|
+
class Knife
|
7
|
+
|
8
|
+
class StackBuild < Knife
|
9
|
+
|
10
|
+
include Knife::StackBuilderBase
|
11
|
+
|
12
|
+
banner 'knife stack build STACK_FILE (options)'
|
13
|
+
|
14
|
+
option :stack_id,
|
15
|
+
:long => "--stack-id STACK_ID",
|
16
|
+
:description => "The unique ID for the stack. If a stack with the given" +
|
17
|
+
"ID does not exist then a new one will be create. If a stack for the" +
|
18
|
+
"given ID exists then it will be initialized with its current state."
|
19
|
+
|
20
|
+
option :node,
|
21
|
+
:long => "--node NODE_TYPE_NAME[:SCALE]",
|
22
|
+
:description => "Applies the events to all hosts of a given node type. The " +
|
23
|
+
"node type is the value of the node key of a list of stack nodes"
|
24
|
+
|
25
|
+
option :overrides,
|
26
|
+
:long => "--overrides OVERRIDES",
|
27
|
+
:description => "JSON string or file ending with .json containing " +
|
28
|
+
"attributes to be overridden"
|
29
|
+
|
30
|
+
option :events,
|
31
|
+
:long => "--events EVENTS",
|
32
|
+
:description => "List of comma separate events to apply. If no events are " +
|
33
|
+
"provided then events 'create', 'install', 'configure' will be applied " +
|
34
|
+
"to each new host that is either created or bootstrapped first time. If " +
|
35
|
+
"node already exists then only the 'configure' event is applied. When " +
|
36
|
+
"the 'configure' event is applied chef-client will be run on each node. " +
|
37
|
+
"If the 'update' event is applied then the nodes run list will be updated " +
|
38
|
+
"and chef-client will be run."
|
39
|
+
|
40
|
+
option :repo_path,
|
41
|
+
:long => "--repo-path REPO_PATH",
|
42
|
+
:description => "The path to the Chef repo. This is required in order " +
|
43
|
+
"to copy the correct encryption keys from the 'secrets' folder to " +
|
44
|
+
"the target host as well as to read the externalized environment",
|
45
|
+
:default => '.'
|
46
|
+
|
47
|
+
option :show_stack_file,
|
48
|
+
:long => "--show-stack-file",
|
49
|
+
:description => "Outputs the parsed yaml of the stack file and exits."
|
50
|
+
|
51
|
+
def run
|
52
|
+
time_start = Time.now
|
53
|
+
|
54
|
+
StackBuilder::Common::Config.logger.level = Chef::Log.logger.level
|
55
|
+
|
56
|
+
repo_path = getConfig(:repo_path)
|
57
|
+
environment = getConfig(:environment) || '_default'
|
58
|
+
|
59
|
+
stack_file = name_args.first
|
60
|
+
if stack_file=~/[-_+=.0-9a-zA-Z]+/
|
61
|
+
stack_file = Dir.getwd + '/' + stack_file + (stack_file.end_with?('.yml') ? '' : '.yml')
|
62
|
+
end
|
63
|
+
unless File.exist?(stack_file)
|
64
|
+
puts "Stack file '#{stack_file}' does not exist."
|
65
|
+
exit 1
|
66
|
+
end
|
67
|
+
|
68
|
+
provider = StackBuilder::Chef::NodeProvider.new(repo_path, environment)
|
69
|
+
if getConfig(:show_stack_file)
|
70
|
+
|
71
|
+
env_vars = provider.get_env_vars
|
72
|
+
stack = StackBuilder::Common.load_yaml(stack_file, env_vars)
|
73
|
+
puts("Stack file:\n#{stack.to_yaml}")
|
74
|
+
|
75
|
+
else
|
76
|
+
# Validate repo path and update
|
77
|
+
# environment before building the stack
|
78
|
+
repo = StackBuilder::Chef::Repo.new(repo_path)
|
79
|
+
repo.upload_environments(environment)
|
80
|
+
|
81
|
+
stack_id = getConfig(:stack_id) || ENV['STACK_ID']
|
82
|
+
stack_overrides = getConfig(:overrides) || ENV['STACK_OVERRIDES']
|
83
|
+
|
84
|
+
stack = StackBuilder::Stack::Stack.new(
|
85
|
+
provider,
|
86
|
+
stack_file,
|
87
|
+
stack_id,
|
88
|
+
stack_overrides )
|
89
|
+
|
90
|
+
node = getConfig(:node)
|
91
|
+
unless node.nil?
|
92
|
+
node_name = node.split(':')[0]
|
93
|
+
node_scale = node.split(':')[1]
|
94
|
+
node_scale = node_scale.to_i unless node_scale.nil?
|
95
|
+
end
|
96
|
+
|
97
|
+
events = nil
|
98
|
+
if getConfig(:events)
|
99
|
+
events = events = Set.new(getConfig(:events).split(','))
|
100
|
+
end
|
101
|
+
|
102
|
+
stack.orchestrate(events, node_name, node_scale)
|
103
|
+
end
|
104
|
+
|
105
|
+
ensure
|
106
|
+
time_elapsed = Time.now - time_start
|
107
|
+
|
108
|
+
$stdout.printf( "\nStack build for '%s' took %d minutes and '%.3f' seconds\n",
|
109
|
+
stack_file, time_elapsed/60, time_elapsed%60 ) if !getConfig(:show_stack_file)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# Copyright (c) 2014 Mevan Samaratunga
|
2
|
+
|
3
|
+
require 'chef/knife/stackbuilder_base'
|
4
|
+
|
5
|
+
class Chef
|
6
|
+
class Knife
|
7
|
+
|
8
|
+
class StackDelete < Knife
|
9
|
+
|
10
|
+
include Knife::StackBuilderBase
|
11
|
+
|
12
|
+
banner 'knife stack delete STACK_FILE (options)'
|
13
|
+
|
14
|
+
option :stack_id,
|
15
|
+
:long => "--stack-id STACK_ID",
|
16
|
+
:description => "The ID of the stack to delete.",
|
17
|
+
:required => true
|
18
|
+
|
19
|
+
option :repo_path,
|
20
|
+
:long => "--repo_path REPO_PATH",
|
21
|
+
:description => "The path to the Chef repo. This is required " +
|
22
|
+
"in order read the externalized environment",
|
23
|
+
:default => '.'
|
24
|
+
|
25
|
+
def run
|
26
|
+
StackBuilder::Common::Config.logger.level = Chef::Log.logger.level
|
27
|
+
|
28
|
+
environment = getConfig(:environment) || '_default'
|
29
|
+
stack_file = name_args.first
|
30
|
+
|
31
|
+
if stack_file=~/[-_+=.0-9a-zA-Z]+/
|
32
|
+
stack_file = Dir.getwd + '/' + stack_file + (stack_file.end_with?('.yml') ? '' : '.yml')
|
33
|
+
end
|
34
|
+
|
35
|
+
unless File.exist?(stack_file)
|
36
|
+
puts "Stack file '#{stack_file}' does not exist."
|
37
|
+
exit 1
|
38
|
+
end
|
39
|
+
|
40
|
+
stack = StackBuilder::Stack::Stack.new(
|
41
|
+
StackBuilder::Chef::NodeProvider.new(getConfig(:repo_path), environment),
|
42
|
+
stack_file,
|
43
|
+
getConfig(:stack_id) )
|
44
|
+
|
45
|
+
stack.destroy
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# Copyright (c) 2014 Mevan Samaratunga
|
2
|
+
|
3
|
+
require 'chef/knife/stackbuilder_base'
|
4
|
+
|
5
|
+
class Chef
|
6
|
+
class Knife
|
7
|
+
|
8
|
+
class StackInitializeRepo < Knife
|
9
|
+
|
10
|
+
include Knife::StackBuilderBase
|
11
|
+
|
12
|
+
banner 'knife stack initialize repo (options)'
|
13
|
+
|
14
|
+
option :repo_path,
|
15
|
+
:long => "--repo_path REPO_PATH",
|
16
|
+
:description => "The path where a skeleton Chef Berkshelf repo will be created. " +
|
17
|
+
"If this is no provided the current working directory will be initialized.",
|
18
|
+
:default => '.'
|
19
|
+
|
20
|
+
option :cert_path,
|
21
|
+
:long => "--cert_path CERT_PATH",
|
22
|
+
:description => "Path containing folders with server certificates. Each folder " +
|
23
|
+
"within this path should be named after the server for which the certs are " +
|
24
|
+
"meant post-fixed by _{ENV_NAME}. If name is not post-fixed then the cert " +
|
25
|
+
"will be uploaded to all environments"
|
26
|
+
|
27
|
+
option :certs,
|
28
|
+
:long => "--certs SERVER_NAMES",
|
29
|
+
:description => "Comma separated list of server names for which self-signed " +
|
30
|
+
"certificates will be generated."
|
31
|
+
|
32
|
+
option :envs,
|
33
|
+
:long => "--stack_envs ENVIRONMENTS",
|
34
|
+
:description => "Comma separated list of environments to generate"
|
35
|
+
|
36
|
+
option :cookbooks,
|
37
|
+
:long => "--cookbooks COOKBOOKS",
|
38
|
+
:description => "A comma separated list of cookbooks and their versions to be " +
|
39
|
+
"added to the Berksfile i.e. \"mysql:=5.6.1, wordpress:~> 2.3.0\""
|
40
|
+
|
41
|
+
def run
|
42
|
+
StackBuilder::Common::Config.logger.level = Chef::Log.logger.level
|
43
|
+
|
44
|
+
cert_path = getConfig(:cert_path)
|
45
|
+
certs = getConfig(:certs)
|
46
|
+
|
47
|
+
if !cert_path.nil? && !certs.nil?
|
48
|
+
puts "Only one of --cert_path or --certs can be specified."
|
49
|
+
show_usage
|
50
|
+
exit 1
|
51
|
+
end
|
52
|
+
|
53
|
+
StackBuilder::Chef::Repo.new(
|
54
|
+
getConfig(:repo_path),
|
55
|
+
cert_path.nil? ? certs : cert_path,
|
56
|
+
getConfig(:envs),
|
57
|
+
getConfig(:cookbooks) )
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# Copyright (c) 2014 Mevan Samaratunga
|
2
|
+
|
3
|
+
require 'chef/knife/stackbuilder_base'
|
4
|
+
|
5
|
+
class Chef
|
6
|
+
class Knife
|
7
|
+
|
8
|
+
class StackUploadCertificates < Knife
|
9
|
+
|
10
|
+
include Knife::StackBuilderBase
|
11
|
+
|
12
|
+
banner "knife stack upload certificates"
|
13
|
+
|
14
|
+
option :repo_path,
|
15
|
+
:long => "--repo_path REPO_PATH",
|
16
|
+
:description => "The path to the Chef Berkshelf repo. All the " +
|
17
|
+
"certificates associated with this repository would have " +
|
18
|
+
"been copied to a hidden folder '.certs' within this path " +
|
19
|
+
"when it was initialized.",
|
20
|
+
:default => '.'
|
21
|
+
|
22
|
+
option :server,
|
23
|
+
:long => "--server NAME",
|
24
|
+
:description => "The name of the server whose " +
|
25
|
+
"certificate is to be uploaded"
|
26
|
+
|
27
|
+
def run
|
28
|
+
StackBuilder::Common::Config.logger.level = Chef::Log.logger.level
|
29
|
+
|
30
|
+
environment = getConfig(:environment)
|
31
|
+
|
32
|
+
repo = StackBuilder::Chef::Repo.new(getConfig(:repo_path))
|
33
|
+
repo.upload_certificates(environment, getConfig(:server))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# Copyright (c) 2014 Mevan Samaratunga
|
2
|
+
|
3
|
+
require 'chef/knife/stackbuilder_base'
|
4
|
+
|
5
|
+
class Chef
|
6
|
+
class Knife
|
7
|
+
|
8
|
+
class StackUploadCookbooks < Knife
|
9
|
+
|
10
|
+
include Knife::StackBuilderBase
|
11
|
+
|
12
|
+
banner 'knife stack upload cookbooks (options)'
|
13
|
+
|
14
|
+
option :repo_path,
|
15
|
+
:long => "--repo_path REPO_PATH",
|
16
|
+
:description => "The path to the Chef repo containing the Berkshelf file.",
|
17
|
+
:default => '.'
|
18
|
+
|
19
|
+
option :cookbook,
|
20
|
+
:long => "--cookbook NAME",
|
21
|
+
:description => "The cookbook upload/update"
|
22
|
+
|
23
|
+
option :berks_options,
|
24
|
+
:long => "--berks-options options",
|
25
|
+
:description => "Comma separated list of berkshelf upload options"
|
26
|
+
|
27
|
+
option :berks_knife_config,
|
28
|
+
:long => "--berks-knife-config options",
|
29
|
+
:description => "Knife configuration file to be passed to Berkshelf"
|
30
|
+
|
31
|
+
def run
|
32
|
+
StackBuilder::Common::Config.logger.level = Chef::Log.logger.level
|
33
|
+
|
34
|
+
repo = StackBuilder::Chef::Repo.new(getConfig(:repo_path))
|
35
|
+
|
36
|
+
berks_knife_config = getConfig(:berks_knife_config)
|
37
|
+
ENV['BERKSHELF_CHEF_CONFIG'] = berks_knife_config unless berks_knife_config.nil?
|
38
|
+
|
39
|
+
berks_options = getConfig(:berks_options)
|
40
|
+
unless berks_options.nil?
|
41
|
+
repo.upload_cookbooks(getConfig(:cookbook), berks_options.gsub(/,/, ' '))
|
42
|
+
else
|
43
|
+
repo.upload_cookbooks(getConfig(:cookbook))
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# Copyright (c) 2014 Mevan Samaratunga
|
2
|
+
|
3
|
+
require 'chef/knife/stackbuilder_base'
|
4
|
+
|
5
|
+
class Chef
|
6
|
+
class Knife
|
7
|
+
|
8
|
+
class StackUploadDataBags < Knife
|
9
|
+
|
10
|
+
include Knife::StackBuilderBase
|
11
|
+
|
12
|
+
banner "knife stack upload data bags (options)"
|
13
|
+
|
14
|
+
option :repo_path,
|
15
|
+
:long => "--repo_path REPO_PATH",
|
16
|
+
:description => "The path to the Chef repo containing the data_bags " +
|
17
|
+
"within a 'data_bags' folder. All data bags will be encrypted with " +
|
18
|
+
"keys per environment located in the 'secrets' folder of the repo.",
|
19
|
+
:default => '.'
|
20
|
+
|
21
|
+
option :data_bag,
|
22
|
+
:long => "--data_bag NAME",
|
23
|
+
:description => "The data bag to upload/update"
|
24
|
+
|
25
|
+
def run
|
26
|
+
StackBuilder::Common::Config.logger.level = Chef::Log.logger.level
|
27
|
+
|
28
|
+
environment = getConfig(:environment)
|
29
|
+
|
30
|
+
repo = StackBuilder::Chef::Repo.new(getConfig(:repo_path))
|
31
|
+
repo.upload_data_bags(environment, getConfig(:data_bag))
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# Copyright (c) 2014 Mevan Samaratunga
|
2
|
+
|
3
|
+
require 'chef/knife/stackbuilder_base'
|
4
|
+
|
5
|
+
class Chef
|
6
|
+
class Knife
|
7
|
+
|
8
|
+
class StackUploadEnvironments < Knife
|
9
|
+
|
10
|
+
include Knife::StackBuilderBase
|
11
|
+
|
12
|
+
banner "knife stack upload environments (options)"
|
13
|
+
|
14
|
+
option :repo_path,
|
15
|
+
:long => "--repo_path REPO_PATH",
|
16
|
+
:description => "The path to the Chef repo containing " +
|
17
|
+
"the environments within an 'environments' folder.",
|
18
|
+
:default => '.'
|
19
|
+
|
20
|
+
def run
|
21
|
+
StackBuilder::Common::Config.logger.level = Chef::Log.logger.level
|
22
|
+
|
23
|
+
environment = getConfig(:environment)
|
24
|
+
|
25
|
+
repo = StackBuilder::Chef::Repo.new(getConfig(:repo_path))
|
26
|
+
repo.upload_environments(environment)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# Copyright (c) 2014 Mevan Samaratunga
|
2
|
+
|
3
|
+
require 'chef/knife/stackbuilder_base'
|
4
|
+
|
5
|
+
class Chef
|
6
|
+
class Knife
|
7
|
+
|
8
|
+
class StackUploadRepo < Knife
|
9
|
+
|
10
|
+
include Knife::StackBuilderBase
|
11
|
+
|
12
|
+
banner "knife stack upload repo (options)"
|
13
|
+
|
14
|
+
option :repo_path,
|
15
|
+
:long => "--repo_path REPO_PATH",
|
16
|
+
:description => "The path to the Chef repo.",
|
17
|
+
:default => '.'
|
18
|
+
|
19
|
+
def run
|
20
|
+
StackBuilder::Common::Config.logger.level = Chef::Log.logger.level
|
21
|
+
|
22
|
+
environment = getConfig(:environment)
|
23
|
+
|
24
|
+
repo = StackBuilder::Chef::Repo.new(getConfig(:repo_path))
|
25
|
+
|
26
|
+
berks_knife_config = getConfig(:berks_knife_config)
|
27
|
+
ENV['BERKSHELF_CHEF_CONFIG'] = berks_knife_config unless berks_knife_config.nil?
|
28
|
+
|
29
|
+
repo.upload_cookbooks
|
30
|
+
repo.upload_roles
|
31
|
+
|
32
|
+
repo.upload_environments(environment)
|
33
|
+
repo.upload_data_bags(environment)
|
34
|
+
repo.upload_certificates(environment)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# Copyright (c) 2014 Mevan Samaratunga
|
2
|
+
|
3
|
+
require 'chef/knife/stackbuilder_base'
|
4
|
+
|
5
|
+
class Chef
|
6
|
+
class Knife
|
7
|
+
|
8
|
+
class StackUploadRoles < Knife
|
9
|
+
|
10
|
+
include Knife::StackBuilderBase
|
11
|
+
|
12
|
+
banner "knife stack upload roles (options)"
|
13
|
+
|
14
|
+
option :repo_path,
|
15
|
+
:long => "--repo_path REPO_PATH",
|
16
|
+
:description => "The path to the Chef repo containing " +
|
17
|
+
"the roles within a 'roles' folder.",
|
18
|
+
:default => '.'
|
19
|
+
|
20
|
+
option :role,
|
21
|
+
:long => "--role NAME",
|
22
|
+
:description => "The role upload/update"
|
23
|
+
|
24
|
+
def run
|
25
|
+
StackBuilder::Common::Config.logger.level = Chef::Log.logger.level
|
26
|
+
|
27
|
+
repo = StackBuilder::Chef::Repo.new(getConfig(:repo_path))
|
28
|
+
repo.upload_roles(getConfig(:role))
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# Copyright (c) 2014 Mevan Samaratunga
|
2
|
+
|
3
|
+
class Chef
|
4
|
+
class Knife
|
5
|
+
|
6
|
+
module StackBuilderBase
|
7
|
+
|
8
|
+
def self.included(includer)
|
9
|
+
|
10
|
+
includer.class_eval do
|
11
|
+
|
12
|
+
deps do
|
13
|
+
require 'stackbuilder'
|
14
|
+
|
15
|
+
config = OpenStruct.new(
|
16
|
+
:logger => Chef::Log.logger,
|
17
|
+
:enable_caching => false,
|
18
|
+
:timeouts => { :CACHE_TIMEOUT => 1800 } )
|
19
|
+
|
20
|
+
StackBuilder::Common::Config.configure(config)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def getConfig(key)
|
25
|
+
key = key.to_sym
|
26
|
+
config[key] || Chef::Config[:knife][key]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|