pvcglue 0.1.5
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 +15 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +91 -0
- data/Rakefile +1 -0
- data/bin/pvc +13 -0
- data/lib/pvcglue.rb +43 -0
- data/lib/pvcglue/all_the_things.rb +7 -0
- data/lib/pvcglue/bootstrap.rb +8 -0
- data/lib/pvcglue/capistrano.rb +35 -0
- data/lib/pvcglue/cli.rb +150 -0
- data/lib/pvcglue/cloud.rb +278 -0
- data/lib/pvcglue/configuration.rb +157 -0
- data/lib/pvcglue/db.rb +145 -0
- data/lib/pvcglue/deploy.rb +4 -0
- data/lib/pvcglue/env.rb +141 -0
- data/lib/pvcglue/manager.rb +137 -0
- data/lib/pvcglue/nodes.rb +29 -0
- data/lib/pvcglue/packages.rb +47 -0
- data/lib/pvcglue/packages/bootstrap.rb +92 -0
- data/lib/pvcglue/packages/env.rb +80 -0
- data/lib/pvcglue/packages/firewall.rb +48 -0
- data/lib/pvcglue/packages/manager.rb +102 -0
- data/lib/pvcglue/packages/nginx.rb +10 -0
- data/lib/pvcglue/packages/nodejs.rb +17 -0
- data/lib/pvcglue/packages/passenger.rb +28 -0
- data/lib/pvcglue/packages/postgresql.rb +10 -0
- data/lib/pvcglue/packages/role_db.rb +47 -0
- data/lib/pvcglue/packages/role_lb.rb +64 -0
- data/lib/pvcglue/packages/role_memcached.rb +14 -0
- data/lib/pvcglue/packages/role_web.rb +60 -0
- data/lib/pvcglue/packages/rvm.rb +75 -0
- data/lib/pvcglue/packages/timezone.rb +17 -0
- data/lib/pvcglue/packages/ubuntu.rb +100 -0
- data/lib/pvcglue/railtie.rb +11 -0
- data/lib/pvcglue/ssl.rb +37 -0
- data/lib/pvcglue/templates/20auto-upgrades.erb +2 -0
- data/lib/pvcglue/templates/authorized_keys.erb +3 -0
- data/lib/pvcglue/templates/capfile.erb +20 -0
- data/lib/pvcglue/templates/database.yml.erb +57 -0
- data/lib/pvcglue/templates/denial_of_service.erb +3 -0
- data/lib/pvcglue/templates/deploy.rb.erb +81 -0
- data/lib/pvcglue/templates/gemrc.erb +1 -0
- data/lib/pvcglue/templates/hosts.erb +9 -0
- data/lib/pvcglue/templates/lb.nginx.conf.erb +88 -0
- data/lib/pvcglue/templates/lb.sites-enabled.erb +74 -0
- data/lib/pvcglue/templates/maintenance_mode.erb +46 -0
- data/lib/pvcglue/templates/memcached.conf.erb +55 -0
- data/lib/pvcglue/templates/passenger.list.erb +2 -0
- data/lib/pvcglue/templates/pg_hba.conf.erb +101 -0
- data/lib/pvcglue/templates/postgresql.conf.erb +557 -0
- data/lib/pvcglue/templates/sshd_config.erb +91 -0
- data/lib/pvcglue/templates/stage-deploy.rb.erb +33 -0
- data/lib/pvcglue/templates/timezone.erb +1 -0
- data/lib/pvcglue/templates/ufw.rules.erb +42 -0
- data/lib/pvcglue/templates/ufw.rules6.erb +25 -0
- data/lib/pvcglue/templates/web.bashrc.erb +120 -0
- data/lib/pvcglue/templates/web.env.erb +3 -0
- data/lib/pvcglue/templates/web.nginx.conf.erb +82 -0
- data/lib/pvcglue/templates/web.sites-enabled.erb +8 -0
- data/lib/pvcglue/toml_pvc_dumper.rb +53 -0
- data/lib/pvcglue/version.rb +3 -0
- data/pvcglue.gemspec +33 -0
- metadata +296 -0
@@ -0,0 +1,137 @@
|
|
1
|
+
require 'pp'
|
2
|
+
|
3
|
+
module Pvcglue
|
4
|
+
class Manager < Thor
|
5
|
+
|
6
|
+
desc "bootstrap", "bootstrap"
|
7
|
+
|
8
|
+
def bootstrap
|
9
|
+
Pvcglue::Packages.apply('bootstrap-manager'.to_sym, :manager, self.class.manager_node, 'root', 'manager')
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "push", "push"
|
13
|
+
|
14
|
+
def push
|
15
|
+
Pvcglue::Manager.push_configuration
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "pull", "pull"
|
19
|
+
|
20
|
+
def pull
|
21
|
+
Pvcglue::Packages.apply('manager-pull'.to_sym, :manager, self.class.manager_node, 'pvcglue', 'manager')
|
22
|
+
self.class.clear_cloud_data_cache
|
23
|
+
end
|
24
|
+
|
25
|
+
desc "show", "show manager data"
|
26
|
+
|
27
|
+
def show
|
28
|
+
self.class.initialize_cloud_data
|
29
|
+
pp Pvcglue.cloud.data
|
30
|
+
end
|
31
|
+
|
32
|
+
desc "info", "show manager data"
|
33
|
+
|
34
|
+
def info
|
35
|
+
show
|
36
|
+
end
|
37
|
+
|
38
|
+
desc "s", "run shell"
|
39
|
+
|
40
|
+
def s # `shell` is a Thor reserved word
|
41
|
+
sh
|
42
|
+
end
|
43
|
+
|
44
|
+
desc "shell", "run shell"
|
45
|
+
|
46
|
+
def sh # `shell` is a Thor reserved word
|
47
|
+
working_dir = self.class.manager_dir
|
48
|
+
cloud_manager = Pvcglue.configuration.cloud_manager
|
49
|
+
user_name = self.class.user_name
|
50
|
+
cloud_name = Pvcglue.configuration.cloud_name
|
51
|
+
puts "Connection to #{cloud_name} cloud on manager at (#{cloud_manager}) as user '#{user_name}'..."
|
52
|
+
system(%(ssh #{Pvcglue.cloud.port_in_context(:manager)} -t #{user_name}@#{cloud_manager} "cd #{working_dir} && bash -i"))
|
53
|
+
end
|
54
|
+
|
55
|
+
desc "configure", "configure"
|
56
|
+
|
57
|
+
def configure
|
58
|
+
Pvcglue.configuration.configure_manager
|
59
|
+
end
|
60
|
+
|
61
|
+
# ------------------------------------------------------------------------------------------------------------------
|
62
|
+
|
63
|
+
def self.initialize_cloud_data
|
64
|
+
unless read_cached_cloud_data
|
65
|
+
Pvcglue::Packages.apply('manager-get-config'.to_sym, :manager, manager_node, 'pvcglue', 'manager')
|
66
|
+
# Pvcglue::Packages.apply('manager-get-config'.to_sym, :manager, manager_node, 'pvcglue') # Can not use package as it causes infinite recursion, we'll just do it manually
|
67
|
+
data = `ssh pvcglue@#{manager_node[:manager][:public_ip]} "cat #{Pvcglue::Manager.manager_file_name}"`
|
68
|
+
# puts "*"*80
|
69
|
+
# puts data
|
70
|
+
# puts "*"*80
|
71
|
+
if data.empty?
|
72
|
+
raise(Thor::Error, "Remote manager file not found (or empty): #{::Pvcglue::Manager.manager_file_name}")
|
73
|
+
else
|
74
|
+
::Pvcglue.cloud.data = TOML.parse(data)
|
75
|
+
end
|
76
|
+
write_cloud_data_cache
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.write_cloud_data_cache
|
81
|
+
File.write(Pvcglue.configuration.cloud_cache_file_name, TOML.dump(Pvcglue.cloud.data))
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.read_cached_cloud_data
|
85
|
+
# TODO: Expire cache after given interval
|
86
|
+
if File.exists?(Pvcglue.configuration.cloud_cache_file_name)
|
87
|
+
data = File.read(Pvcglue.configuration.cloud_cache_file_name)
|
88
|
+
Pvcglue.cloud.data = TOML.parse(data)
|
89
|
+
return true
|
90
|
+
end
|
91
|
+
false
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.clear_cloud_data_cache
|
95
|
+
Pvcglue.configuration.clear_cloud_cache
|
96
|
+
end
|
97
|
+
|
98
|
+
def self.manager_node
|
99
|
+
{manager: {public_ip: Pvcglue.configuration.cloud_manager}}
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.cloud_data_file_name_base
|
103
|
+
@file_name_base ||= "#{Pvcglue.configuration.cloud_name}.pvcglue.toml"
|
104
|
+
end
|
105
|
+
|
106
|
+
def self.manager_file_name
|
107
|
+
File.join(manager_dir, cloud_data_file_name_base)
|
108
|
+
end
|
109
|
+
|
110
|
+
def self.user_name
|
111
|
+
'pvcglue'
|
112
|
+
end
|
113
|
+
|
114
|
+
def self.home_dir
|
115
|
+
File.join('/home', user_name)
|
116
|
+
end
|
117
|
+
|
118
|
+
def self.authorized_keys_file_name
|
119
|
+
File.join(ssh_dir, 'authorized_keys')
|
120
|
+
end
|
121
|
+
|
122
|
+
def self.ssh_dir
|
123
|
+
File.join(home_dir, '.ssh')
|
124
|
+
end
|
125
|
+
|
126
|
+
def self.manager_dir
|
127
|
+
File.join(home_dir, '.pvc_manager')
|
128
|
+
end
|
129
|
+
|
130
|
+
def self.push_configuration
|
131
|
+
Pvcglue::Packages.apply('manager-push'.to_sym, :manager, manager_node, 'pvcglue', 'manager')
|
132
|
+
clear_cloud_data_cache
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Pvcglue
|
2
|
+
class Nodes
|
3
|
+
def self.build(roles_filter)
|
4
|
+
Pvcglue::Nodes.new(roles_filter).run
|
5
|
+
end
|
6
|
+
|
7
|
+
def initialize(roles_filter)
|
8
|
+
@roles_filter = roles_filter
|
9
|
+
end
|
10
|
+
|
11
|
+
def apply_role?(role)
|
12
|
+
@roles_filter == 'all' || role == @roles_filter
|
13
|
+
end
|
14
|
+
|
15
|
+
def run
|
16
|
+
puts "This is where it should configure the nodes for #{@roles_filter}. :)"
|
17
|
+
|
18
|
+
%w(lb db web caching).each do |role|
|
19
|
+
if apply_role?(role)
|
20
|
+
Pvcglue::Packages.apply(role.to_sym, :build, Pvcglue.cloud.nodes_in_stage(role))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
Pvcglue::Capistrano.capify
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Pvcglue
|
2
|
+
class Packages
|
3
|
+
def self.apply(package, context, nodes, user = 'deploy', package_filter = nil)
|
4
|
+
# puts nodes.inspect
|
5
|
+
orca_suite = OrcaSuite.init(package_filter)
|
6
|
+
nodes.each do |node, data|
|
7
|
+
orca_node = ::Orca::Node.new(node, data[:public_ip], {user: user, port: Pvcglue.cloud.port_in_context(context)})
|
8
|
+
::Pvcglue.cloud.current_node = {node => data}
|
9
|
+
begin
|
10
|
+
orca_suite.run(orca_node.name, package.to_s, :apply)
|
11
|
+
ensure
|
12
|
+
::Pvcglue.cloud.current_node = nil
|
13
|
+
::Pvcglue.cloud.current_hostname = nil
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class OrcaSuite
|
20
|
+
|
21
|
+
def self.init(package_filter)
|
22
|
+
::Orca.verbose(package_filter != 'manager') # show details for all packages except manager, for now
|
23
|
+
|
24
|
+
# Load orca extensions
|
25
|
+
orca_file = File.join(File.dirname(__FILE__), 'all_the_things.rb')
|
26
|
+
ENV['ORCA_FILE'] = orca_file
|
27
|
+
suite = ::Orca::Suite.new
|
28
|
+
suite.load_file(orca_file)
|
29
|
+
packages_loaded = []
|
30
|
+
|
31
|
+
Dir[File.join(Pvcglue::gem_dir, 'lib', 'pvcglue', 'packages', '*.rb')].each do |file|
|
32
|
+
# package filter is used to load the manager package by itself when stage is not specified
|
33
|
+
next if package_filter && package_filter != File.basename(file, ".rb")
|
34
|
+
begin
|
35
|
+
suite.load_file(file)
|
36
|
+
rescue Exception => e
|
37
|
+
puts "Error loading #{file}: #{e.message}"
|
38
|
+
raise
|
39
|
+
end
|
40
|
+
packages_loaded << File.basename(file, ".rb")
|
41
|
+
end
|
42
|
+
puts "Packages loaded: #{packages_loaded.sort.join(' ')}."
|
43
|
+
suite
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
#=======================================================================================================================
|
2
|
+
package 'bootstrap' do
|
3
|
+
#=======================================================================================================================
|
4
|
+
depends_on 'time-zone'
|
5
|
+
depends_on 'hostname'
|
6
|
+
depends_on 'htop'
|
7
|
+
depends_on 'ufw'
|
8
|
+
depends_on 'applications_dir'
|
9
|
+
depends_on 'authorized_keys'
|
10
|
+
depends_on 'sshd-config'
|
11
|
+
depends_on 'firewall-config'
|
12
|
+
depends_on 'firewall-enabled'
|
13
|
+
depends_on 'unattended-security-upgrades'
|
14
|
+
end
|
15
|
+
|
16
|
+
package 'applications_dir' do
|
17
|
+
depends_on 'deploy-user'
|
18
|
+
validate do
|
19
|
+
stat = run("stat --format=%U:%G:%a #{Pvcglue.configuration.web_app_base_dir}").strip
|
20
|
+
stat == 'deploy:deploy:2755'
|
21
|
+
end
|
22
|
+
|
23
|
+
apply do
|
24
|
+
dir = Pvcglue.configuration.web_app_base_dir
|
25
|
+
# used following as a guide for next line: http://capistranorb.com/documentation/getting-started/authentication-and-authorisation/
|
26
|
+
run "mkdir -p #{dir} && chown deploy:deploy #{dir} && umask 0002 && chmod g+s #{dir}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
package 'deploy-user' do
|
31
|
+
apply do
|
32
|
+
run "mkdir -p ~/.pvc && chmod 600 ~/.pvc"
|
33
|
+
#run 'adduser --disabled-password --gecos "" deploy'
|
34
|
+
run "useradd -d /home/deploy -G sudo -m -U deploy"
|
35
|
+
run "usermod -s /bin/bash deploy"
|
36
|
+
# this next line will also append this every time this is run...which is less than ideal. But it *should* only get run once per server due to the validate method
|
37
|
+
run "echo 'deploy ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers" # this may be a security issue, and need refactoring, see the end of http://capistranorb.com/documentation/getting-started/authentication-and-authorisation/
|
38
|
+
end
|
39
|
+
|
40
|
+
remove do
|
41
|
+
raise "removing user not supported, yet. It needs some 'Are you *really* sure?' stuff."
|
42
|
+
# run "userdel -f deploy"
|
43
|
+
# run "rm -rf /home/deploy"
|
44
|
+
end
|
45
|
+
|
46
|
+
validate do
|
47
|
+
sudo('getent passwd deploy') =~ /^deploy:/ &&
|
48
|
+
sudo('groups deploy') =~ /deploy sudo/
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
package 'authorized_keys' do
|
55
|
+
|
56
|
+
file({
|
57
|
+
:template => ::Pvcglue.template_file_name('authorized_keys.erb'),
|
58
|
+
:destination => '/home/deploy/.ssh/authorized_keys',
|
59
|
+
:create_dirs => true,
|
60
|
+
:permissions => 0644,
|
61
|
+
:user => 'deploy',
|
62
|
+
:group => 'deploy'
|
63
|
+
})
|
64
|
+
end
|
65
|
+
|
66
|
+
package 'sshd-config' do
|
67
|
+
|
68
|
+
file({
|
69
|
+
:template => Pvcglue.template_file_name('sshd_config.erb'),
|
70
|
+
:destination => '/etc/ssh/sshd_config',
|
71
|
+
:create_dirs => false,
|
72
|
+
:permissions => 0644,
|
73
|
+
:user => 'root',
|
74
|
+
:group => 'root'
|
75
|
+
}) { sudo('service ssh restart') }
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
apt_package 'unattended-upgrades'
|
80
|
+
|
81
|
+
package 'unattended-security-upgrades' do
|
82
|
+
depends_on 'unattended-upgrades'
|
83
|
+
file({
|
84
|
+
:template => Pvcglue.template_file_name('20auto-upgrades.erb'),
|
85
|
+
:destination => '/etc/apt/apt.conf.d/20auto-upgrades',
|
86
|
+
:create_dirs => false,
|
87
|
+
:permissions => 0644,
|
88
|
+
:user => 'root',
|
89
|
+
:group => 'root'
|
90
|
+
}) { sudo('service unattended-upgrades restart') }
|
91
|
+
end
|
92
|
+
|
@@ -0,0 +1,80 @@
|
|
1
|
+
package 'env-initialized' do
|
2
|
+
apply do
|
3
|
+
::Pvcglue::Env.initialize_stage_env
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
package 'env-get-stage' do
|
8
|
+
apply do
|
9
|
+
data = run("cat #{::Pvcglue::Env.stage_env_file_name}")
|
10
|
+
::Pvcglue.cloud.stage_env = TOML.parse(data)
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
package 'env-set-stage' do
|
16
|
+
apply do
|
17
|
+
data = TOML.dump(Pvcglue.cloud.stage_env)
|
18
|
+
run(%Q[echo '#{data}' | tee #{::Pvcglue::Env.stage_env_file_name} && chmod 600 #{::Pvcglue::Env.stage_env_file_name}])
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
package 'deploy-to-base' do
|
24
|
+
validate do
|
25
|
+
stat = run("stat --format=%U:%G:%a #{Pvcglue.cloud.deploy_to_app_shared_dir}").strip
|
26
|
+
stat == 'deploy:deploy:2775'
|
27
|
+
end
|
28
|
+
|
29
|
+
apply do
|
30
|
+
# Reference: http://capistranorb.com/documentation/getting-started/authentication-and-authorisation/
|
31
|
+
run "mkdir -p #{Pvcglue.cloud.deploy_to_app_shared_dir}"
|
32
|
+
# sudo "chown deploy:deploy #{ENV['PVC_DEPLOY_TO_BASE']}"
|
33
|
+
run "umask 0002 && chmod g+s #{Pvcglue.cloud.deploy_to_app_shared_dir}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
package 'app-env' do
|
38
|
+
depends_on 'deploy-to-base'
|
39
|
+
depends_on 'app-env-file'
|
40
|
+
end
|
41
|
+
|
42
|
+
package 'app-env-file' do
|
43
|
+
depends_on 'env-initialized'
|
44
|
+
|
45
|
+
file({
|
46
|
+
:template => Pvcglue.template_file_name('web.env.erb'),
|
47
|
+
:destination => Pvcglue.cloud.env_file_name,
|
48
|
+
:create_dirs => true,
|
49
|
+
:permissions => 0640 # TODO: Double check permissions
|
50
|
+
}) do
|
51
|
+
run("touch #{Pvcglue.cloud.restart_txt_file_name}")
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
package 'env-push' do
|
58
|
+
apply do
|
59
|
+
if File.exists?(::Pvcglue.cloud.env_local_file_name)
|
60
|
+
data = File.read(::Pvcglue.cloud.env_local_file_name)
|
61
|
+
run(%Q[echo '#{data}' | tee #{::Pvcglue::Env.stage_env_file_name}])
|
62
|
+
run(%Q[chmod 600 #{::Pvcglue::Env.stage_env_file_name}])
|
63
|
+
else
|
64
|
+
puts "Local env file not found: #{::Pvcglue.cloud.env_local_file_name}"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
package 'env-pull' do
|
70
|
+
apply do
|
71
|
+
data = run("cat #{::Pvcglue::Env.stage_env_file_name}")
|
72
|
+
if data.empty?
|
73
|
+
puts "Remote env file not found: #{::Pvcglue::Env.stage_env_file_name}"
|
74
|
+
else
|
75
|
+
File.write(::Pvcglue.cloud.env_local_file_name, data)
|
76
|
+
puts "Saved as: #{::Pvcglue.cloud.env_local_file_name}"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# Reference: http://manpages.ubuntu.com/manpages/precise/en/man8/ufw-framework.8.html
|
2
|
+
package 'firewall-config' do
|
3
|
+
|
4
|
+
file({
|
5
|
+
:template => Pvcglue.template_file_name('ufw.rules6.erb'),
|
6
|
+
:destination => '/lib/ufw/user6.rules',
|
7
|
+
:create_dirs => false,
|
8
|
+
:permissions => 0640,
|
9
|
+
:user => 'root',
|
10
|
+
:group => 'root'
|
11
|
+
}) { }
|
12
|
+
|
13
|
+
file({
|
14
|
+
:template => Pvcglue.template_file_name('ufw.rules.erb'),
|
15
|
+
:destination => '/lib/ufw/user.rules',
|
16
|
+
:create_dirs => false,
|
17
|
+
:permissions => 0640,
|
18
|
+
:user => 'root',
|
19
|
+
:group => 'root'
|
20
|
+
}) { sudo('service ufw restart') }
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
package 'firewall-enabled' do
|
25
|
+
validate do
|
26
|
+
result = sudo('ufw status verbose')
|
27
|
+
result =~ /Status: active/ && result =~ /Default: deny \(incoming\), allow \(outgoing\)/
|
28
|
+
end
|
29
|
+
|
30
|
+
apply do
|
31
|
+
sudo('ufw --force enable')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# TODO: add command line command for this
|
36
|
+
package 'update-firewall' do
|
37
|
+
# quick update of firewall settings only. Full bootstrap must be performed first.
|
38
|
+
depends_on 'firewall-config'
|
39
|
+
depends_on 'firewall-enabled'
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
# TODO: add command line command for this
|
44
|
+
package 'firewall-status' do
|
45
|
+
apply do
|
46
|
+
run "ufw status verbose"
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'toml'
|
2
|
+
apt_package 'htop'
|
3
|
+
apt_package 'ufw'
|
4
|
+
|
5
|
+
package 'bootstrap-manager' do
|
6
|
+
# TODO: firewall and ssh port config
|
7
|
+
#depends_on 'time-zone'
|
8
|
+
depends_on 'htop'
|
9
|
+
# depends_on 'ufw'
|
10
|
+
#depends_on 'deploy-user'
|
11
|
+
#depends_on 'sshd-config'
|
12
|
+
#depends_on 'firewall-config'
|
13
|
+
depends_on 'pvcglue-user'
|
14
|
+
depends_on 'manager-copy-id'
|
15
|
+
end
|
16
|
+
|
17
|
+
package 'pvcglue-user' do
|
18
|
+
apply do
|
19
|
+
# Local variables used to improve readability of bash commands :)
|
20
|
+
user_name = Pvcglue::Manager.user_name
|
21
|
+
home_dir = Pvcglue::Manager.home_dir
|
22
|
+
manager_dir = Pvcglue::Manager.manager_dir
|
23
|
+
ssh_dir = Pvcglue::Manager.ssh_dir
|
24
|
+
|
25
|
+
sudo "useradd -d #{home_dir} -m -U #{user_name}"
|
26
|
+
sudo "usermod -s /bin/bash #{user_name}"
|
27
|
+
sudo "mkdir -p #{manager_dir} && chown #{user_name}:#{user_name} #{manager_dir} && chmod 700 #{manager_dir}"
|
28
|
+
sudo "mkdir -p #{ssh_dir} && chown #{user_name}:#{user_name} #{ssh_dir} && chmod 700 #{ssh_dir}"
|
29
|
+
end
|
30
|
+
|
31
|
+
remove do
|
32
|
+
raise "removing user not supported, yet. It needs some 'Are you *really* sure?' stuff."
|
33
|
+
# user_name = Pvcglue::Manager.user_name
|
34
|
+
# home_dir = Pvcglue::Manager.home_dir
|
35
|
+
#sudo "userdel -f #{user_name}"
|
36
|
+
#sudo "rm -rf #{home_dir}"
|
37
|
+
end
|
38
|
+
|
39
|
+
validate do
|
40
|
+
user_name = Pvcglue::Manager.user_name
|
41
|
+
# home_dir = Pvcglue::Manager.home_dir
|
42
|
+
#sudo "userdel -f #{user_name}"; sudo "rm -rf #{home_dir}"; raise "User has been deleted"
|
43
|
+
sudo("getent passwd #{user_name}") =~ /^#{user_name}:/
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
package 'manager-copy-id' do
|
48
|
+
validate do
|
49
|
+
authorized_keys_file_name = Pvcglue::Manager.authorized_keys_file_name
|
50
|
+
user_key = `cat ~/.ssh/id_rsa.pub`.strip
|
51
|
+
auth = run("cat #{authorized_keys_file_name}")
|
52
|
+
auth.include?(user_key)
|
53
|
+
end
|
54
|
+
|
55
|
+
apply do
|
56
|
+
authorized_keys_file_name = Pvcglue::Manager.authorized_keys_file_name
|
57
|
+
user_name = Pvcglue::Manager.user_name
|
58
|
+
copy_id = %Q[cat ~/.ssh/id_rsa.pub | ssh #{node.get(:user)}@#{node.host} "cat >> #{authorized_keys_file_name}"]
|
59
|
+
system "#{copy_id}"
|
60
|
+
run(%Q[cat "" >> #{authorized_keys_file_name}])
|
61
|
+
sudo "chown #{user_name}:#{user_name} #{authorized_keys_file_name} && chmod 600 #{authorized_keys_file_name}"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
package 'manager-push' do
|
66
|
+
apply do
|
67
|
+
if File.exists?(::Pvcglue.cloud.local_file_name)
|
68
|
+
data = File.read(::Pvcglue.cloud.local_file_name)
|
69
|
+
run(%Q[echo '#{data}' | tee #{::Pvcglue::Manager.manager_file_name}])
|
70
|
+
run(%Q[chmod 600 #{::Pvcglue::Manager.manager_file_name}])
|
71
|
+
else
|
72
|
+
puts "Local file not found: #{::Pvcglue.cloud.local_file_name}"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
package 'manager-pull' do
|
78
|
+
apply do
|
79
|
+
data = run("cat #{::Pvcglue::Manager.manager_file_name}")
|
80
|
+
if data.empty?
|
81
|
+
puts "Remote manager file not found: #{::Pvcglue::Manager.manager_file_name}"
|
82
|
+
else
|
83
|
+
File.write(::Pvcglue.cloud.local_file_name, data)
|
84
|
+
puts "Saved as: #{::Pvcglue.cloud.local_file_name}"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
package 'manager-get-config' do
|
90
|
+
apply do
|
91
|
+
data = run("cat #{::Pvcglue::Manager.manager_file_name}")
|
92
|
+
#puts "*"*80
|
93
|
+
#puts data
|
94
|
+
#puts "*"*80
|
95
|
+
if data.empty?
|
96
|
+
raise "Remote manager file not found: #{::Pvcglue::Manager.manager_file_name}"
|
97
|
+
else
|
98
|
+
::Pvcglue.cloud.data = TOML.parse(data)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|