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
File without changes
|
data/ansible/rvm.yml
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
---
|
2
|
+
- hosts: rvm
|
3
|
+
remote_user: "{{ ansible_user }}"
|
4
|
+
sudo: yes
|
5
|
+
roles:
|
6
|
+
- role: rvm_io.rvm1-ruby
|
7
|
+
sudo: yes
|
8
|
+
rvm1_user: 'synctree'
|
9
|
+
rvm1_install_path: '/home/synctree/.rvm'
|
10
|
+
rvm1_rvm_version: 'stable'
|
11
|
+
rvm1_install_flags: '--user-install'
|
12
|
+
rvm1_rubies:
|
13
|
+
- 'ruby-2.2.0'
|
data/ansible/scout.yml
ADDED
data/ansible/site.yml
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
$:.push File.expand_path("../lib", __FILE__)
|
2
|
+
require 'appforce/spawn/version'
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = 'appforce-spawn'
|
6
|
+
s.version = Appforce::Spawn::VERSION
|
7
|
+
s.date = Time.now.strftime('%Y-%m-%d')
|
8
|
+
s.summary = "Synctree user installation tool"
|
9
|
+
s.description = "A gem that uses the Appforce SSH key manager API to install users on client machines."
|
10
|
+
s.authors = ["Derek Smith"]
|
11
|
+
s.email = 'derek@synctree.com'
|
12
|
+
s.homepage = 'http://synctree.com'
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n").map {|f| f !~ /vagrant|test/ ? f : next }.compact
|
15
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
16
|
+
s.require_paths = ["lib", "ansible"]
|
17
|
+
|
18
|
+
s.required_ruby_version = '>= 1.9.3'
|
19
|
+
s.add_dependency 'httparty', '~> 0.10', '>= 0.10.2'
|
20
|
+
s.add_dependency 'highline', '~> 1.7', '>= 1.7'
|
21
|
+
s.add_development_dependency "rspec", '~> 3.0'
|
22
|
+
|
23
|
+
s.license = 'Private'
|
24
|
+
end
|
data/bin/appforce-spawn
ADDED
@@ -0,0 +1,161 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
|
3
|
+
require "optparse"
|
4
|
+
|
5
|
+
$:.unshift(File.join(File.dirname(__FILE__), "/../lib"))
|
6
|
+
require "appforce-spawn"
|
7
|
+
|
8
|
+
opts = {
|
9
|
+
verbose: false
|
10
|
+
}
|
11
|
+
|
12
|
+
OptionParser.new do |o|
|
13
|
+
o.banner = "VERSION: #{Appforce::Spawn::VERSION}\nUSAGE: #{$0} [options]"
|
14
|
+
|
15
|
+
o.on("-a",
|
16
|
+
"--action [ACTION]",
|
17
|
+
"Action to perform. Use '-l' to view all available actions") do |a|
|
18
|
+
opts[:action] = a.downcase
|
19
|
+
end
|
20
|
+
|
21
|
+
o.on("-l",
|
22
|
+
"--list-actions",
|
23
|
+
"List available Actions") do |l|
|
24
|
+
opts[:list_actions] = true
|
25
|
+
end
|
26
|
+
|
27
|
+
o.on("-C",
|
28
|
+
"--client [CLIENT API NAME]",
|
29
|
+
"API Client Name to use for calls") do |cl|
|
30
|
+
opts[:client_api_name] = cl.downcase
|
31
|
+
end
|
32
|
+
|
33
|
+
o.on("-c", "--config [PATH]", "Optional custom config file") do |c|
|
34
|
+
opts[:config] = c
|
35
|
+
end
|
36
|
+
|
37
|
+
o.on("-D",
|
38
|
+
"--dump-config",
|
39
|
+
"Generate a example config template (to ~/.appforce.example)") do |d|
|
40
|
+
opts[:dump_config] = true
|
41
|
+
end
|
42
|
+
|
43
|
+
o.on("-v", "--verbose", "If set, print verbose output") do |v|
|
44
|
+
opts[:verbose] = true
|
45
|
+
end
|
46
|
+
|
47
|
+
o.on("--version", "Show current version and latest version available on RubyGems") do |v|
|
48
|
+
opts[:list_version] = true
|
49
|
+
end
|
50
|
+
|
51
|
+
o.on("-h", "--help", "Show help documentation") do |h|
|
52
|
+
STDERR.puts o
|
53
|
+
exit
|
54
|
+
end
|
55
|
+
|
56
|
+
end.parse!
|
57
|
+
|
58
|
+
if opts[:dump_config]
|
59
|
+
STDERR.puts " Dumping example config temlplate..."
|
60
|
+
Appforce::Spawn.dump_example_config
|
61
|
+
STDERR.puts " File written to ~/.appforce.example"
|
62
|
+
STDERR.puts " You will need to replace the API token and move the file to ~/.appforce"
|
63
|
+
exit
|
64
|
+
end
|
65
|
+
|
66
|
+
##
|
67
|
+
# Settiung up logger
|
68
|
+
# TODO: Internalize this
|
69
|
+
logger = Logger.new(STDOUT)
|
70
|
+
opts[:verbose] ? logger.level = Logger::DEBUG : logger.level = Logger::INFO
|
71
|
+
logger.formatter = proc do |severity, datetime, progname, msg|
|
72
|
+
"[#{severity}] #{datetime.strftime("%Y-%m-%d %H:%M:%S")} #{msg}\n"
|
73
|
+
end
|
74
|
+
Appforce::Spawn.logger = logger
|
75
|
+
Appforce::Spawn.logger.debug "Debug logging is on."
|
76
|
+
|
77
|
+
##
|
78
|
+
# List Version
|
79
|
+
if opts[:list_version]
|
80
|
+
installed = Appforce::Spawn::VERSION
|
81
|
+
latest = Appforce::Spawn.latest_version
|
82
|
+
|
83
|
+
STDERR.puts " appforce-spawn gem version: #{installed}"
|
84
|
+
STDERR.puts " latest version available: #{latest}"
|
85
|
+
if latest == installed
|
86
|
+
STDERR.puts " You are up-to-date"
|
87
|
+
else
|
88
|
+
STDERR.puts " A new version is available. Run the following to update:"
|
89
|
+
STDERR.puts " gem update appforce-spawn"
|
90
|
+
end
|
91
|
+
exit
|
92
|
+
end
|
93
|
+
|
94
|
+
##
|
95
|
+
# List actions to screen
|
96
|
+
if opts[:list_actions]
|
97
|
+
STDERR.puts Appforce::Spawn.header("Avaialable Actions")
|
98
|
+
Appforce::Spawn.available_actions.each do |m|
|
99
|
+
STDERR.printf " %-20s # %s\n", m[0], m[1][:info]
|
100
|
+
end
|
101
|
+
STDERR.puts Appforce::Spawn.footer
|
102
|
+
exit
|
103
|
+
end
|
104
|
+
|
105
|
+
unless opts[:action]
|
106
|
+
STDERR.puts Appforce::Spawn.header("An Action Is Required")
|
107
|
+
STDERR.puts " USAGE: #{$0} [options]"
|
108
|
+
STDERR.puts " Use '-h' or '--help' to list all options."
|
109
|
+
STDERR.puts " Use '-l' or '--list-actions' to list all actions."
|
110
|
+
STDERR.puts Appforce::Spawn.footer
|
111
|
+
exit
|
112
|
+
end
|
113
|
+
|
114
|
+
unless Appforce::Spawn.available_actions.keys.include? opts[:action]
|
115
|
+
STDERR.puts Appforce::Spawn.header("Action '#{opts[:action]}' Not Supported")
|
116
|
+
STDERR.puts Appforce::Spawn.header("Avaialable Actions")
|
117
|
+
Appforce::Spawn.available_actions.each do |m|
|
118
|
+
STDERR.printf " %-20s # %s\n", m[0], m[1][:info]
|
119
|
+
end
|
120
|
+
STDERR.puts Appforce::Spawn.footer
|
121
|
+
exit
|
122
|
+
end
|
123
|
+
|
124
|
+
##
|
125
|
+
# Do stuff down here
|
126
|
+
Appforce::Spawn.load_config(opts[:config])
|
127
|
+
if opts[:verbose]
|
128
|
+
logger.debug "Parameters as read from the config file:"
|
129
|
+
Appforce::Spawn.config.marshal_dump.keys.each {|k| logger.debug "-- #{k}: #{Appforce::Spawn.config.send(k)}"}
|
130
|
+
end
|
131
|
+
|
132
|
+
##
|
133
|
+
# validate Client API Name before proceeding
|
134
|
+
if opts[:client_api_name]
|
135
|
+
resp = Appforce::Spawn.get_clients
|
136
|
+
a = []
|
137
|
+
resp.each do |item|
|
138
|
+
a.push item['api_name']
|
139
|
+
end
|
140
|
+
unless a.include? opts[:client_api_name]
|
141
|
+
logger.fatal "-- '#{opts[:client_api_name]}' is not a valid Client API name."
|
142
|
+
Appforce::Spawn.clients
|
143
|
+
exit
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
# Execute method
|
148
|
+
result = Appforce::Spawn.send(
|
149
|
+
Appforce::Spawn.available_actions[opts[:action]][:cmd],
|
150
|
+
ARGV.first,
|
151
|
+
opts)
|
152
|
+
|
153
|
+
if opts[:action] =~ /hosts|users|vars|^ping/
|
154
|
+
STDERR.puts Appforce::Spawn.header("The YAML output from the API will be written to STDOUT below")
|
155
|
+
STDERR.puts "\n"
|
156
|
+
puts "#{result}"
|
157
|
+
STDERR.puts "\n"
|
158
|
+
STDERR.puts STDERR.puts Appforce::Spawn.header("Action Complete")
|
159
|
+
else
|
160
|
+
logger.info "Action Complete."
|
161
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'appforce/spawn'
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Appforce
|
2
|
+
class Config
|
3
|
+
require 'yaml'
|
4
|
+
require 'ostruct'
|
5
|
+
|
6
|
+
# read in config file
|
7
|
+
# default location is root at runtime
|
8
|
+
DEFAULT_CONFIG_PATH = "#{File.expand_path('~')}/.appforce"
|
9
|
+
|
10
|
+
def self.load_config(path=nil)
|
11
|
+
begin
|
12
|
+
temp = YAML::load(File.open(path.nil? ? DEFAULT_CONFIG_PATH : path))
|
13
|
+
@config = OpenStruct.new temp
|
14
|
+
rescue Exception => e
|
15
|
+
logger.fatal "[#{self.name}##{__method__.to_s}] Appforce::Spawn::ConfigFileParseError"\
|
16
|
+
" -- Config file appears to be malformed -- #{e}"
|
17
|
+
raise e
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.config
|
22
|
+
@config
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.dump_example_config
|
26
|
+
path = "#{File.expand_path('~')}/.appforce.example"
|
27
|
+
h = {
|
28
|
+
'api_host' => 'https://afuka.synctree.com',
|
29
|
+
'api_version' => 'api/v1',
|
30
|
+
'api_token' => 'PUT_API_TOKEN_HERE'
|
31
|
+
}
|
32
|
+
begin
|
33
|
+
file = File.open(path, "w")
|
34
|
+
file.write(h.to_yaml)
|
35
|
+
rescue IOError => e
|
36
|
+
logger.fatal "[#{self.name}##{__method__.to_s}] Appforce::ConfigDumpError -- #{e}"
|
37
|
+
raise e
|
38
|
+
ensure
|
39
|
+
file.close unless file == nil
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def self.logger
|
46
|
+
Appforce::Logger.logger
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Appforce
|
2
|
+
class Logger
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
def self.logger
|
6
|
+
@logger
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.logger=(logger)
|
10
|
+
@logger = logger
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.header(str='')
|
14
|
+
output = ' == ' + str + ' '
|
15
|
+
adjust = 78 - output.length
|
16
|
+
adjust = adjust < 0 ? 0 : adjust
|
17
|
+
output << "="*adjust
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.footer
|
21
|
+
" " + "="*77
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,312 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
|
3
|
+
require 'appforce/config'
|
4
|
+
require 'appforce/logger'
|
5
|
+
require 'appforce/spawn/version'
|
6
|
+
require 'appforce/spawn/exceptions'
|
7
|
+
require 'appforce/spawn/api'
|
8
|
+
require 'appforce/spawn/template'
|
9
|
+
require 'appforce/spawn/runner'
|
10
|
+
|
11
|
+
module Appforce
|
12
|
+
module Spawn
|
13
|
+
|
14
|
+
##
|
15
|
+
# Extend module base class
|
16
|
+
# Allows fo r class like interactions on Module
|
17
|
+
def self.included(base)
|
18
|
+
base.extend ClassMethods
|
19
|
+
end
|
20
|
+
|
21
|
+
# Define methods to extend
|
22
|
+
module ClassMethods
|
23
|
+
|
24
|
+
def logger
|
25
|
+
Appforce::Logger.logger
|
26
|
+
end
|
27
|
+
|
28
|
+
def logger=(logger)
|
29
|
+
Appforce::Logger.logger = logger
|
30
|
+
end
|
31
|
+
|
32
|
+
def header(input)
|
33
|
+
Appforce::Logger.header(input)
|
34
|
+
end
|
35
|
+
|
36
|
+
def footer
|
37
|
+
Appforce::Logger.footer
|
38
|
+
end
|
39
|
+
|
40
|
+
def ping_host
|
41
|
+
HTTParty.get("#{config.api_host}/ping")
|
42
|
+
end
|
43
|
+
|
44
|
+
def ping_api
|
45
|
+
Appforce::Spawn::Api::Call.ping
|
46
|
+
end
|
47
|
+
|
48
|
+
def load_config(*args)
|
49
|
+
Appforce::Config.load_config(*args)
|
50
|
+
end
|
51
|
+
|
52
|
+
def config
|
53
|
+
Appforce::Config.config
|
54
|
+
end
|
55
|
+
|
56
|
+
def clients
|
57
|
+
Appforce::Spawn::Api::Call.list_clients
|
58
|
+
end
|
59
|
+
|
60
|
+
def get_clients
|
61
|
+
Appforce::Spawn::Api::Call.get_clients
|
62
|
+
end
|
63
|
+
|
64
|
+
def get_hosts(*args)
|
65
|
+
Appforce::Spawn::Api::Call.get_hosts(*args)
|
66
|
+
end
|
67
|
+
|
68
|
+
def get_active_users(*args)
|
69
|
+
Appforce::Spawn::Api::Call.get_active_users(*args)
|
70
|
+
end
|
71
|
+
|
72
|
+
def get_inactive_users(*args)
|
73
|
+
Appforce::Spawn::Api::Call.get_inactive_users(*args)
|
74
|
+
end
|
75
|
+
|
76
|
+
def get_vars(*args)
|
77
|
+
Appforce::Spawn::Api::Call.get_vars(*args)
|
78
|
+
end
|
79
|
+
|
80
|
+
def generate(*args)
|
81
|
+
logger.info "[#{self.name}##{__method__.to_s}] Template Generation Starting"
|
82
|
+
Appforce::Spawn::Template.create_dirs(*args)
|
83
|
+
Appforce::Spawn::Template.copy_template(*args)
|
84
|
+
Appforce::Spawn::Template.download_files(*args)
|
85
|
+
logger.info "[#{self.name}##{__method__.to_s}] Template Generation Complete"
|
86
|
+
end
|
87
|
+
|
88
|
+
def spawn(*args)
|
89
|
+
Appforce::Spawn::Runner.can_run?
|
90
|
+
Appforce::Spawn::Runner.run_playbook
|
91
|
+
end
|
92
|
+
|
93
|
+
def display_ansible_command(*args)
|
94
|
+
Appforce::Spawn::Runner.can_run?
|
95
|
+
Appforce::Spawn::Runner.display_ansible_command
|
96
|
+
end
|
97
|
+
|
98
|
+
def ansible_ping(*args)
|
99
|
+
Appforce::Spawn::Runner.can_run?
|
100
|
+
Appforce::Spawn::Runner.ansible_ping
|
101
|
+
end
|
102
|
+
|
103
|
+
def display_ansible_ping_command(*args)
|
104
|
+
Appforce::Spawn::Runner.can_run?
|
105
|
+
Appforce::Spawn::Runner.display_ansible_ping_command
|
106
|
+
end
|
107
|
+
|
108
|
+
def dump_example_config(*args)
|
109
|
+
Appforce::Config.dump_example_config
|
110
|
+
end
|
111
|
+
|
112
|
+
def get_all_host_data(*args)
|
113
|
+
Appforce::Spawn::Api::Call.get_all_host_data(*args)
|
114
|
+
end
|
115
|
+
|
116
|
+
def ssh_to_host(*args)
|
117
|
+
Appforce::Spawn::Api::Call.ssh_to_host(*args)
|
118
|
+
end
|
119
|
+
|
120
|
+
def latest_version(*args)
|
121
|
+
Appforce::Spawn::Api::Call.latest_version
|
122
|
+
end
|
123
|
+
|
124
|
+
def check_dependencies(*args)
|
125
|
+
Appforce::Spawn::Runner.check_dependencies
|
126
|
+
logger.info "[#{self.name}##{__method__.to_s}] All required Ansible checks passed."
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
# Extension class
|
131
|
+
class Basement #:nodoc:
|
132
|
+
include Appforce::Spawn
|
133
|
+
end
|
134
|
+
|
135
|
+
def self.logger
|
136
|
+
Basement.logger
|
137
|
+
end
|
138
|
+
|
139
|
+
def self.logger=(logger)
|
140
|
+
Basement.logger = logger
|
141
|
+
end
|
142
|
+
|
143
|
+
def self.header(input)
|
144
|
+
Basement.header(input)
|
145
|
+
end
|
146
|
+
|
147
|
+
def self.footer
|
148
|
+
Basement.footer
|
149
|
+
end
|
150
|
+
|
151
|
+
def self.load_config(*args, &block)
|
152
|
+
Basement.load_config(*args, &block)
|
153
|
+
end
|
154
|
+
|
155
|
+
def self.config(*args)
|
156
|
+
Basement.config
|
157
|
+
end
|
158
|
+
|
159
|
+
def self.available_actions
|
160
|
+
{
|
161
|
+
'clients' => {
|
162
|
+
info: "Retrieve a complete list of Clients",
|
163
|
+
cmd: :clients
|
164
|
+
},
|
165
|
+
'generate' => {
|
166
|
+
info: "Build out the Ansible template for a Client (client API name is required)",
|
167
|
+
cmd: :generate
|
168
|
+
},
|
169
|
+
'client:hosts' => {
|
170
|
+
info: "Retrieve a Hosts file for a Client (client API name is required)",
|
171
|
+
cmd: :get_hosts
|
172
|
+
},
|
173
|
+
'client:hosts:details' => {
|
174
|
+
info: "Display all details about Client Hosts (client API name is required)",
|
175
|
+
cmd: :get_all_host_data
|
176
|
+
},
|
177
|
+
'client:users:active' => {
|
178
|
+
info: "Retrieve an Active Users file for a Client (client API name is required)",
|
179
|
+
cmd: :get_active_users
|
180
|
+
},
|
181
|
+
'client:users:inactive' => {
|
182
|
+
info: "Retrieve an Inactive Users file for a Client (client API name is required)",
|
183
|
+
cmd: :get_inactive_users
|
184
|
+
},
|
185
|
+
'client:vars' => {
|
186
|
+
info: "Retrieve a Vars file for a Client (client API name is required)",
|
187
|
+
cmd: :get_vars
|
188
|
+
},
|
189
|
+
'ping' => {
|
190
|
+
info: "Test connection to host and API access",
|
191
|
+
cmd: :ping
|
192
|
+
},
|
193
|
+
'ping:host' => {
|
194
|
+
info: "Test if API is available",
|
195
|
+
cmd: :ping_host
|
196
|
+
},
|
197
|
+
'ping:api' => {
|
198
|
+
info: "Test if you have access to the API",
|
199
|
+
cmd: :ping_api
|
200
|
+
},
|
201
|
+
'spawn' => {
|
202
|
+
info: "Run Ansible Playbook to spawn users to Client hosts",
|
203
|
+
cmd: :spawn
|
204
|
+
},
|
205
|
+
'spawn:ready?' => {
|
206
|
+
info: "Check to see if you have the required ansible version and roles installed",
|
207
|
+
cmd: :check_dependencies
|
208
|
+
},
|
209
|
+
'spawn:command' => {
|
210
|
+
info: "Display Ansible command to run Playbook for a Client",
|
211
|
+
cmd: :display_ansible_command
|
212
|
+
},
|
213
|
+
'spawn:ping' => {
|
214
|
+
info: "Ansible ping Client hosts in the 'hosts' file",
|
215
|
+
cmd: :ansible_ping
|
216
|
+
},
|
217
|
+
'spawn:ping:command' => {
|
218
|
+
info: "Display ansible ping command",
|
219
|
+
cmd: :display_ansible_ping_command
|
220
|
+
},
|
221
|
+
'ssh' => {
|
222
|
+
info: "Select a Host to ssh in as your User name (client API name is required)",
|
223
|
+
cmd: :ssh_to_host
|
224
|
+
},
|
225
|
+
}
|
226
|
+
end
|
227
|
+
|
228
|
+
def self.clients(*args)
|
229
|
+
Basement.clients
|
230
|
+
end
|
231
|
+
|
232
|
+
def self.get_clients(*args)
|
233
|
+
Basement.get_clients
|
234
|
+
end
|
235
|
+
|
236
|
+
def self.get_hosts(*args)
|
237
|
+
Basement.get_hosts(*args)
|
238
|
+
end
|
239
|
+
|
240
|
+
def self.get_active_users(*args)
|
241
|
+
Basement.get_active_users(*args)
|
242
|
+
end
|
243
|
+
|
244
|
+
def self.get_inactive_users(*args)
|
245
|
+
Basement.get_inactive_users(*args)
|
246
|
+
end
|
247
|
+
|
248
|
+
def self.get_vars(*args)
|
249
|
+
Basement.get_vars(*args)
|
250
|
+
end
|
251
|
+
|
252
|
+
def self.get_all_host_data(*args)
|
253
|
+
Basement.get_all_host_data(*args)
|
254
|
+
end
|
255
|
+
|
256
|
+
def self.generate(*args)
|
257
|
+
Basement.generate(*args)
|
258
|
+
end
|
259
|
+
|
260
|
+
def self.spawn(*args)
|
261
|
+
Basement.spawn
|
262
|
+
end
|
263
|
+
|
264
|
+
def self.display_ansible_command(*args)
|
265
|
+
Basement.display_ansible_command
|
266
|
+
end
|
267
|
+
|
268
|
+
def self.ansible_ping(*args)
|
269
|
+
Basement.ansible_ping
|
270
|
+
end
|
271
|
+
|
272
|
+
def self.display_ansible_ping_command(*args)
|
273
|
+
Basement.display_ansible_ping_command
|
274
|
+
end
|
275
|
+
|
276
|
+
def self.dump_example_config(*args)
|
277
|
+
Basement.dump_example_config(*args)
|
278
|
+
end
|
279
|
+
|
280
|
+
def self.ssh_to_host(*args)
|
281
|
+
Basement.ssh_to_host(*args)
|
282
|
+
end
|
283
|
+
|
284
|
+
def self.latest_version(*args)
|
285
|
+
Basement.latest_version(*args)
|
286
|
+
end
|
287
|
+
|
288
|
+
def self.check_dependencies(*args)
|
289
|
+
Basement.check_dependencies(*args)
|
290
|
+
end
|
291
|
+
|
292
|
+
def self.ping(*args)
|
293
|
+
host = Basement.ping_host
|
294
|
+
api = Basement.ping_api
|
295
|
+
{
|
296
|
+
:host => { :code => host.code, :body => host.body },
|
297
|
+
:api => { :code => api.code, :body => api.body }
|
298
|
+
}
|
299
|
+
end
|
300
|
+
|
301
|
+
def self.ping_host(*args)
|
302
|
+
host = Basement.ping_host
|
303
|
+
{ :code => host.code, :body => host.body }
|
304
|
+
end
|
305
|
+
|
306
|
+
def self.ping_api(*args)
|
307
|
+
api = Basement.ping_api
|
308
|
+
{ :code => api.code, :body => api.body }
|
309
|
+
end
|
310
|
+
|
311
|
+
end
|
312
|
+
end
|