autostacker24 2.7.0 → 2.8.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/autostacker24 +13 -3
- data/lib/autostacker24/stacker.rb +25 -7
- metadata +15 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e405c67f86a7a42682df12547de1686350b61ffa
|
4
|
+
data.tar.gz: 29ae7334844df70bebbbdd4d240efc17ff722c32
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d1cda7fb0afcc62f33425db43e57a6833471347f846cee8bbcb8eaae9b218eb99e0775f841437206c67417780cbfdca48084d24e9cf1646b00ee31448951450d
|
7
|
+
data.tar.gz: dbbb645e16fcbe0e6df6e071c0af501c4e377d39fbcb1cec18b592999e136a9286f3e5c58eed5abc2086a5be49ae1f45d83a82ac46f424225b1284ff4a12ccad
|
data/bin/autostacker24
CHANGED
@@ -27,6 +27,12 @@ def load_file(path)
|
|
27
27
|
json?(data) ? JSON.parse(data) : YAML.load(data)
|
28
28
|
end
|
29
29
|
|
30
|
+
def validate_param(param)
|
31
|
+
kv = param.split('=', 2)
|
32
|
+
error("parameter #{param} is missing mandatory value") unless kv.size == 2
|
33
|
+
kv
|
34
|
+
end
|
35
|
+
|
30
36
|
args = OpenStruct.new
|
31
37
|
args.region = ENV['AWS_REGION']
|
32
38
|
args.params = {}
|
@@ -34,6 +40,7 @@ parser = OptionParser.new do |opts|
|
|
34
40
|
opts.banner = 'Usage: autostacker24 command [options]'
|
35
41
|
opts.separator ''
|
36
42
|
opts.separator 'Commands:'
|
43
|
+
opts.separator "\tlist list stacks"
|
37
44
|
opts.separator "\tupdate create or update a stack"
|
38
45
|
opts.separator "\tdelete delete a stack"
|
39
46
|
opts.separator "\tshow show processed template with pretty printing"
|
@@ -45,9 +52,10 @@ parser = OptionParser.new do |opts|
|
|
45
52
|
opts.on('--template TEMPLATE', 'Path to template') {|v| args.template = v}
|
46
53
|
opts.on('--stack STACK', 'Name of stack') {|v| args.stack = v}
|
47
54
|
opts.on('--parent PARENT', 'Name of parent stack') {|v| args.parent = v}
|
55
|
+
opts.on('--role-arn ROLE-ARN', 'Arn of execution role') {|v| args.role_arn = v}
|
48
56
|
opts.on('--region REGION', 'AWS region') {|v| args.region = v}
|
49
57
|
opts.on('--profile PROFILE', 'AWS profile (use aws configure)') {|v| args.profile = v}
|
50
|
-
opts.on('--param KEY=VALUE', 'Stack Parameter') {|v| args.params.store(*v
|
58
|
+
opts.on('--param KEY=VALUE', 'Stack Parameter') {|v| args.params.store(*validate_param(v)) }
|
51
59
|
opts.on('--params FILE', 'Stack Parameter from yaml/json file') {|v| args.params.merge!(load_file(v)) }
|
52
60
|
opts.on('--help', 'Show this help') {|_| puts opts; exit!;}
|
53
61
|
opts.on('--version', 'Show version') {|_| puts `gem list autostacker24`; exit!;}
|
@@ -75,10 +83,12 @@ case args.command
|
|
75
83
|
when /create|update|create_or_update/
|
76
84
|
check_template(args)
|
77
85
|
check_stack(args)
|
78
|
-
Stacker.create_or_update_stack(args.stack, args.template, args.params, args.parent)
|
86
|
+
Stacker.create_or_update_stack(args.stack, args.template, args.params, args.parent, args.role_arn)
|
87
|
+
when /list/
|
88
|
+
Stacker.list_stacks()
|
79
89
|
when /delete/
|
80
90
|
check_stack(args)
|
81
|
-
Stacker.delete_stack(args.stack)
|
91
|
+
Stacker.delete_stack(args.stack, args.role_arn)
|
82
92
|
when /process/
|
83
93
|
check_template(args)
|
84
94
|
puts Stacker.template_body(args.template)
|
@@ -36,26 +36,27 @@ module Stacker
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
def create_or_update_stack(stack_name, template, parameters, parent_stack_name = nil, tags = nil, timeout_in_minutes = DEFAULT_TIMEOUT)
|
39
|
+
def create_or_update_stack(stack_name, template, parameters, parent_stack_name = nil, role_arn = nil, tags = nil, timeout_in_minutes = DEFAULT_TIMEOUT)
|
40
40
|
if find_stack(stack_name).nil?
|
41
|
-
create_stack(stack_name, template, parameters, parent_stack_name, tags, timeout_in_minutes)
|
41
|
+
create_stack(stack_name, template, parameters, parent_stack_name, role_arn, tags, timeout_in_minutes)
|
42
42
|
else
|
43
|
-
update_stack(stack_name, template, parameters, parent_stack_name, tags, timeout_in_minutes)
|
43
|
+
update_stack(stack_name, template, parameters, parent_stack_name, role_arn, tags, timeout_in_minutes)
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
def create_stack(stack_name, template, parameters, parent_stack_name = nil, tags = nil, timeout_in_minutes = DEFAULT_TIMEOUT)
|
47
|
+
def create_stack(stack_name, template, parameters, parent_stack_name = nil, role_arn = nil, tags = nil, timeout_in_minutes = DEFAULT_TIMEOUT)
|
48
48
|
merge_and_validate(template, parameters, parent_stack_name)
|
49
49
|
cloud_formation.create_stack(stack_name: stack_name,
|
50
50
|
template_body: template_body(template),
|
51
51
|
on_failure: 'DELETE',
|
52
52
|
parameters: transform_input(parameters),
|
53
53
|
capabilities: ['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM'],
|
54
|
+
role_arn: role_arn,
|
54
55
|
tags: tags)
|
55
56
|
wait_for_stack(stack_name, :create, Set.new, timeout_in_minutes)
|
56
57
|
end
|
57
58
|
|
58
|
-
def update_stack(stack_name, template, parameters, parent_stack_name = nil, tags = nil, timeout_in_minutes = DEFAULT_TIMEOUT)
|
59
|
+
def update_stack(stack_name, template, parameters, parent_stack_name = nil, role_arn = nil, tags = nil, timeout_in_minutes = DEFAULT_TIMEOUT)
|
59
60
|
seen_events = get_stack_events(stack_name).map {|e| e[:event_id]}
|
60
61
|
begin
|
61
62
|
merge_and_validate(template, parameters, parent_stack_name)
|
@@ -63,6 +64,7 @@ module Stacker
|
|
63
64
|
template_body: template_body(template),
|
64
65
|
parameters: transform_input(parameters),
|
65
66
|
capabilities: ['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM'],
|
67
|
+
role_arn: role_arn,
|
66
68
|
tags: tags)
|
67
69
|
rescue Aws::CloudFormation::Errors::ValidationError => error
|
68
70
|
raise error unless error.message =~ /No updates are to be performed/i # may be flaky, do more research in API
|
@@ -73,6 +75,22 @@ module Stacker
|
|
73
75
|
end
|
74
76
|
end
|
75
77
|
|
78
|
+
def list_stacks()
|
79
|
+
next_token = nil
|
80
|
+
loop do
|
81
|
+
res = cloud_formation.list_stacks(next_token: next_token)
|
82
|
+
res.stack_summaries.each { |summary| print_stack_summary(summary) }
|
83
|
+
|
84
|
+
next_token = res.next_token
|
85
|
+
break if next_token.nil?
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def print_stack_summary(summary)
|
90
|
+
change_date = summary.last_updated_time ? summary.last_updated_time : summary.creation_time
|
91
|
+
puts "#{summary.stack_name}\t#{summary.stack_status}\t#{change_date}" unless summary.stack_status == 'DELETE_COMPLETE'
|
92
|
+
end
|
93
|
+
|
76
94
|
# if stack_name is given assign read the output parameters and copy them to the given template parameters
|
77
95
|
# if a aparameter is already defined, it will not be overwritten
|
78
96
|
# finally, if mandatory parameters are missing, an error will be raised
|
@@ -95,9 +113,9 @@ module Stacker
|
|
95
113
|
cloud_formation.validate_template(template_body: template_body(template))
|
96
114
|
end
|
97
115
|
|
98
|
-
def delete_stack(stack_name, timeout_in_minutes = 60)
|
116
|
+
def delete_stack(stack_name, role_arn = nil, timeout_in_minutes = 60)
|
99
117
|
seen_events = get_stack_events(stack_name).map {|e| e[:event_id]}
|
100
|
-
cloud_formation.delete_stack(stack_name: stack_name)
|
118
|
+
cloud_formation.delete_stack(stack_name: stack_name, role_arn: role_arn)
|
101
119
|
wait_for_stack(stack_name, :delete, seen_events, timeout_in_minutes)
|
102
120
|
end
|
103
121
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: autostacker24
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Johannes Mueller
|
@@ -9,92 +9,92 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-
|
12
|
+
date: 2017-10-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name: aws-sdk
|
15
|
+
name: aws-sdk
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
18
|
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: '
|
20
|
+
version: '3'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: '
|
27
|
+
version: '3'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: json
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
32
|
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: '2
|
34
|
+
version: '2'
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
39
|
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version: '2
|
41
|
+
version: '2'
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: json_pure
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
46
|
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version: '2
|
48
|
+
version: '2'
|
49
49
|
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
53
|
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version: '2
|
55
|
+
version: '2'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: rubocop
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
60
|
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: '0
|
62
|
+
version: '0'
|
63
63
|
type: :development
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: '0
|
69
|
+
version: '0'
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: rake
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
74
|
- - "~>"
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version: '
|
76
|
+
version: '12'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
81
|
- - "~>"
|
82
82
|
- !ruby/object:Gem::Version
|
83
|
-
version: '
|
83
|
+
version: '12'
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
85
|
name: rspec
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
87
87
|
requirements:
|
88
88
|
- - "~>"
|
89
89
|
- !ruby/object:Gem::Version
|
90
|
-
version: '3
|
90
|
+
version: '3'
|
91
91
|
type: :development
|
92
92
|
prerelease: false
|
93
93
|
version_requirements: !ruby/object:Gem::Requirement
|
94
94
|
requirements:
|
95
95
|
- - "~>"
|
96
96
|
- !ruby/object:Gem::Version
|
97
|
-
version: '3
|
97
|
+
version: '3'
|
98
98
|
description: AutoStacker24 is a small ruby gem for managing AWS CloudFormation stacks.
|
99
99
|
It is a thin wrapper around the AWS Ruby SDK. It lets you write simple and convenient
|
100
100
|
automation scripts, especially if you have lots of parameters or dependencies between
|