dust-deploy 0.12.2 → 0.13.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.
- data/bin/dust +192 -66
- data/changelog.md +37 -0
- data/lib/dust.rb +1 -0
- data/lib/dust/messaging.rb +140 -0
- data/lib/dust/recipe.rb +4 -1
- data/lib/dust/recipes/aliases.rb +5 -5
- data/lib/dust/recipes/apt.rb +4 -4
- data/lib/dust/recipes/cjdroute.rb +32 -35
- data/lib/dust/recipes/cups_client.rb +5 -5
- data/lib/dust/recipes/debsecan.rb +4 -4
- data/lib/dust/recipes/duplicity.rb +13 -15
- data/lib/dust/recipes/etc_hosts.rb +3 -3
- data/lib/dust/recipes/hash_check.rb +5 -6
- data/lib/dust/recipes/iptables.rb +12 -17
- data/lib/dust/recipes/limits.rb +19 -11
- data/lib/dust/recipes/locale.rb +14 -14
- data/lib/dust/recipes/logrotate.rb +3 -3
- data/lib/dust/recipes/make.rb +29 -0
- data/lib/dust/recipes/motd.rb +3 -3
- data/lib/dust/recipes/mysql.rb +5 -5
- data/lib/dust/recipes/newrelic.rb +6 -6
- data/lib/dust/recipes/nginx.rb +10 -10
- data/lib/dust/recipes/ntpd.rb +2 -6
- data/lib/dust/recipes/pacemaker.rb +3 -3
- data/lib/dust/recipes/postgres.rb +22 -22
- data/lib/dust/recipes/rc_local.rb +8 -8
- data/lib/dust/recipes/redis.rb +3 -25
- data/lib/dust/recipes/repositories.rb +28 -30
- data/lib/dust/recipes/resolv_conf.rb +16 -16
- data/lib/dust/recipes/ruby_rvm.rb +17 -18
- data/lib/dust/recipes/skel.rb +1 -2
- data/lib/dust/recipes/ssh_authorized_keys.rb +4 -5
- data/lib/dust/recipes/sshd.rb +1 -1
- data/lib/dust/recipes/sudoers.rb +2 -2
- data/lib/dust/recipes/sysctl.rb +12 -8
- data/lib/dust/recipes/zabbix_agent.rb +28 -28
- data/lib/dust/server.rb +114 -115
- data/lib/dust/version.rb +1 -1
- metadata +4 -2
data/lib/dust/recipes/redis.rb
CHANGED
@@ -3,18 +3,17 @@ class Redis < Recipe
|
|
3
3
|
def deploy
|
4
4
|
@node.install_package 'redis-server'
|
5
5
|
@node.write '/etc/redis/redis.conf', generate_redis_conf
|
6
|
-
configure_sysctl
|
7
6
|
@node.restart_service 'redis-server' if @options.restart
|
8
7
|
end
|
9
8
|
|
10
9
|
desc 'redis:status', 'displays redis-cli info'
|
11
10
|
def status
|
12
11
|
return false unless @node.package_installed? 'redis-server'
|
13
|
-
|
12
|
+
msg = @node.messages.add('running "redis-cli info"')
|
14
13
|
ret = @node.exec 'redis-cli info'
|
15
|
-
|
14
|
+
msg.parse_result(ret[:exit_code])
|
16
15
|
|
17
|
-
|
16
|
+
@node.messages.add(ret[:stdout], :indent => 0) unless ret[:stdout].empty?
|
18
17
|
end
|
19
18
|
|
20
19
|
|
@@ -71,25 +70,4 @@ class Redis < Recipe
|
|
71
70
|
|
72
71
|
redis_conf
|
73
72
|
end
|
74
|
-
|
75
|
-
# redis complains if vm.overcommit_memory != 1
|
76
|
-
def configure_sysctl
|
77
|
-
if @node.uses_apt?
|
78
|
-
::Dust.print_msg "setting redis sysctl keys\n"
|
79
|
-
|
80
|
-
::Dust.print_msg 'setting overcommit memory to 1', :indent => 2
|
81
|
-
::Dust.print_result @node.exec('sysctl -w vm.overcommit_memory=1')[:exit_code]
|
82
|
-
::Dust.print_msg 'setting swappiness to 0', :indent => 2
|
83
|
-
::Dust.print_result @node.exec('sysctl -w vm.swappiness=0')[:exit_code]
|
84
|
-
|
85
|
-
file = ''
|
86
|
-
file << "vm.overcommit_memory=1\n"
|
87
|
-
file << "vm.swappiness=0\n"
|
88
|
-
|
89
|
-
@node.write "/etc/sysctl.d/30-redis.conf", file
|
90
|
-
|
91
|
-
else
|
92
|
-
::Dust.print_warning 'sysctl configuration not supported for your os'
|
93
|
-
end
|
94
|
-
end
|
95
73
|
end
|
@@ -5,22 +5,21 @@ class Repositories < Recipe
|
|
5
5
|
|
6
6
|
delete_old_repositories
|
7
7
|
deploy_repositories
|
8
|
-
|
8
|
+
|
9
9
|
# fetch new stuff
|
10
|
-
|
11
|
-
@node.update_repos if options.restart? or options.reload?
|
10
|
+
@node.update_repos if options.restart? or options.reload?
|
12
11
|
end
|
13
|
-
|
14
|
-
|
12
|
+
|
13
|
+
|
15
14
|
private
|
16
|
-
|
15
|
+
|
17
16
|
# deletes all .list files under /etc/apt/sources.list.d
|
18
17
|
def delete_old_repositories
|
19
|
-
|
18
|
+
msg = @node.messages.add('deleting old repositories')
|
20
19
|
@node.rm '/etc/apt/sources.list.d/*.list', :quiet => true if @node.uses_apt?
|
21
|
-
|
20
|
+
msg.ok
|
22
21
|
end
|
23
|
-
|
22
|
+
|
24
23
|
def deploy_repositories
|
25
24
|
@config.each do |name, repo|
|
26
25
|
|
@@ -28,16 +27,16 @@ class Repositories < Recipe
|
|
28
27
|
repo = {} unless repo.is_a? Hash
|
29
28
|
|
30
29
|
merge_with_default_settings repo
|
31
|
-
|
30
|
+
|
32
31
|
# the default repository in /etc/apt/sources.list (debian)
|
33
32
|
if name == 'default'
|
34
|
-
|
35
|
-
sources = generate_default_repo repo
|
36
|
-
|
33
|
+
msg = @node.messages.add('deploying default repository' )
|
34
|
+
sources = generate_default_repo repo
|
35
|
+
msg.parse_result(@node.write('/etc/apt/sources.list', sources, :quiet => true) )
|
37
36
|
else
|
38
|
-
|
37
|
+
msg = @node.messages.add("adding repository '#{name}' to sources" )
|
39
38
|
sources = generate_repo repo
|
40
|
-
|
39
|
+
msg.parse_result(@node.write("/etc/apt/sources.list.d/#{name}.list", sources, :quiet => true) )
|
41
40
|
add_repo_key name, repo
|
42
41
|
end
|
43
42
|
end
|
@@ -48,20 +47,20 @@ class Repositories < Recipe
|
|
48
47
|
# setting defaults
|
49
48
|
repo['url'] ||= 'http://ftp.debian.org/debian/' if @node.is_debian?
|
50
49
|
repo['url'] ||= 'http://archive.ubuntu.com/ubuntu/' if @node.is_ubuntu?
|
51
|
-
|
50
|
+
|
52
51
|
repo['release'] ||= @node['lsbdistcodename']
|
53
52
|
repo['components'] ||= 'main'
|
54
|
-
|
53
|
+
|
55
54
|
# ||= doesn't work for booleans
|
56
55
|
repo['source'] = repo['source'].nil? ? true : repo['source']
|
57
56
|
repo['binary'] = repo['binary'].nil? ? true : repo['binary']
|
58
|
-
end
|
59
|
-
|
57
|
+
end
|
58
|
+
|
60
59
|
def generate_default_repo repo
|
61
60
|
sources = ''
|
62
61
|
sources << "deb #{repo['url']} #{repo['release']} #{repo['components']}\n"
|
63
62
|
sources << "deb-src #{repo['url']} #{repo['release']} #{repo['components']}\n\n"
|
64
|
-
|
63
|
+
|
65
64
|
# security
|
66
65
|
if @node.is_debian?
|
67
66
|
sources << "deb http://security.debian.org/ #{repo['release']}/updates #{repo['components']}\n"
|
@@ -70,17 +69,17 @@ class Repositories < Recipe
|
|
70
69
|
sources << "deb http://security.ubuntu.com/ubuntu/ #{repo['release']}-security #{repo['components']}\n"
|
71
70
|
sources << "deb-src http://security.ubuntu.com/ubuntu/ #{repo['release']}-security #{repo['components']}\n\n"
|
72
71
|
end
|
73
|
-
|
72
|
+
|
74
73
|
# updates
|
75
74
|
sources << "deb #{repo['url']} #{repo['release']}-updates #{repo['components']}\n"
|
76
75
|
sources << "deb-src #{repo['url']} #{repo['release']}-updates #{repo['components']}\n\n"
|
77
|
-
|
76
|
+
|
78
77
|
# proposed
|
79
78
|
if @node.is_ubuntu?
|
80
79
|
sources << "deb #{repo['url']} #{repo['release']}-proposed #{repo['components']}\n"
|
81
80
|
sources << "deb-src #{repo['url']} #{repo['release']}-proposed #{repo['components']}\n\n"
|
82
81
|
end
|
83
|
-
|
82
|
+
|
84
83
|
# backports is enabled per default in ubuntu oneiric
|
85
84
|
if @node.is_ubuntu?
|
86
85
|
sources << "deb #{repo['url']} #{repo['release']}-backports #{repo['components']}\n"
|
@@ -89,7 +88,7 @@ class Repositories < Recipe
|
|
89
88
|
|
90
89
|
sources
|
91
90
|
end
|
92
|
-
|
91
|
+
|
93
92
|
def generate_repo repo
|
94
93
|
# add url to sources.list
|
95
94
|
sources = ''
|
@@ -99,28 +98,27 @@ class Repositories < Recipe
|
|
99
98
|
end
|
100
99
|
sources
|
101
100
|
end
|
102
|
-
|
101
|
+
|
103
102
|
def add_repo_key name, repo
|
104
103
|
# add the repository key
|
105
104
|
if repo['key']
|
106
|
-
|
105
|
+
msg = @node.messages.add("adding #{name} repository key")
|
107
106
|
|
108
107
|
# if the key is a .deb, download and install it
|
109
108
|
if repo['key'].match /\.deb$/
|
110
109
|
ret = @node.exec 'mktemp --tmpdir dust.XXXXXXXXXX'
|
111
110
|
if ret[:exit_code] != 0
|
112
|
-
|
113
|
-
::Dust.print_failed 'could not create temporary file on server'
|
111
|
+
msg.failed('could not create temporary file on server')
|
114
112
|
return false
|
115
113
|
end
|
116
114
|
|
117
115
|
tmpfile = ret[:stdout].chomp
|
118
116
|
|
119
|
-
|
117
|
+
msg.parse_result(@node.exec("wget -q -O #{tmpfile} '#{repo['key']}' && dpkg -i #{tmpfile}")[:exit_code])
|
120
118
|
|
121
119
|
# if not, just download and add the key
|
122
120
|
else
|
123
|
-
|
121
|
+
msg.parse_result(@node.exec("wget -q -O- '#{repo['key']}' |apt-key add -")[:exit_code])
|
124
122
|
end
|
125
123
|
end
|
126
124
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class ResolvConf < Recipe
|
2
2
|
desc 'resolv_conf:deploy', 'configures /etc/resolv.conf'
|
3
|
-
def deploy
|
4
|
-
|
3
|
+
def deploy
|
4
|
+
msg = @node.messages.add("configuring resolv.conf\n")
|
5
5
|
|
6
6
|
# if config is just true, create empty hash and use defaults
|
7
7
|
@config = {} unless @config.is_a? Hash
|
@@ -13,37 +13,37 @@ class ResolvConf < Recipe
|
|
13
13
|
|
14
14
|
# configures whether daily reports are sent
|
15
15
|
if @config['search']
|
16
|
-
|
16
|
+
msg = @node.messages.add("adding search #{@config['search']}", :indent => 2)
|
17
17
|
config_file << "search #{@config['search']}\n"
|
18
|
-
|
18
|
+
msg.ok
|
19
19
|
end
|
20
20
|
|
21
21
|
if @config['domain']
|
22
|
-
|
22
|
+
msg = @node.messages.add("adding domain #{@config['domain']}", :indent => 2)
|
23
23
|
config_file << "domain #{@config['domain']}\n"
|
24
|
-
|
24
|
+
msg.ok
|
25
25
|
end
|
26
26
|
|
27
27
|
if @config['options']
|
28
|
-
|
28
|
+
msg = @node.messages.add("adding options #{@config['options']}", :indent => 2)
|
29
29
|
config_file << "options #{@config['options']}\n"
|
30
|
-
|
30
|
+
msg.ok
|
31
31
|
end
|
32
32
|
|
33
33
|
@config['nameservers'].each do |nameserver|
|
34
|
-
|
34
|
+
msg = @node.messages.add("adding nameserver #{nameserver}", :indent => 2)
|
35
35
|
config_file << "nameserver #{nameserver}\n"
|
36
|
-
|
36
|
+
msg.ok
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
@node.write '/etc/resolv.conf', config_file
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
desc 'resolv_conf:status', 'shows current /etc/resolv.conf'
|
43
43
|
def status
|
44
|
-
|
44
|
+
msg = @node.messages.add('getting /etc/resolv.conf')
|
45
45
|
ret = @node.exec 'cat /etc/resolv.conf'
|
46
|
-
|
47
|
-
|
48
|
-
end
|
46
|
+
msg.parse_result(ret[:exit_code])
|
47
|
+
msg.print_output(ret)
|
48
|
+
end
|
49
49
|
end
|
@@ -2,7 +2,7 @@ class RubyRvm < Recipe
|
|
2
2
|
desc 'ruby_rvm:deploy', 'installs rvm and ruby for a user'
|
3
3
|
def deploy
|
4
4
|
# TODO: rvm only works if your user uses bash/zsh as login shell, check
|
5
|
-
|
5
|
+
|
6
6
|
# dependency needed by rvm
|
7
7
|
return unless @node.install_package 'bash'
|
8
8
|
return unless @node.install_package 'curl'
|
@@ -30,7 +30,7 @@ class RubyRvm < Recipe
|
|
30
30
|
|
31
31
|
@config.each do |user, version|
|
32
32
|
unless @node.user_exists? user, :quiet => true
|
33
|
-
|
33
|
+
@node.messages.add("user #{user} doesn't exist. skipping").warning
|
34
34
|
next
|
35
35
|
end
|
36
36
|
|
@@ -41,14 +41,14 @@ class RubyRvm < Recipe
|
|
41
41
|
return unless set_default user, version
|
42
42
|
end
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
desc 'ruby_rvm:status', 'shows current ruby version'
|
46
46
|
def status
|
47
47
|
@config.each do |user, version|
|
48
|
-
|
48
|
+
msg = @node.messages.add("getting current ruby-version for user #{user}")
|
49
49
|
ret = @node.exec 'rvm use', :as_user => user
|
50
|
-
|
51
|
-
|
50
|
+
msg.parse_result(ret[:exit_code])
|
51
|
+
msg.print_output(ret)
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
@@ -58,31 +58,30 @@ class RubyRvm < Recipe
|
|
58
58
|
def install_rvm user
|
59
59
|
# check if rvm is already installed
|
60
60
|
if @node.exec('which rvm', :as_user => user)[:exit_code] == 0
|
61
|
-
|
62
|
-
return
|
61
|
+
msg = @node.messages.add("updating rvm for user #{user}")
|
62
|
+
return msg.parse_result(@node.exec('rvm get latest', :as_user => user)[:exit_code])
|
63
63
|
|
64
64
|
else
|
65
|
-
|
66
|
-
return
|
67
|
-
:as_user => user)[:exit_code]
|
65
|
+
msg = @node.messages.add("installing rvm for user #{user}")
|
66
|
+
return msg.parse_result(@node.exec("curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer |bash -s stable", :as_user => user)[:exit_code])
|
68
67
|
end
|
69
68
|
end
|
70
69
|
|
71
70
|
def install_ruby user, version
|
72
71
|
return true if installed? user, version
|
73
|
-
|
74
|
-
|
72
|
+
msg = @node.messages.add("downloading, compiling and installing ruby-#{version}")
|
73
|
+
msg.parse_result( @node.exec("rvm install ruby-#{version}", :as_user => user)[:exit_code])
|
75
74
|
end
|
76
75
|
|
77
76
|
def set_default user, version
|
78
|
-
|
79
|
-
|
77
|
+
msg = @node.messages.add("setting ruby-#{version} as default")
|
78
|
+
msg.parse_result(@node.exec("rvm use ruby-#{version} --default", :as_user => user)[:exit_code])
|
80
79
|
end
|
81
80
|
|
82
81
|
def installed? user, version
|
83
82
|
ret = @node.exec "rvm list |grep ruby-#{version}", :as_user => user
|
84
83
|
if ret[:exit_code] == 0
|
85
|
-
return
|
84
|
+
return @node.messages.add("ruby-#{version} for user #{user} already installed").ok
|
86
85
|
end
|
87
86
|
false
|
88
87
|
end
|
@@ -92,8 +91,8 @@ class RubyRvm < Recipe
|
|
92
91
|
shell = @node.get_shell user
|
93
92
|
return true if shell == '/bin/zsh' or shell == '/bin/bash'
|
94
93
|
|
95
|
-
|
96
|
-
|
94
|
+
msg = @node.messages.add("changing shell for #{user} to /bin/bash")
|
95
|
+
msg.parse_result(@node.exec("chsh -s /bin/bash #{user}")[:exit_code])
|
97
96
|
end
|
98
97
|
|
99
98
|
def create_homedir user
|
data/lib/dust/recipes/skel.rb
CHANGED
@@ -2,12 +2,11 @@ class Skel < Recipe
|
|
2
2
|
desc 'skel:deploy', 'copy default configuration files to users home directory'
|
3
3
|
def deploy
|
4
4
|
@config.to_array.each do |user|
|
5
|
-
|
5
|
+
@node.messages.add("deploying homedir skeleton for #{user}\n")
|
6
6
|
Dir["#{@template_path}/.*"].each do |file|
|
7
7
|
next unless File.file? file
|
8
8
|
@node.deploy_file file, "/#{@node.get_home user}/#{File.basename file}", { :binding => binding, :indent => 2 }
|
9
9
|
end
|
10
|
-
puts
|
11
10
|
end
|
12
11
|
end
|
13
12
|
end
|
@@ -5,10 +5,9 @@ class SshAuthorizedKeys < Recipe
|
|
5
5
|
def deploy
|
6
6
|
|
7
7
|
@config.each do |remote_user, ssh_users|
|
8
|
-
|
8
|
+
@node.messages.add("generating authorized_keys for #{remote_user}\n")
|
9
9
|
authorized_keys = generate_authorized_keys ssh_users
|
10
10
|
deploy_authorized_keys remote_user, authorized_keys
|
11
|
-
puts
|
12
11
|
end
|
13
12
|
end
|
14
13
|
|
@@ -23,14 +22,14 @@ class SshAuthorizedKeys < Recipe
|
|
23
22
|
# create the authorized_keys hash for this user
|
24
23
|
ssh_users.to_array.each do |ssh_user|
|
25
24
|
users[ssh_user]['name'] ||= ssh_user
|
26
|
-
|
25
|
+
msg = @node.messages.add("adding user #{users[ssh_user]['name']}", :indent => 2)
|
27
26
|
users[ssh_user]['keys'].each do |key|
|
28
27
|
authorized_keys << "#{key}"
|
29
28
|
authorized_keys << " #{users[ssh_user]['name']}" if users[ssh_user]['name']
|
30
29
|
authorized_keys << " <#{users[ssh_user]['email']}>" if users[ssh_user]['email']
|
31
30
|
authorized_keys << "\n"
|
32
31
|
end
|
33
|
-
|
32
|
+
msg.ok
|
34
33
|
end
|
35
34
|
|
36
35
|
authorized_keys
|
@@ -57,7 +56,7 @@ class SshAuthorizedKeys < Recipe
|
|
57
56
|
# TODO: add this option
|
58
57
|
def cleanup
|
59
58
|
if options.cleanup?
|
60
|
-
|
59
|
+
@node.messages.add("deleting other authorized_keys files\n")
|
61
60
|
@node.get_system_users(:quiet => true).each do |user|
|
62
61
|
next if users.keys.include? user
|
63
62
|
home = @node.get_home user
|
data/lib/dust/recipes/sshd.rb
CHANGED
@@ -81,7 +81,7 @@ class Sshd < Recipe
|
|
81
81
|
def check_hostkeys
|
82
82
|
@config['HostKey'].each do |hostkey|
|
83
83
|
unless @node.file_exists? hostkey, :quiet => true
|
84
|
-
|
84
|
+
@node.messages.add("hostkey '#{hostkey}' not found. removing from config").warning
|
85
85
|
@config['HostKey'].delete hostkey
|
86
86
|
end
|
87
87
|
end
|
data/lib/dust/recipes/sudoers.rb
CHANGED
@@ -6,7 +6,7 @@ class Sudoers < Recipe
|
|
6
6
|
remove_rules
|
7
7
|
|
8
8
|
@config.each do |name, rule|
|
9
|
-
|
9
|
+
@node.messages.add("deploying sudo rules '#{name}'\n")
|
10
10
|
|
11
11
|
# rulename: 'myrule'
|
12
12
|
if rule.is_a? String
|
@@ -15,7 +15,7 @@ class Sudoers < Recipe
|
|
15
15
|
# rulename: { user: [ user1, user2 ], command: [ cmd1, cmd2 ] }
|
16
16
|
else
|
17
17
|
unless rule['user'] and rule['command']
|
18
|
-
|
18
|
+
@node.messages.add('user or command missing', :indent => 2).failed
|
19
19
|
next
|
20
20
|
end
|
21
21
|
|
data/lib/dust/recipes/sysctl.rb
CHANGED
@@ -3,7 +3,7 @@ class Sysctl < Recipe
|
|
3
3
|
def deploy
|
4
4
|
# we need support for /etc/sysctl.d/
|
5
5
|
unless @node.dir_exists? '/etc/sysctl.d/'
|
6
|
-
return
|
6
|
+
return @node.messages.add('sysctl configuration not supported for your linux distribution').warning
|
7
7
|
end
|
8
8
|
|
9
9
|
# seperate templates from sysctls
|
@@ -13,14 +13,13 @@ class Sysctl < Recipe
|
|
13
13
|
# apply template sysctls
|
14
14
|
if templates
|
15
15
|
templates.to_array.each do |template|
|
16
|
-
|
16
|
+
@node.messages.add("configuring sysctls for template #{template}\n")
|
17
17
|
apply template, self.send(template)
|
18
|
-
puts
|
19
18
|
end
|
20
19
|
end
|
21
20
|
|
22
21
|
# apply plain sysctls
|
23
|
-
|
22
|
+
@node.messages.add("configuring plain sysctls\n")
|
24
23
|
apply 'dust', sysctls
|
25
24
|
end
|
26
25
|
|
@@ -30,13 +29,13 @@ class Sysctl < Recipe
|
|
30
29
|
def apply name, sysctl
|
31
30
|
sysctl_conf = ''
|
32
31
|
sysctl.each do |key, value|
|
33
|
-
|
34
|
-
|
32
|
+
msg = @node.messages.add("setting #{key} = #{value}", :indent => 2)
|
33
|
+
msg.parse_result(@node.exec("sysctl -w #{key}=#{value}")[:exit_code])
|
35
34
|
sysctl_conf << "#{key} = #{value}\n"
|
36
35
|
end
|
37
36
|
|
38
|
-
|
39
|
-
|
37
|
+
msg = @node.messages.add("saving settings to /etc/sysctl.d/10-#{name}.conf", :indent => 2)
|
38
|
+
msg.parse_result(@node.write("/etc/sysctl.d/10-#{name}.conf", sysctl_conf, :quiet => true))
|
40
39
|
end
|
41
40
|
|
42
41
|
|
@@ -47,6 +46,11 @@ class Sysctl < Recipe
|
|
47
46
|
database.merge 'vm.overcommit_memory' => 2
|
48
47
|
end
|
49
48
|
|
49
|
+
# redis complains if vm.overcommit_memory != 1
|
50
|
+
def redis
|
51
|
+
{ 'vm.overcommit_memory' => 1, 'vm.swappiness' => 0 }
|
52
|
+
end
|
53
|
+
|
50
54
|
def mysql
|
51
55
|
database
|
52
56
|
end
|