cheftacular 2.10.2 → 2.11.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/lib/cheftacular/README.md +119 -77
- data/lib/cheftacular/actions/check.rb +58 -24
- data/lib/cheftacular/actions/deploy.rb +5 -3
- data/lib/cheftacular/auditor.rb +4 -3
- data/lib/cheftacular/cheftacular.rb +1 -0
- data/lib/cheftacular/cloud_provider.rb +17 -12
- data/lib/cheftacular/file_system.rb +20 -0
- data/lib/cheftacular/getter.rb +1 -1
- data/lib/cheftacular/helper.rb +41 -28
- data/lib/cheftacular/initializer.rb +5 -3
- data/lib/cheftacular/parser.rb +10 -6
- data/lib/cheftacular/queue_master.rb +24 -0
- data/lib/cheftacular/stateless_actions/backups.rb +2 -2
- data/lib/cheftacular/stateless_actions/bootstrappers/{centos_bootstrap.rb → centos_bootstrap_from_queue.rb} +1 -1
- data/lib/cheftacular/stateless_actions/bootstrappers/{coreos_bootstrap.rb → coreos_bootstrap_from_queue.rb} +1 -1
- data/lib/cheftacular/stateless_actions/bootstrappers/{fedora_bootstrap.rb → fedora_bootstrap_from_queue.rb} +1 -1
- data/lib/cheftacular/stateless_actions/bootstrappers/{redhat_bootstrap.rb → redhat_bootstrap_from_queue.rb} +1 -1
- data/lib/cheftacular/stateless_actions/bootstrappers/ubuntu_bootstrap_from_queue.rb +203 -0
- data/lib/cheftacular/stateless_actions/bootstrappers/vyatta_bootstrap_from_queue.rb +7 -0
- data/lib/cheftacular/stateless_actions/check_cheftacular_yml_keys.rb +30 -0
- data/lib/cheftacular/stateless_actions/chef_bootstrap_from_queue.rb +89 -0
- data/lib/cheftacular/stateless_actions/cheftacular_yml_help.rb +55 -6
- data/lib/cheftacular/stateless_actions/client_list.rb +1 -3
- data/lib/cheftacular/stateless_actions/cloud_bootstrap.rb +24 -15
- data/lib/cheftacular/stateless_actions/cloud_bootstrap_from_queue.rb +37 -0
- data/lib/cheftacular/stateless_actions/environment.rb +80 -31
- data/lib/cheftacular/stateless_actions/fix_known_hosts.rb +1 -22
- data/lib/cheftacular/stateless_actions/{full_bootstrap.rb → full_bootstrap_from_queue.rb} +8 -15
- data/lib/cheftacular/stateless_actions/knife_upload.rb +14 -3
- data/lib/cheftacular/stateless_actions/reinitialize.rb +1 -1
- data/lib/cheftacular/stateless_actions/remove_client.rb +3 -3
- data/lib/cheftacular/stateless_actions/restart_swap.rb +0 -1
- data/lib/cheftacular/stateless_actions/test_env.rb +24 -18
- data/lib/cheftacular/stateless_actions/update_thecheftacularcookbook.rb +1 -1
- data/lib/cheftacular/stateless_actions/upload_nodes.rb +2 -2
- data/lib/cheftacular/version.rb +1 -1
- data/lib/cloud_interactor/domain/create.rb +2 -2
- data/lib/cloud_interactor/domain/create_record.rb +1 -1
- data/lib/cloud_interactor/domain/destroy.rb +2 -2
- data/lib/cloud_interactor/domain/destroy_record.rb +1 -1
- data/lib/cloud_interactor/domain/list_records.rb +1 -1
- data/lib/cloud_interactor/domain/read.rb +1 -1
- data/lib/cloud_interactor/domain/read_record.rb +1 -1
- data/lib/cloud_interactor/domain/update.rb +2 -2
- data/lib/cloud_interactor/domain/update_record.rb +2 -2
- data/lib/cloud_interactor/helpers.rb +11 -6
- data/lib/cloud_interactor/server/attach_volume.rb +1 -1
- data/lib/cloud_interactor/server/create.rb +4 -4
- data/lib/cloud_interactor/server/detach_volume.rb +2 -2
- data/lib/cloud_interactor/server/list_volumes.rb +1 -1
- data/lib/cloud_interactor/server/poll.rb +2 -2
- data/lib/cloud_interactor/server/read_volume.rb +1 -1
- data/lib/cloud_interactor/version.rb +1 -1
- data/lib/cloud_interactor/volume/create.rb +1 -1
- data/lib/sshkit/getters.rb +9 -1
- metadata +25 -10
- data/lib/cheftacular/stateless_actions/bootstrappers/ubuntu_bootstrap.rb +0 -116
- data/lib/cheftacular/stateless_actions/bootstrappers/vyatta_bootstrap.rb +0 -7
- data/lib/cheftacular/stateless_actions/chef_bootstrap.rb +0 -63
@@ -12,9 +12,7 @@ class Cheftacular
|
|
12
12
|
"whether its password is stored on the chef server and what that password is.",
|
13
13
|
|
14
14
|
" 2. `-W|--with-priv` option will make this command display the server's local (private) ip address. " +
|
15
|
-
"This address is also the server's `local.<SERVER_DNS_NAME>`."
|
16
|
-
|
17
|
-
" 3. This command is aliased to `client-list` with no arguments or cft prefix."
|
15
|
+
"This address is also the server's `local.<SERVER_DNS_NAME>`."
|
18
16
|
]
|
19
17
|
]
|
20
18
|
|
@@ -28,13 +28,22 @@ class Cheftacular
|
|
28
28
|
end
|
29
29
|
|
30
30
|
class StatelessAction
|
31
|
-
def cloud_bootstrap
|
31
|
+
def cloud_bootstrap server_hash={}, options_to_sync=['node_name', 'flavor_name', 'descriptor', 'dns_config', 'address', 'private_address', 'client_pass']
|
32
32
|
raise "This action can only be performed if the mode is set to devops" if !@config['helper'].running_in_mode?('devops') && !@options['in_scaling']
|
33
33
|
|
34
|
+
@options['node_name'] = server_hash['node_name'] if server_hash.has_key?('node_name')
|
35
|
+
@options['flavor_name'] = server_hash['flavor_name'] if server_hash.has_key?('flavor_name')
|
36
|
+
@options['descriptor'] = server_hash['descriptor'] if server_hash.has_key?('descriptor')
|
37
|
+
@options['with_dn'] = server_hash['dns_config'] if server_hash.has_key?('dns_config')
|
38
|
+
|
34
39
|
@options['node_name'] = ARGV[1] unless @options['node_name']
|
35
40
|
@options['flavor_name'] = ARGV[2] unless @options['flavor_name']
|
36
41
|
@options['descriptor'] = ARGV[3] if ARGV[3] && !@options['descriptor']
|
37
42
|
|
43
|
+
@options['in_single_server_creation'] = true
|
44
|
+
|
45
|
+
puts "Preparing to boot #{ @options['node_name'] }(#{ @options['flavor_name'] })..."
|
46
|
+
|
38
47
|
if `which sshpass`.empty?
|
39
48
|
raise "sshpass not installed! Please run brew install https://raw.github.com/eugeneoden/homebrew/eca9de1/Library/Formula/sshpass.rb (or get it from your repo for linux)"
|
40
49
|
end
|
@@ -46,23 +55,18 @@ class Cheftacular
|
|
46
55
|
|
47
56
|
status_hash = @config['stateless_action'].cloud "server", "poll:#{ real_node_name }"
|
48
57
|
|
49
|
-
status_hash['created_servers'].each do |
|
50
|
-
next unless
|
58
|
+
status_hash['created_servers'].each do |cloud_server_hash|
|
59
|
+
next unless cloud_server_hash['name'] == "#{ real_node_name }"
|
51
60
|
|
52
|
-
@options['address'], @options['private_address'] = @config['cloud_provider'].parse_addresses_from_server_create_hash
|
61
|
+
@options['address'], @options['private_address'] = @config['cloud_provider'].parse_addresses_from_server_create_hash cloud_server_hash
|
53
62
|
end
|
54
63
|
|
55
64
|
@options['client_pass'] = @config['cloud_provider'].parse_server_root_password_from_server_create_hash status_hash, real_node_name
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
compile_args = ['set_all_attributes']
|
62
|
-
|
63
|
-
compile_args << "set_specific_domain:#{ @options['with_dn'] }" if @options['with_dn']
|
64
|
-
|
65
|
-
address_hash = @config['DNS'].compile_address_hash_for_server_from_options(*compile_args)
|
65
|
+
tld = @config[@options['env']]['config_bag_hash'][@options['sub_env']]['tld']
|
66
|
+
target_serv_index = @config[@options['env']]['addresses_bag_hash']['addresses'].count
|
67
|
+
compile_args = ['set_all_attributes']
|
68
|
+
compile_args << "set_specific_domain:#{ @options['with_dn'] }" if @options['with_dn']
|
69
|
+
address_hash = @config['DNS'].compile_address_hash_for_server_from_options(*compile_args)
|
66
70
|
|
67
71
|
@config['DNS'].create_dns_record_for_domain_from_address_hash(@options['with_dn'], address_hash, "specific_domain_mode") if @options['with_dn']
|
68
72
|
|
@@ -72,7 +76,12 @@ class Cheftacular
|
|
72
76
|
|
73
77
|
@options['dont_remove_address_or_server'] = true #flag to make sure our entry isnt removed in addresses bag
|
74
78
|
|
75
|
-
@config['
|
79
|
+
server_hash = @config['queue_master'].sync_server_hash_into_queue(server_hash.merge(@config['helper'].return_options_as_hash(options_to_sync)))
|
80
|
+
|
81
|
+
puts("Created server #{ server_hash['node_name'] } and attached additional flags:") unless @options['quiet']
|
82
|
+
ap(@config['queue_master'].return_hash_from_queue('server_creation_queue', server_hash, 'node_name').except(*options_to_sync[0..3])) unless @options['quiet']
|
83
|
+
|
84
|
+
@config['stateless_action'].full_bootstrap_from_queue unless @config['in_server_creation_queue'] #bootstrap server with ruby and attach it to the chef server
|
76
85
|
end
|
77
86
|
end
|
78
87
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
|
2
|
+
class Cheftacular
|
3
|
+
class StatelessActionDocumentation
|
4
|
+
def cloud_bootstrap_from_queue
|
5
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
6
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
7
|
+
"`cft cloud_bootstrap_from_queue` uses a cloud api to " +
|
8
|
+
"create several servers. It is a wrapper around the cloud_bootstrap command that tries to queue server creation.",
|
9
|
+
|
10
|
+
[
|
11
|
+
" 1. This command cannot be called directly and can only be utilized from `cft environment boot`",
|
12
|
+
]
|
13
|
+
]
|
14
|
+
|
15
|
+
@config['documentation']['stateless_action'][__method__]['short_description'] = '[Not Directly Callable]'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class StatelessAction
|
20
|
+
def cloud_bootstrap_from_queue
|
21
|
+
raise "This action is not meant to be called directly!" unless @options['in_scaling']
|
22
|
+
|
23
|
+
puts("Preparing to boot server #{ @options['node_name'] } for #{ @options['env'] }!") unless @options['quiet']
|
24
|
+
|
25
|
+
@config['in_server_creation_queue'] = true
|
26
|
+
|
27
|
+
@config['server_creation_queue'].each do |server_hash|
|
28
|
+
puts("Creating server #{ server_hash['node_name'] } with arguments:") unless @options['quiet']
|
29
|
+
ap(server_hash.except('node_name')) unless @options['quiet']
|
30
|
+
|
31
|
+
@config['stateless_action'].cloud_bootstrap(server_hash)
|
32
|
+
end
|
33
|
+
|
34
|
+
@config['stateless_action'].full_bootstrap_from_queue
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -4,7 +4,7 @@ class Cheftacular
|
|
4
4
|
def environment
|
5
5
|
@config['documentation']['stateless_action'][__method__] ||= {}
|
6
6
|
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
7
|
-
"`cft environment boot|destroy` will boot / destroy the current environment",
|
7
|
+
"`cft environment boot|boot_without_deploy|destroy|destroy_raw_servers [SERVER_NAMES]` will boot / destroy the current environment",
|
8
8
|
|
9
9
|
[
|
10
10
|
" 1. `boot` will spin up servers and bring them to a stable state. " +
|
@@ -12,7 +12,14 @@ class Cheftacular
|
|
12
12
|
|
13
13
|
" 2. `destroy` will destroy all servers needed for the target environment",
|
14
14
|
|
15
|
-
" 3.
|
15
|
+
" 3. `destroy_raw_servers` will destroy the servers without destroying the node data.",
|
16
|
+
|
17
|
+
" 4. `boot_without_deploy` will spin up servers and bring them to a state where they are ready to be deployed",
|
18
|
+
|
19
|
+
" 5. This command will prompt when attempting to destroy servers in staging or production. " +
|
20
|
+
"Additionally, only devops clients will be able to destroy servers in those environments.",
|
21
|
+
|
22
|
+
" 6. This command also accepts a *comma delimited list* of server names to boot / destroy instead of all the stored ones for an environment."
|
16
23
|
]
|
17
24
|
]
|
18
25
|
|
@@ -23,7 +30,7 @@ class Cheftacular
|
|
23
30
|
end
|
24
31
|
|
25
32
|
class StatelessAction
|
26
|
-
def environment type="boot", ask_on_destroy=false, remove=true
|
33
|
+
def environment type="boot", ask_on_destroy=false, remove=true, servers_to_interact_with=[], threads=[]
|
27
34
|
ask_on_destroy = case @options['env']
|
28
35
|
when 'staging' then true
|
29
36
|
when 'production' then true
|
@@ -32,7 +39,11 @@ class Cheftacular
|
|
32
39
|
|
33
40
|
type = ARGV[1] if ARGV[1]
|
34
41
|
|
35
|
-
|
42
|
+
servers_to_interact_with = ARGV[2].split(',') if ARGV[2]
|
43
|
+
|
44
|
+
unless (type =~ /boot|destroy|destroy_raw_servers|boot_without_deploy/) == 0
|
45
|
+
raise "Unknown type: #{ type }, can only be 'boot'/'boot_without_deploy'/'destroy'/'destroy_raw_servers'"
|
46
|
+
end
|
36
47
|
|
37
48
|
nodes = @config['getter'].get_true_node_objects(true)
|
38
49
|
|
@@ -43,6 +54,10 @@ class Cheftacular
|
|
43
54
|
|
44
55
|
initial_servers = @config['cheftacular']['env_boot_nodes']["#{ @options['env'] }_nodes"]
|
45
56
|
|
57
|
+
unless servers_to_interact_with.empty?
|
58
|
+
initial_servers = initial_servers.delete_if {|name, config_hash| !servers_to_interact_with.include?(name)}
|
59
|
+
end
|
60
|
+
|
46
61
|
if initial_servers.empty?
|
47
62
|
puts "There are no servers defined for #{ @options['env'] } in the env_boot_nodes hash in your cheftacular.yml... Exiting"
|
48
63
|
|
@@ -50,44 +65,51 @@ class Cheftacular
|
|
50
65
|
end
|
51
66
|
|
52
67
|
case type
|
53
|
-
when
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
68
|
+
when /boot|boot_without_deploy/
|
69
|
+
begin
|
70
|
+
initial_servers.each_pair do |name, config_hash|
|
71
|
+
next if nodes.map { |n| n.name }.include?(name)
|
72
|
+
config_hash ||= {}
|
73
|
+
node_hash = {}
|
74
|
+
|
75
|
+
node_hash['node_name'] = name
|
76
|
+
node_hash['flavor_name'] = config_hash.has_key?('flavor') ? config_hash['flavor'] : @config['cheftacular']['default_flavor_name']
|
77
|
+
node_hash['descriptor'] = config_hash.has_key?('descriptor') ? config_hash['descriptor'] : name
|
78
|
+
node_hash['dns_config'] = if config_hash.has_key?('dns_config')
|
79
|
+
@config['parser'].parse_to_dns(config_hash['dns_config'], node_hash['node_name'])
|
80
|
+
else
|
81
|
+
@config['parser'].parse_to_dns('NODE_NAME.ENV_TLD', node_hash['node_name'])
|
82
|
+
end
|
83
|
+
|
84
|
+
@config['server_creation_queue'] << node_hash
|
85
|
+
end
|
86
|
+
|
87
|
+
@config['stateless_action'].cloud_bootstrap_from_queue
|
88
|
+
end
|
62
89
|
|
63
|
-
|
90
|
+
@config['ChefDataBag'].save_server_passwords_bag
|
64
91
|
|
65
|
-
|
92
|
+
if type == 'boot'
|
93
|
+
@options = @options.delete_if { |k,v| ['node_name','address', 'descriptor', 'with_dn', 'private_address', 'client_pass'].include?(k) }
|
66
94
|
|
67
|
-
|
68
|
-
end
|
95
|
+
@options['role'] = @config['cheftacular']['backup_config']['db_primary_role']
|
69
96
|
|
70
|
-
|
97
|
+
@options['unset_address_and_node_name'] = true
|
71
98
|
|
72
|
-
|
99
|
+
@config['action'].deploy
|
73
100
|
|
74
|
-
|
101
|
+
backup_pid = Process.spawn("cft backups load --env=#{ @options['env'] }")
|
75
102
|
|
76
|
-
|
103
|
+
@options['role'] = 'all'
|
77
104
|
|
78
|
-
|
79
|
-
when 'destroy'
|
80
|
-
raise "This action can only be performed if the mode is set to devops" if !@config['helper'].running_in_mode?('devops')
|
81
|
-
|
82
|
-
if ask_on_destroy
|
83
|
-
puts "Preparing to delete nodes in #{ @options['env'] }.\nEnter Y/y to confirm."
|
105
|
+
@config['action'].deploy
|
84
106
|
|
85
|
-
|
107
|
+
Process.wait backup_pid
|
86
108
|
|
87
|
-
|
109
|
+
puts "Done loading data and setting up #{ @options['env'] }!"
|
88
110
|
end
|
89
|
-
|
90
|
-
return false
|
111
|
+
when 'destroy'
|
112
|
+
return false if ask_on_destroy && !environment_is_destroyable?
|
91
113
|
|
92
114
|
@options['delete_server_on_remove'] = true
|
93
115
|
|
@@ -98,9 +120,36 @@ class Cheftacular
|
|
98
120
|
|
99
121
|
@config['stateless_action'].remove_client
|
100
122
|
|
123
|
+
sleep 15
|
124
|
+
end
|
125
|
+
when 'destroy_raw_servers'
|
126
|
+
return false if ask_on_destroy && !environment_is_destroyable?
|
127
|
+
|
128
|
+
@options['delete_server_on_remove'] = true
|
129
|
+
|
130
|
+
initial_servers.each_pair do |name, config_hash|
|
131
|
+
next if nodes.map { |n| n.name }.include?(name)
|
132
|
+
@options['node_name'] = name
|
133
|
+
|
134
|
+
real_node_name = @config['getter'].get_current_real_node_name
|
135
|
+
|
136
|
+
@config['stateless_action'].cloud('servers', "destroy:#{ real_node_name }")
|
137
|
+
|
101
138
|
sleep 15
|
102
139
|
end
|
103
140
|
end
|
104
141
|
end
|
142
|
+
|
143
|
+
private
|
144
|
+
|
145
|
+
def environment_is_destroyable?
|
146
|
+
raise "This action can only be performed if the mode is set to devops" unless @config['helper'].running_in_mode?('devops')
|
147
|
+
|
148
|
+
puts "Preparing to delete nodes in #{ @options['env'] }.\nEnter Y/y to confirm."
|
149
|
+
|
150
|
+
input = STDIN.gets.chomp
|
151
|
+
|
152
|
+
( input =~ /y|Y|yes|Yes/ ) == 0
|
153
|
+
end
|
105
154
|
end
|
106
155
|
end
|
@@ -45,29 +45,8 @@ class Cheftacular
|
|
45
45
|
end
|
46
46
|
|
47
47
|
targets.each do |target|
|
48
|
-
|
49
|
-
case CONFIG['host_os']
|
50
|
-
when /mswin|windows/i
|
51
|
-
raise "#{ __method__ } does not support this operating system at this time"
|
52
|
-
when /linux|arch/i
|
53
|
-
puts "#{ __method__ } does not support this operating system at this time"
|
54
|
-
when /sunos|solaris/i
|
55
|
-
raise "#{ __method__ } does not support this operating system at this time"
|
56
|
-
when /darwin/i
|
57
|
-
cleanup_known_hosts_for_BSD_linux_architecture target
|
58
|
-
else
|
59
|
-
raise "#{ __method__ } does not support this operating system at this time"
|
60
|
-
end
|
48
|
+
@config['filesystem'].scrub_from_known_hosts target
|
61
49
|
end
|
62
50
|
end
|
63
|
-
private
|
64
|
-
|
65
|
-
def cleanup_known_hosts_for_BSD_linux_architecture target
|
66
|
-
#Removes the entire line containing the string
|
67
|
-
`sed -i '' "s/#{ target }.*//g" ~/.ssh/known_hosts`
|
68
|
-
|
69
|
-
#remove empty lines
|
70
|
-
`sed -i '' "/^$/d" ~/.ssh/known_hosts`
|
71
|
-
end
|
72
51
|
end
|
73
52
|
end
|
@@ -1,40 +1,33 @@
|
|
1
1
|
|
2
2
|
class Cheftacular
|
3
3
|
class StatelessActionDocumentation
|
4
|
-
def
|
4
|
+
def full_bootstrap_from_queue
|
5
5
|
@config['documentation']['stateless_action'][__method__] ||= {}
|
6
6
|
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
7
|
-
"`cft
|
7
|
+
"`cft full_bootstrap_from_queue` This command performs both " +
|
8
8
|
"#{ @config['cheftacular']['preferred_cloud_os'] }_bootstrap and chef_bootstrap.",
|
9
9
|
|
10
10
|
[
|
11
|
-
" 1. This command is run by `cft cloud_bootstrap` and should not be run on its own
|
12
|
-
"target server is already created and not initialized."
|
11
|
+
" 1. This command is run by `cft cloud_bootstrap` and should not be run on its own."
|
13
12
|
]
|
14
13
|
]
|
15
14
|
|
16
|
-
@config['documentation']['stateless_action'][__method__]['short_description'] = '
|
15
|
+
@config['documentation']['stateless_action'][__method__]['short_description'] = '[Not Directly Callable]'
|
17
16
|
end
|
18
17
|
end
|
19
18
|
|
20
19
|
class StatelessAction
|
21
|
-
def
|
20
|
+
def full_bootstrap_from_queue options_to_sync=['node_name', 'address', 'client_pass']
|
22
21
|
raise "This action can only be performed if the mode is set to devops" if !@config['helper'].running_in_mode?('devops') && !@options['in_scaling']
|
23
22
|
|
24
|
-
@options['address'] = ARGV[1] unless @options['address']
|
25
|
-
@options['client_pass'] = ARGV[2] unless @options['client_pass']
|
26
|
-
@options['node_name'] = ARGV[3] unless @options['node_name']
|
27
|
-
|
28
23
|
case @config['cheftacular']['preferred_cloud_os']
|
29
|
-
when 'ubuntu' || 'debian' then @config['stateless_action'].
|
30
|
-
else @config['stateless_action'].instance_eval("#{ @config['cheftacular']['preferred_cloud_os'] }
|
24
|
+
when 'ubuntu' || 'debian' then @config['stateless_action'].ubuntu_bootstrap_from_queue
|
25
|
+
else @config['stateless_action'].instance_eval("#{ @config['cheftacular']['preferred_cloud_os'] }_bootstrap_from_queue")
|
31
26
|
end
|
32
27
|
|
33
28
|
@config['initializer'].initialize_passwords @options['env'] #reset the passwords var to contain the new deploy pass set in ubuntu_bootstrap
|
34
29
|
|
35
|
-
@config['
|
36
|
-
|
37
|
-
@config['stateless_action'].chef_bootstrap
|
30
|
+
@config['stateless_action'].chef_bootstrap_from_queue
|
38
31
|
end
|
39
32
|
end
|
40
33
|
end
|
@@ -4,8 +4,12 @@ class Cheftacular
|
|
4
4
|
def knife_upload
|
5
5
|
@config['documentation']['stateless_action'][__method__] ||= {}
|
6
6
|
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
7
|
-
"`cft knife_upload` will resync the chef-server with the local chef-repo code. " +
|
8
|
-
"This command is analog for `knife upload /`"
|
7
|
+
"`cft knife_upload [force]` will resync the chef-server with the local chef-repo code. " +
|
8
|
+
"This command is analog for `knife upload /`",
|
9
|
+
|
10
|
+
[
|
11
|
+
" 1. The force option will add the force option to knife upload."
|
12
|
+
]
|
9
13
|
]
|
10
14
|
|
11
15
|
@config['documentation']['stateless_action'][__method__]['short_description'] = 'Uploads your current cookbooks to the chef server'
|
@@ -16,9 +20,16 @@ class Cheftacular
|
|
16
20
|
def knife_upload
|
17
21
|
raise "This action can only be performed if the mode is set to devops" unless @config['helper'].running_in_mode?('devops')
|
18
22
|
|
23
|
+
arg = ARGV[1]
|
24
|
+
|
25
|
+
option = case arg
|
26
|
+
when 'force' then ' --force'
|
27
|
+
else ''
|
28
|
+
end
|
29
|
+
|
19
30
|
puts("Starting upload...") unless @options['quiet']
|
20
31
|
|
21
|
-
out = `knife upload / --chef-repo-path #{ @config['locs']['chef-repo'] }`
|
32
|
+
out = `knife upload / --chef-repo-path #{ @config['locs']['chef-repo'] }#{ option }`
|
22
33
|
|
23
34
|
puts out
|
24
35
|
end
|
@@ -32,7 +32,7 @@ class Cheftacular
|
|
32
32
|
|
33
33
|
raise "Invalid arguments! Node name is blank. Please call this script as cft remove_client <node_name>" unless @options['node_name']
|
34
34
|
|
35
|
-
nodes = @config['getter'].get_true_node_objects
|
35
|
+
nodes = @config['getter'].get_true_node_objects
|
36
36
|
|
37
37
|
nodes.each do |n|
|
38
38
|
begin
|
@@ -68,9 +68,9 @@ class Cheftacular
|
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
|
-
puts("Done. Please verify that the output of the next line(s) match your expectations (running
|
71
|
+
puts("Done. Please verify that the output of the next line(s) match your expectations (running cft client_list)") if @options['verbose']
|
72
72
|
|
73
|
-
|
73
|
+
@config['stateless_actions'].client_list if @options['verbose']
|
74
74
|
end
|
75
75
|
|
76
76
|
alias_method :remove_node, :remove_client
|
@@ -48,25 +48,31 @@ class Cheftacular
|
|
48
48
|
|
49
49
|
case type
|
50
50
|
when 'boot'
|
51
|
-
|
52
|
-
config_hash
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
51
|
+
begin
|
52
|
+
@config['cheftacular']['split_env_nodes'].each_pair do |name, config_hash|
|
53
|
+
next if nodes.map { |n| n.name }.include?(@options['node_name'])
|
54
|
+
config_hash ||= {}
|
55
|
+
node_hash = {}
|
56
|
+
true_name = name.gsub('SPLITENV', split_env)
|
57
|
+
@options['sub_env'] = split_env
|
58
|
+
node_hash['node_name'] = name
|
59
|
+
node_hash['flavor_name'] = config_hash.has_key?('flavor') ? config_hash['flavor'] : @config['cheftacular']['default_flavor_name']
|
60
|
+
node_hash['descriptor'] = config_hash.has_key?('descriptor') ? "#{ config_hash['descriptor'] }-#{ split_env }" : name
|
61
|
+
node_hash['dns_config'] = if config_hash.has_key?('dns_config')
|
62
|
+
@config['parser'].parse_to_dns(config_hash['dns_config'], node_hash['node_name'])
|
63
|
+
else
|
64
|
+
@config['parser'].parse_to_dns('NODE_NAME.ENV_TLD', node_hash['node_name'])
|
65
|
+
end
|
66
|
+
|
67
|
+
puts("Preparing to boot server #{ @options['node_name'] } for #{ @options['env'] }'s #{ split_env } environment!") unless @options['quiet']
|
68
|
+
|
69
|
+
@config['stateless_action'].cloud_bootstrap_from_queue
|
70
|
+
|
71
|
+
sleep 15
|
72
|
+
end
|
73
|
+
ensure
|
74
|
+
@config['ChefDataBag'].save_server_passwords_bag
|
67
75
|
end
|
68
|
-
|
69
|
-
@config['ChefDataBag'].save_server_passwords_bag
|
70
76
|
when 'destroy'
|
71
77
|
@options['delete_server_on_remove'] = true
|
72
78
|
|