appforce-spawn 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.appforce.example +4 -0
- data/.gitignore +8 -0
- data/Gemfile +17 -0
- data/History +85 -0
- data/README.md +144 -0
- data/ansible/README.md +31 -0
- data/ansible/common.yml +6 -0
- data/ansible/roles/common/tasks/.keep +0 -0
- data/ansible/roles/common/tasks/active_users.yml +23 -0
- data/ansible/roles/common/tasks/groups.yml +28 -0
- data/ansible/roles/common/tasks/inactive_users.yml +26 -0
- data/ansible/roles/common/tasks/main.yml +5 -0
- data/ansible/roles/common/tasks/setup.yml +6 -0
- data/ansible/roles/scout/tasks/.keep +0 -0
- data/ansible/roles/scout/tasks/install.yml +28 -0
- data/ansible/roles/scout/tasks/main.yml +2 -0
- data/ansible/roles/scout/vars/.keep +0 -0
- data/ansible/rvm.yml +13 -0
- data/ansible/scout.yml +6 -0
- data/ansible/site.yml +4 -0
- data/appforce-spawn.gemspec +24 -0
- data/bin/appforce-spawn +161 -0
- data/lib/appforce-spawn.rb +1 -0
- data/lib/appforce/config.rb +50 -0
- data/lib/appforce/logger.rb +25 -0
- data/lib/appforce/spawn.rb +312 -0
- data/lib/appforce/spawn/api.rb +4 -0
- data/lib/appforce/spawn/api/call.rb +217 -0
- data/lib/appforce/spawn/exceptions.rb +30 -0
- data/lib/appforce/spawn/runner.rb +143 -0
- data/lib/appforce/spawn/template.rb +102 -0
- data/lib/appforce/spawn/version.rb +10 -0
- data/spec/api_call_spec.rb +380 -0
- data/spec/config_spec.rb +51 -0
- data/spec/fixtures/all_host_data.json +12 -0
- data/spec/fixtures/appforce_config.yml +4 -0
- data/spec/fixtures/fake_private_key.yml +2 -0
- data/spec/fixtures/host_scout_vars.yml +10 -0
- data/spec/fixtures/hosts +8 -0
- data/spec/fixtures/inactive_users.yml +3 -0
- data/spec/fixtures/malformed_appforce_config.yml +4 -0
- data/spec/fixtures/private_key_vars.yml +4 -0
- data/spec/fixtures/scout_main.yml +2 -0
- data/spec/fixtures/users.yml +6 -0
- data/spec/fixtures/vars.yml +4 -0
- data/spec/logger_spec.rb +85 -0
- data/spec/runner_spec.rb +308 -0
- data/spec/spec_helper.rb +53 -0
- data/spec/template_spec.rb +160 -0
- data/spec/version_spec.rb +9 -0
- data/tmp/.keep +0 -0
- metadata +151 -0
@@ -0,0 +1,217 @@
|
|
1
|
+
module Appforce
|
2
|
+
module Spawn
|
3
|
+
module Api
|
4
|
+
class Call
|
5
|
+
require 'highline/import'
|
6
|
+
|
7
|
+
def self.get_clients
|
8
|
+
url = "#{base_api_url}client/list?#{token_param}"
|
9
|
+
logger.debug "[#{self.name}##{__method__.to_s}] URL: #{url}"
|
10
|
+
make_api_call(url)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.get_hosts(*args)
|
14
|
+
opts = args[1]
|
15
|
+
unless opts[:client_api_name]
|
16
|
+
logger.error "[#{self.name}##{__method__.to_s}] Appforce::Spawn::MissingParameters -- Missing Client API Name"
|
17
|
+
raise Appforce::Spawn::MissingParameters, "Missing Client API Name"
|
18
|
+
end
|
19
|
+
|
20
|
+
url = "#{client_url(opts[:client_api_name])}/hosts?#{token_param}"
|
21
|
+
logger.debug "[#{self.name}##{__method__.to_s}] URL: #{url}"
|
22
|
+
make_api_call(url)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.get_active_users(*args)
|
26
|
+
opts = args[1]
|
27
|
+
unless opts[:client_api_name]
|
28
|
+
logger.error "[#{self.name}##{__method__.to_s}] Appforce::Spawn::MissingParameters -- Missing Client API Name"
|
29
|
+
raise Appforce::Spawn::MissingParameters, "Missing Client API Name"
|
30
|
+
end
|
31
|
+
|
32
|
+
url = "#{client_url(opts[:client_api_name])}/users/active.yml?#{token_param}"
|
33
|
+
logger.debug "[#{self.name}##{__method__.to_s}] URL: #{url}"
|
34
|
+
make_api_call(url)
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.get_inactive_users(*args)
|
38
|
+
opts = args[1]
|
39
|
+
unless opts[:client_api_name]
|
40
|
+
logger.error "[#{self.name}##{__method__.to_s}] Appforce::Spawn::MissingParameters -- Missing Client API Name"
|
41
|
+
raise Appforce::Spawn::MissingParameters, "Missing Client API Name"
|
42
|
+
end
|
43
|
+
|
44
|
+
url = "#{client_url(opts[:client_api_name])}/users/inactive.yml?#{token_param}"
|
45
|
+
logger.debug "[#{self.name}##{__method__.to_s}] URL: #{url}"
|
46
|
+
make_api_call(url)
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.get_vars(*args)
|
50
|
+
opts = args[1]
|
51
|
+
unless opts[:client_api_name]
|
52
|
+
logger.error "[#{self.name}##{__method__.to_s}] Appforce::Spawn::MissingParameters -- Missing Client API Name"
|
53
|
+
raise Appforce::Spawn::MissingParameters, "Missing Client API Name"
|
54
|
+
end
|
55
|
+
|
56
|
+
url = "#{client_url(opts[:client_api_name])}/vars.yml?#{token_param}"
|
57
|
+
logger.debug "[#{self.name}##{__method__.to_s}] URL: #{url}"
|
58
|
+
make_api_call(url)
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.get_main_scout(*args)
|
62
|
+
opts = args[1]
|
63
|
+
unless opts[:client_api_name]
|
64
|
+
logger.error "[#{self.name}##{__method__.to_s}] Appforce::Spawn::MissingParameters -- Missing Client API Name"
|
65
|
+
raise Appforce::Spawn::MissingParameters, "Missing Client API Name"
|
66
|
+
end
|
67
|
+
|
68
|
+
url = "#{client_url(opts[:client_api_name])}/scout.yml?#{token_param}"
|
69
|
+
logger.debug "[#{self.name}##{__method__.to_s}] URL: #{url}"
|
70
|
+
make_api_call(url)
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.get_private_key(*args)
|
74
|
+
opts = args[1]
|
75
|
+
unless opts[:client_api_name]
|
76
|
+
logger.error "[#{self.name}##{__method__.to_s}] Appforce::Spawn::MissingParameters -- Missing Client API Name"
|
77
|
+
raise Appforce::Spawn::MissingParameters, "Missing Client API Name"
|
78
|
+
end
|
79
|
+
|
80
|
+
url = "#{client_url(opts[:client_api_name])}/private_key.pem?#{token_param}"
|
81
|
+
logger.debug "[#{self.name}##{__method__.to_s}] URL: #{url}"
|
82
|
+
make_api_call(url)
|
83
|
+
end
|
84
|
+
|
85
|
+
def self.get_host_scout_vars(*args)
|
86
|
+
opts = args[1]
|
87
|
+
unless opts[:host_api_name]
|
88
|
+
logger.error "[#{self.name}##{__method__.to_s}] Appforce::Spawn::MissingParameters -- Missing Host API Name"
|
89
|
+
raise Appforce::Spawn::MissingParameters, "Missing Host API Name"
|
90
|
+
end
|
91
|
+
|
92
|
+
url = "#{host_url(opts[:host_api_name])}/scout.yml?#{token_param}"
|
93
|
+
logger.debug "[#{self.name}##{__method__.to_s}] URL: #{url}"
|
94
|
+
make_api_call(url)
|
95
|
+
end
|
96
|
+
|
97
|
+
def self.get_all_host_data(*args)
|
98
|
+
opts = args[1]
|
99
|
+
unless opts[:client_api_name]
|
100
|
+
logger.error "[#{self.name}##{__method__.to_s}] Appforce::Spawn::MissingParameters -- Missing Client API Name"
|
101
|
+
raise Appforce::Spawn::MissingParameters, "Missing Client API Name"
|
102
|
+
end
|
103
|
+
|
104
|
+
url = "#{client_url(opts[:client_api_name])}/all_host_data.json?#{token_param}"
|
105
|
+
logger.debug "[#{self.name}##{__method__.to_s}] URL: #{url}"
|
106
|
+
make_api_call(url)
|
107
|
+
end
|
108
|
+
|
109
|
+
def self.list_clients
|
110
|
+
resp = get_clients
|
111
|
+
puts Appforce::Logger.header("Client List")
|
112
|
+
resp.each do |item|
|
113
|
+
printf " Client: %-16s API Name: %s\n", item['name'], item['api_name']
|
114
|
+
end
|
115
|
+
puts Appforce::Logger.footer
|
116
|
+
end
|
117
|
+
|
118
|
+
def self.list_hosts(*args)
|
119
|
+
resp = get_all_host_data(*args)
|
120
|
+
puts Appforce::Logger.header("Host List")
|
121
|
+
i = 1
|
122
|
+
resp.each do |item|
|
123
|
+
printf " #{i} - '%s' host: %s ip: %s\n", item['desc'], item['hostname'], item['ip']
|
124
|
+
i += 1
|
125
|
+
end
|
126
|
+
puts Appforce::Logger.footer
|
127
|
+
resp
|
128
|
+
end
|
129
|
+
|
130
|
+
def self.ssh_to_host(*args)
|
131
|
+
hosts = list_hosts(*args)
|
132
|
+
input = HighLine.ask("\nWhich host to ssh to? ", Integer) { |q| q.in = 1..hosts.count }
|
133
|
+
machine = hosts[input - 1]
|
134
|
+
|
135
|
+
$stderr.print "\n"
|
136
|
+
logger.info "Establishing SSH seesion as '#{machine['username']}' to #{machine['desc']}"
|
137
|
+
logger.debug "SSH command: #{ssh_cmd(machine)}"
|
138
|
+
|
139
|
+
pid = fork {
|
140
|
+
exec ssh_cmd(machine)
|
141
|
+
}
|
142
|
+
Process.wait pid
|
143
|
+
|
144
|
+
$stderr.print "\n"
|
145
|
+
logger.info "SSH session terminated."
|
146
|
+
end
|
147
|
+
|
148
|
+
def self.ping(*args)
|
149
|
+
url = "#{base_api_url}ping?#{token_param}"
|
150
|
+
logger.debug "[#{self.name}##{__method__.to_s}] URL: #{url}"
|
151
|
+
make_api_call("#{base_api_url}ping?#{token_param}")
|
152
|
+
end
|
153
|
+
|
154
|
+
def self.latest_version(*args)
|
155
|
+
url = rubygem_latest_version_url
|
156
|
+
logger.debug "[#{self.name}##{__method__.to_s}] URL: #{url}"
|
157
|
+
resp = make_api_call(url)
|
158
|
+
resp['version']
|
159
|
+
end
|
160
|
+
|
161
|
+
private
|
162
|
+
|
163
|
+
def self.ssh_cmd(info)
|
164
|
+
"ssh #{info['username']}@#{info[info['method']]}"
|
165
|
+
end
|
166
|
+
|
167
|
+
def self.base_api_url
|
168
|
+
"#{Appforce::Config.config.api_host}/#{Appforce::Config.config.api_version}/"
|
169
|
+
end
|
170
|
+
|
171
|
+
def self.client_url(client_api_name)
|
172
|
+
"#{base_api_url}client/#{client_api_name}"
|
173
|
+
end
|
174
|
+
|
175
|
+
def self.host_url(host_api_name)
|
176
|
+
"#{base_api_url}host/#{host_api_name}"
|
177
|
+
end
|
178
|
+
|
179
|
+
def self.token_param
|
180
|
+
"token=#{Appforce::Config.config.api_token}"
|
181
|
+
end
|
182
|
+
|
183
|
+
def self.rubygem_latest_version_url
|
184
|
+
"https://rubygems.org/api/v1/versions/appforce-spawn/latest.json"
|
185
|
+
end
|
186
|
+
|
187
|
+
def self.make_api_call(url)
|
188
|
+
begin
|
189
|
+
resp = HTTParty.get(url)
|
190
|
+
rescue
|
191
|
+
logger.fatal "[#{self.name}##{__method__.to_s}] Appforce::Spawn::API::CallFailure - API Failed to Return for URL: #{url}"
|
192
|
+
raise Appforce::Spawn::API::CallFailure, "API Failed to Return."
|
193
|
+
end
|
194
|
+
|
195
|
+
case resp.code
|
196
|
+
when 200
|
197
|
+
resp
|
198
|
+
when 401
|
199
|
+
logger.fatal "[#{self.name}##{__method__.to_s}] Appforce::Spawn::API::UnauthorizedAccess -- Invalid API Access Token -- URL: #{url}"
|
200
|
+
raise Appforce::Spawn::API::UnauthorizedAccess, "Invalid API Access Token"
|
201
|
+
when 404
|
202
|
+
logger.fatal "[#{self.name}##{__method__.to_s}] -- Appforce::Spawn::API::NotFound -- API Route Not Found -- URL: #{url}"
|
203
|
+
raise Appforce::Spawn::API::NotFound, "API Route Not Found"
|
204
|
+
when 500...600
|
205
|
+
logger.fatal "[#{self.name}##{__method__.to_s}] -- Appforce::Spawn::API::Unavailable -- API Service Unavailable -- URL: #{url}"
|
206
|
+
raise Appforce::Spawn::API::Unavailable, "API Service Unavailable"
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
def self.logger
|
211
|
+
Appforce::Logger.logger
|
212
|
+
end
|
213
|
+
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Appforce
|
2
|
+
module Spawn
|
3
|
+
|
4
|
+
class Error < StandardError; end
|
5
|
+
|
6
|
+
class UnknownClient < Error; end
|
7
|
+
|
8
|
+
class ConfigFileParseError < Error; end
|
9
|
+
|
10
|
+
class MissingParameters < Error; end
|
11
|
+
|
12
|
+
class MissingFile < Error; end
|
13
|
+
|
14
|
+
class MissingDependency < Error; end
|
15
|
+
|
16
|
+
class NotYetImplemented < Error; end
|
17
|
+
|
18
|
+
module API
|
19
|
+
class CallFailure < Error; end
|
20
|
+
|
21
|
+
class UnauthorizedAccess < Error; end
|
22
|
+
|
23
|
+
class NotFound < Error; end
|
24
|
+
|
25
|
+
class Unavailable < Error; end
|
26
|
+
|
27
|
+
class NotYetImplemented < Error; end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
module Appforce
|
2
|
+
module Spawn
|
3
|
+
class Runner
|
4
|
+
require 'open3'
|
5
|
+
|
6
|
+
MINIMUM_ANSIBLE_VERSION = "1.8.3"
|
7
|
+
|
8
|
+
def self.run_playbook
|
9
|
+
logger.info "[#{self.name}##{__method__.to_s}] Start running playbook."
|
10
|
+
logger.debug "[#{self.name}##{__method__.to_s}] ansible_command: #{ansible_command}"
|
11
|
+
system "#{ansible_command}"
|
12
|
+
logger.info "[#{self.name}##{__method__.to_s}] Playbook run complete."
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.run_dryrun
|
16
|
+
logger.info "[#{self.name}##{__method__.to_s}] Start running dry-run of playbook."
|
17
|
+
logger.debug "[#{self.name}##{__method__.to_s}] ansible_dryrun_command: #{ansible_command} --check --diff"
|
18
|
+
system "#{ansible_command} --check --diff"
|
19
|
+
logger.info "[#{self.name}##{__method__.to_s}] Playbook dry-run complete."
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.display_ansible_command
|
23
|
+
logger.info "[#{self.name}##{__method__.to_s}] Ansible command to run playbook for this Client is:\n -- #{ansible_command}"
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.ansible_ping
|
27
|
+
logger.info "[#{self.name}##{__method__.to_s}] Start running ansible ping."
|
28
|
+
logger.debug "[#{self.name}##{__method__.to_s}] ansible_ping_command: #{ansible_ping_command} --check --diff"
|
29
|
+
system "#{ansible_ping_command}"
|
30
|
+
logger.info "[#{self.name}##{__method__.to_s}] Ansible ping complete."
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.display_ansible_ping_command
|
34
|
+
logger.info "[#{self.name}##{__method__.to_s}] Ansible command to ping this Client is:\n -- #{ansible_ping_command}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.can_run?
|
38
|
+
# validate stuff first
|
39
|
+
check_dependencies
|
40
|
+
unless File.exist?('./vars.yml')
|
41
|
+
logger.error "[#{self.name}##{__method__.to_s}] Appforce::Spawn::MissingFile -- Missing 'vars.yml' file"
|
42
|
+
raise Appforce::Spawn::MissingFile, "Missing 'vars.yml' file"
|
43
|
+
end
|
44
|
+
unless File.exist?('./hosts')
|
45
|
+
logger.error "[#{self.name}##{__method__.to_s}] Appforce::Spawn::MissingFile -- Missing 'hosts' file"
|
46
|
+
raise Appforce::Spawn::MissingFile, "Missing 'hosts' file"
|
47
|
+
end
|
48
|
+
unless File.exist?('./active_users.yml')
|
49
|
+
logger.error "[#{self.name}##{__method__.to_s}] Appforce::Spawn::MissingFile -- Missing 'active_users.yml' file"
|
50
|
+
raise Appforce::Spawn::MissingFile, "Missing 'active_users.yml' file"
|
51
|
+
end
|
52
|
+
unless File.exist?('./inactive_users.yml')
|
53
|
+
logger.error "[#{self.name}##{__method__.to_s}] Appforce::Spawn::MissingFile -- Missing 'inactive_users.yml' file"
|
54
|
+
raise Appforce::Spawn::MissingFile, "Missing 'inactive_users.yml' file"
|
55
|
+
end
|
56
|
+
true
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.check_dependencies
|
60
|
+
# ansible install
|
61
|
+
unless ansible_installed?
|
62
|
+
logger.error "[#{self.name}##{__method__.to_s}] Appforce::Spawn::MissingDependency -- Missing 'ansible' executable."
|
63
|
+
raise Appforce::Spawn::Dependency, "Missing 'ansible' executable"
|
64
|
+
end
|
65
|
+
|
66
|
+
# ansible version
|
67
|
+
unless good_ansible_version?
|
68
|
+
str = `ansible --version`
|
69
|
+
version_str = /^ansible\s(\d+\.\d+\.\d+)$/.match(str)[1].tr('.','')
|
70
|
+
logger.error "[#{self.name}##{__method__.to_s}] Appforce::Spawn::MissingDependency -- Insufficient 'ansible' version: #{version_str} < #{MINIMUM_ANSIBLE_VERSION}"
|
71
|
+
raise Appforce::Spawn::Dependency, "Insufficient 'ansible' version: #{version_str} < #{MINIMUM_ANSIBLE_VERSION}"
|
72
|
+
end
|
73
|
+
|
74
|
+
# ansible rvm_io.rvm1-ruby galaxy install
|
75
|
+
unless rvm_galaxy_installed?
|
76
|
+
logger.error "[#{self.name}##{__method__.to_s}] Appforce::Spawn::MissingDependency -- Missing 'rvm_io.rvm1-ruby' galaxy role."
|
77
|
+
logger.info "[#{self.name}##{__method__.to_s}] Appforce::Spawn::MissingDependency -- Run 'ansible-galaxy install rvm_io.rvm1-ruby' to install role"
|
78
|
+
raise Appforce::Spawn::Dependency, "Missing 'rvm_io.rvm1-ruby' galaxy role"
|
79
|
+
end
|
80
|
+
|
81
|
+
true
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
def self.ansible_installed?
|
87
|
+
ansible = `which ansible`
|
88
|
+
/ansible$/.match(ansible)
|
89
|
+
end
|
90
|
+
|
91
|
+
def self.good_ansible_version?
|
92
|
+
str = `ansible --version`
|
93
|
+
version_str = /^ansible\s(\d+\.\d+\.\d+)$/.match(str)[1].tr('.','')
|
94
|
+
return true if version_str.to_i >= MINIMUM_ANSIBLE_VERSION.tr('.','').to_i
|
95
|
+
nil
|
96
|
+
end
|
97
|
+
|
98
|
+
def self.rvm_galaxy_installed?
|
99
|
+
galaxy = `ansible-galaxy list`
|
100
|
+
/^-\srvm_io.rvm1-ruby,\sv1\.3/.match(galaxy)
|
101
|
+
end
|
102
|
+
|
103
|
+
def self.ansible_command
|
104
|
+
# ansible-playbook -i hosts site.yml --extra-vars="ansible_user={{ ansible_user }} users_file=./users.yml"
|
105
|
+
begin
|
106
|
+
vars = YAML::load(File.open('./vars.yml'))
|
107
|
+
rescue Exception => e
|
108
|
+
logger.fatal "[#{self.name}##{__method__.to_s}] Appforce::Spawn::Runner::VarsFileError"\
|
109
|
+
" -- 'vars.yml' file appears to be malformed -- #{e}"
|
110
|
+
raise e
|
111
|
+
end
|
112
|
+
|
113
|
+
if vars['ansible_private_key']
|
114
|
+
"ansible-playbook -i hosts site.yml --private-key=./private_key.pem --extra-vars='ansible_user=#{vars['ansible_user']} active_users_file=./active_users.yml inactive_users_file=./inactive_users.yml'"
|
115
|
+
else
|
116
|
+
"ansible-playbook -i hosts site.yml --extra-vars='ansible_user=#{vars['ansible_user']} active_users_file=./active_users.yml inactive_users_file=./inactive_users.yml'"
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def self.ansible_ping_command
|
121
|
+
# ansible all -m ping -i hosts -u ansible
|
122
|
+
begin
|
123
|
+
vars = YAML::load(File.open('./vars.yml'))
|
124
|
+
rescue Exception => e
|
125
|
+
logger.fatal "[#{self.name}##{__method__.to_s}] Appforce::Spawn::Runner::VarsFileError"\
|
126
|
+
" -- 'vars.yml' file appears to be malformed -- #{e}"
|
127
|
+
raise e
|
128
|
+
end
|
129
|
+
|
130
|
+
if vars['ansible_private_key']
|
131
|
+
"ansible all -m ping -i hosts --private-key=./private_key.pem -u #{vars['ansible_user']}"
|
132
|
+
else
|
133
|
+
"ansible all -m ping -i hosts -u #{vars['ansible_user']}"
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def self.logger
|
138
|
+
Appforce::Logger.logger
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
module Appforce
|
2
|
+
module Spawn
|
3
|
+
class Template
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
def self.create_dirs(*args)
|
7
|
+
opts = args[1]
|
8
|
+
unless opts[:client_api_name]
|
9
|
+
logger.error "[#{self.name}##{__method__.to_s}] Appforce::Spawn::MissingParameters -- Missing Client API Name"
|
10
|
+
raise Appforce::Spawn::MissingParameters, "Missing Client API Name"
|
11
|
+
end
|
12
|
+
dir = "#{ansible_dest_path(opts[:client_api_name])}"
|
13
|
+
logger.info "[#{self.name}##{__method__.to_s}] Creating directory: #{dir}"
|
14
|
+
begin
|
15
|
+
FileUtils.mkdir(dir)
|
16
|
+
rescue Errno::EEXIST
|
17
|
+
logger.warn "[#{self.name}##{__method__.to_s}] Directory (#{dir}) already exists."
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.copy_template(*args)
|
22
|
+
opts = args[1]
|
23
|
+
unless opts[:client_api_name]
|
24
|
+
logger.error "[#{self.name}##{__method__.to_s}] Appforce::Spawn::MissingParameters -- Missing Client API Name"
|
25
|
+
raise Appforce::Spawn::MissingParameters, "Missing Client API Name"
|
26
|
+
end
|
27
|
+
logger.info "[#{self.name}##{__method__.to_s}] Copying files from Template..."
|
28
|
+
FileUtils.cp_r("#{ansible_source_path}/.", "#{ansible_dest_path(opts[:client_api_name])}")
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.download_files(*args)
|
32
|
+
opts = args[1]
|
33
|
+
unless opts[:client_api_name]
|
34
|
+
logger.error "[#{self.name}##{__method__.to_s}] Appforce::Spawn::MissingParameters -- Missing Client API Name"
|
35
|
+
raise Appforce::Spawn::MissingParameters, "Missing Client API Name"
|
36
|
+
end
|
37
|
+
|
38
|
+
logger.info "[#{self.name}##{__method__.to_s}] Pulling Hosts file for Client '#{opts[:client_api_name]}'"
|
39
|
+
write_to_file(Appforce::Spawn::Api::Call.get_hosts(*args), "#{ansible_dest_path(opts[:client_api_name])}/hosts")
|
40
|
+
logger.info "[#{self.name}##{__method__.to_s}] Pulling Active Users file for Client '#{opts[:client_api_name]}'"
|
41
|
+
write_to_file(Appforce::Spawn::Api::Call.get_active_users(*args), "#{ansible_dest_path(opts[:client_api_name])}/active_users.yml")
|
42
|
+
logger.info "[#{self.name}##{__method__.to_s}] Pulling Inactive Users file for Client '#{opts[:client_api_name]}'"
|
43
|
+
write_to_file(Appforce::Spawn::Api::Call.get_inactive_users(*args), "#{ansible_dest_path(opts[:client_api_name])}/inactive_users.yml")
|
44
|
+
logger.info "[#{self.name}##{__method__.to_s}] Pulling Vars file for Client '#{opts[:client_api_name]}'"
|
45
|
+
write_to_file(Appforce::Spawn::Api::Call.get_vars(*args), "#{ansible_dest_path(opts[:client_api_name])}/vars.yml")
|
46
|
+
logger.info "[#{self.name}##{__method__.to_s}] Pulling Main Scout file for Client '#{opts[:client_api_name]}'"
|
47
|
+
write_to_file(Appforce::Spawn::Api::Call.get_main_scout(*args), "#{ansible_dest_path(opts[:client_api_name])}/roles/scout/vars/main.yml")
|
48
|
+
logger.info "[#{self.name}##{__method__.to_s}] Pulling Scout Host Data for Client '#{opts[:client_api_name]}'"
|
49
|
+
write_to_file(Appforce::Spawn::Api::Call.get_private_key(*args), "#{ansible_dest_path(opts[:client_api_name])}/private_key.pem")
|
50
|
+
logger.info "[#{self.name}##{__method__.to_s}] Pulling Private Key Data for Client '#{opts[:client_api_name]}'"
|
51
|
+
File.chmod(0600, "#{ansible_dest_path(opts[:client_api_name])}/private_key.pem")
|
52
|
+
|
53
|
+
host_data = Appforce::Spawn::Api::Call.get_all_host_data(*args)
|
54
|
+
host_data.each do |host|
|
55
|
+
if host['scout'] == 'true'
|
56
|
+
filename = "#{host[host['method']]}.yml"
|
57
|
+
logger.info "[#{self.name}##{__method__.to_s}] Pulling Scout Host Data for Host '#{host[host['method']]}'"
|
58
|
+
args[1][:host_api_name] = host['id']
|
59
|
+
write_to_file(Appforce::Spawn::Api::Call.get_host_scout_vars(*args), "#{ansible_dest_path(opts[:client_api_name])}/roles/scout/vars/#{filename}")
|
60
|
+
args[1].delete(:host_api_name)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.run_path
|
67
|
+
Dir.pwd
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.gem_path
|
71
|
+
File.expand_path(File.dirname(__FILE__))
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.ansible_source_path
|
75
|
+
File.join(gem_path, '../../../ansible')
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.ansible_dest_path(client_api_name)
|
79
|
+
"#{run_path}/#{client_api_name}"
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.write_to_file(data, path)
|
83
|
+
begin
|
84
|
+
file = File.open(path, "w")
|
85
|
+
file.write(data)
|
86
|
+
rescue IOError => e
|
87
|
+
logger.fatal "[#{self.name}##{__method__.to_s}] Exception writing to file '#{path}' -- #{e}"
|
88
|
+
raise e
|
89
|
+
ensure
|
90
|
+
file.close unless file == nil
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
private
|
95
|
+
|
96
|
+
def self.logger
|
97
|
+
Appforce::Logger.logger
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|