knife-sharp 0.5.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -1
- data/ext/sharp-config.yml +6 -3
- data/lib/chef/knife/sharp-align.rb +31 -11
- data/lib/chef/knife/sharp-environment-align.rb +133 -0
- data/lib/knife-sharp.rb +1 -1
- data/lib/knife-sharp/common.rb +21 -2
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ddab4231fc3e426c9a71063a2a417b10b3cae947
|
4
|
+
data.tar.gz: eda6e7ed4b19017b5a386b2550b1cbaac6364a0e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4070ebe2f93b5bbbef1fa1a28652b5988ab76d356cb6383bb20d9646dec145c13c6e8ceecdef8930e8b3581347f50ff66f3f435b7c449283e404f435e02f6a51
|
7
|
+
data.tar.gz: 53dd08f8ad6159fa06096a69f177e57d7da443df3ac607517be1ee6f495dab513eff969c573f114d72e3c351d04a77e0b1fafe55c4090876f8e101b2e1d2fe54
|
data/README.md
CHANGED
@@ -72,7 +72,7 @@ $ knife sharp align ldap production
|
|
72
72
|
|
73
73
|
Cookbooks, data_bags and roles are uploaded, and cookbook versions updated in given environment.
|
74
74
|
|
75
|
-
To use all of these features, your knife.rb(s) must provide paths for cookbooks, data bags and
|
75
|
+
To use all of these features, your knife.rb(s) must provide paths for cookbooks, data bags, roles and environments (see [configuration](#Configuration))
|
76
76
|
|
77
77
|
### Ignore list
|
78
78
|
|
@@ -188,6 +188,7 @@ Fully enabled Sharp needs:
|
|
188
188
|
cookbook_path '/home/jamiez/chef/cookbooks'
|
189
189
|
data_bag_path '/home/jamiez/chef/data_bags'
|
190
190
|
role_path '/home/jamiez/chef/roles'
|
191
|
+
environment_path '/home/jamiez/chef/environments'
|
191
192
|
```
|
192
193
|
in knife.rb
|
193
194
|
|
data/ext/sharp-config.yml
CHANGED
@@ -8,11 +8,14 @@ global:
|
|
8
8
|
# backup dir for knife sharp backup
|
9
9
|
backupdir: "/home/nico/.chef/sharp/backups/"
|
10
10
|
|
11
|
-
# Currently only
|
11
|
+
# Currently only bot notifications supported
|
12
|
+
# notification operation:
|
13
|
+
# POST <url>/<channel>
|
14
|
+
# with JSON payload {"message": <message>}
|
12
15
|
notification:
|
13
|
-
|
16
|
+
bot:
|
14
17
|
enabled: true
|
15
|
-
url: "http://
|
18
|
+
url: "http://bot.lan:18080/chef/bump/"
|
16
19
|
channel: "foo"
|
17
20
|
username: "Nicolas"
|
18
21
|
# don't notify if updates are done on development chef
|
@@ -8,13 +8,29 @@ module KnifeSharp
|
|
8
8
|
|
9
9
|
banner "knife sharp align BRANCH ENVIRONMENT [OPTS]"
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
11
|
+
option :cookbooks,
|
12
|
+
:short => "-C",
|
13
|
+
:long => "--cookbooks-only",
|
14
|
+
:description => "sync cookbooks only",
|
15
|
+
:default => false
|
16
|
+
|
17
|
+
option :roles,
|
18
|
+
:short => "-R",
|
19
|
+
:long => "--roles-only",
|
20
|
+
:description => "sync roles only",
|
21
|
+
:default => false
|
22
|
+
|
23
|
+
option :databags,
|
24
|
+
:short => "-D",
|
25
|
+
:long => "--databags-only",
|
26
|
+
:description => "sync data bags only",
|
27
|
+
:default => false
|
28
|
+
|
29
|
+
option :environments,
|
30
|
+
:short => "-N",
|
31
|
+
:long => "--environments-only",
|
32
|
+
:description => "sync environments only",
|
33
|
+
:default => false
|
18
34
|
|
19
35
|
option :force_align,
|
20
36
|
:short => "-f",
|
@@ -36,10 +52,10 @@ module KnifeSharp
|
|
36
52
|
ensure_correct_branch_provided!
|
37
53
|
|
38
54
|
# check cli flags
|
39
|
-
if config[:cookbooks] or config[:databags] or config[:roles]
|
40
|
-
do_cookbooks, do_databags, do_roles = config[:cookbooks], config[:databags], config[:roles]
|
55
|
+
if config[:cookbooks] or config[:databags] or config[:roles] or config[:environments]
|
56
|
+
do_cookbooks, do_databags, do_roles, do_environments = config[:cookbooks], config[:databags], config[:roles], config[:environments]
|
41
57
|
else
|
42
|
-
do_cookbooks, do_databags, do_roles = true, true, true
|
58
|
+
do_cookbooks, do_databags, do_roles, do_environments = true, true, true, true
|
43
59
|
end
|
44
60
|
|
45
61
|
ui.msg(ui.color("On server #{chef_server}", :bold)) if chef_server
|
@@ -53,9 +69,12 @@ module KnifeSharp
|
|
53
69
|
SharpRoleAlign.load_deps
|
54
70
|
sra = SharpRoleAlign.new
|
55
71
|
roles_to_update = do_roles ? sra.check_roles : {}
|
72
|
+
SharpEnvironmentAlign.load_deps
|
73
|
+
sea = SharpEnvironmentAlign.new
|
74
|
+
environments_to_update = do_environments ? sea.check_environments : {}
|
56
75
|
|
57
76
|
# All questions asked, can we proceed ?
|
58
|
-
if cookbooks_to_update.empty? and databags_to_update.empty? and roles_to_update.empty?
|
77
|
+
if cookbooks_to_update.empty? and databags_to_update.empty? and roles_to_update.empty? and environments_to_update.empty?
|
59
78
|
ui.msg "Nothing else to do"
|
60
79
|
exit 0
|
61
80
|
end
|
@@ -64,6 +83,7 @@ module KnifeSharp
|
|
64
83
|
sca.bump_cookbooks(environment, cookbooks_to_update) if do_cookbooks
|
65
84
|
sda.update_databags(databags_to_update) if do_databags
|
66
85
|
sra.update_roles(roles_to_update) if do_roles
|
86
|
+
sea.update_environments(environments_to_update) if do_environments
|
67
87
|
end
|
68
88
|
end
|
69
89
|
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
require 'chef/knife'
|
2
|
+
require 'knife-sharp/common'
|
3
|
+
|
4
|
+
module KnifeSharp
|
5
|
+
class SharpEnvironmentAlign < Chef::Knife
|
6
|
+
include KnifeSharp::Common
|
7
|
+
|
8
|
+
banner "knife sharp environment align BRANCH [OPTS]"
|
9
|
+
|
10
|
+
deps do
|
11
|
+
require "chef/environment"
|
12
|
+
end
|
13
|
+
|
14
|
+
def run
|
15
|
+
# Checking args
|
16
|
+
ensure_branch_provided!
|
17
|
+
|
18
|
+
# Checking repo branch
|
19
|
+
ensure_correct_branch_provided!
|
20
|
+
|
21
|
+
ui.msg(ui.color("On server #{chef_server}", :bold)) if chef_server
|
22
|
+
|
23
|
+
to_update = check_environments
|
24
|
+
|
25
|
+
if to_update.empty?
|
26
|
+
ui.msg "Nothing else to do"
|
27
|
+
exit 0
|
28
|
+
end
|
29
|
+
|
30
|
+
ui.confirm(ui.color("> Proceed ", :bold))
|
31
|
+
|
32
|
+
update_environments(to_update)
|
33
|
+
end
|
34
|
+
|
35
|
+
def check_environments
|
36
|
+
not_up_to_date = Array.new
|
37
|
+
to_update = Array.new
|
38
|
+
|
39
|
+
unless File.exists?(environment_path)
|
40
|
+
ui.warn("Bad environment path, skipping environment sync.")
|
41
|
+
return to_update
|
42
|
+
end
|
43
|
+
|
44
|
+
ui.msg(ui.color("== Environments ==", :bold))
|
45
|
+
|
46
|
+
local_envs = Dir.glob(File.join(environment_path, "*.json")).map {|file| File.basename(file, ".json")}
|
47
|
+
remote_envs = Chef::Environment.list.keys
|
48
|
+
|
49
|
+
if local_envs.empty?
|
50
|
+
ui.warn("No local environment found, is the environment path correct ? (#{environment_path})")
|
51
|
+
return to_update
|
52
|
+
end
|
53
|
+
|
54
|
+
# Create new environments on server
|
55
|
+
(local_envs - remote_envs).each do |env|
|
56
|
+
local_env = Chef::Environment.load_from_file(env)
|
57
|
+
message = "* #{local_env.name} environment is local only"
|
58
|
+
if ignore_list(:environments).include(local_env.name)
|
59
|
+
message += " (ignored)"
|
60
|
+
else
|
61
|
+
not_up_to_date << local_env
|
62
|
+
end
|
63
|
+
ui.msg(message)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Compare envs common to local and remote
|
67
|
+
(remote_envs & local_envs).each do |env|
|
68
|
+
remote_env = Chef::Environment.load(env)
|
69
|
+
local_env = Chef::Environment.load_from_file(env)
|
70
|
+
|
71
|
+
diffs = relevant_env_keys.map do |method, display|
|
72
|
+
if remote_env.send(method) != local_env.send(method)
|
73
|
+
remote_env.send("#{method}=", local_env.send(method))
|
74
|
+
display
|
75
|
+
end
|
76
|
+
end.compact
|
77
|
+
|
78
|
+
unless diffs.empty?
|
79
|
+
message = "* #{remote_env.name} environment is not up-to-date (#{diffs.join(", ")})"
|
80
|
+
if ignore_list(:environments).include?(remote_env.name)
|
81
|
+
message += " (ignored)"
|
82
|
+
else
|
83
|
+
not_up_to_date << remote_env
|
84
|
+
end
|
85
|
+
ui.msg(message)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
if !not_up_to_date.empty?
|
90
|
+
all = false
|
91
|
+
not_up_to_date.each do |env|
|
92
|
+
answer = all ? "Y" : ui.ask_question("> Update #{env.name} environment on server ? Y/N/(A)ll/(Q)uit ", :default => "N").upcase
|
93
|
+
|
94
|
+
if answer == "A"
|
95
|
+
all = true
|
96
|
+
elsif answer == "Q"
|
97
|
+
ui.msg "* Aborting environment alignment."
|
98
|
+
break
|
99
|
+
end
|
100
|
+
|
101
|
+
if all or answer == "Y"
|
102
|
+
to_update << env
|
103
|
+
else
|
104
|
+
ui.msg "* Skipping #{env.name} environment"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
else
|
108
|
+
ui.msg "* Environments are up-to-date."
|
109
|
+
end
|
110
|
+
|
111
|
+
to_update
|
112
|
+
end
|
113
|
+
|
114
|
+
def update_environments(env_list)
|
115
|
+
env_list.each do |env|
|
116
|
+
begin
|
117
|
+
env.save
|
118
|
+
ui.msg("* Updating #{env.name} environment")
|
119
|
+
rescue Exception => e
|
120
|
+
ui.error("Unable to update #{env.name} environment (#{e.message})")
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def relevant_env_keys
|
126
|
+
# env sections to compare (methods)
|
127
|
+
{
|
128
|
+
"default_attributes" => "default attributes",
|
129
|
+
"override_attributes" => "override attributes"
|
130
|
+
}
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
data/lib/knife-sharp.rb
CHANGED
data/lib/knife-sharp/common.rb
CHANGED
@@ -38,6 +38,13 @@ module KnifeSharp
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
+
def ensure_branch_provided!
|
42
|
+
if @name_args.size != 1
|
43
|
+
show_usage
|
44
|
+
exit 1
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
41
48
|
def environment
|
42
49
|
@environment ||= @name_args.last
|
43
50
|
end
|
@@ -54,6 +61,10 @@ module KnifeSharp
|
|
54
61
|
@role_path ||= [Chef::Config.send(:role_path)].flatten.first
|
55
62
|
end
|
56
63
|
|
64
|
+
def environment_path
|
65
|
+
@environment_path ||= [Chef::Config.send(:environment_path)].flatten.first
|
66
|
+
end
|
67
|
+
|
57
68
|
def logger
|
58
69
|
return @logger unless @logger.nil?
|
59
70
|
|
@@ -91,7 +102,7 @@ module KnifeSharp
|
|
91
102
|
end
|
92
103
|
end
|
93
104
|
|
94
|
-
def
|
105
|
+
def bot(message, config={})
|
95
106
|
begin
|
96
107
|
require "net/http"
|
97
108
|
require "uri"
|
@@ -99,7 +110,15 @@ module KnifeSharp
|
|
99
110
|
notif = "chef: #{message} by #{config["username"]}"
|
100
111
|
Net::HTTP.post_form(uri, { "message" => notif })
|
101
112
|
rescue
|
102
|
-
ui.error "Unable to notify via
|
113
|
+
ui.error "Unable to notify via bot."
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def ignore_list(component)
|
118
|
+
if sharp_config[chef_server] and sharp_config[chef_server]["ignore_#{component}"]
|
119
|
+
sharp_config[chef_server]["ignore_#{component}"]
|
120
|
+
else
|
121
|
+
[]
|
103
122
|
end
|
104
123
|
end
|
105
124
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knife-sharp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nicolas Szalay
|
@@ -58,6 +58,7 @@ files:
|
|
58
58
|
- lib/chef/knife/sharp-backup.rb
|
59
59
|
- lib/chef/knife/sharp-cookbook-align.rb
|
60
60
|
- lib/chef/knife/sharp-data_bag-align.rb
|
61
|
+
- lib/chef/knife/sharp-environment-align.rb
|
61
62
|
- lib/chef/knife/sharp-history.rb
|
62
63
|
- lib/chef/knife/sharp-role-align.rb
|
63
64
|
- lib/chef/knife/sharp-rollback.rb
|