appforce-spawn 0.5.1
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/.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
|