teknobingo-recipes 0.1.39

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.
Files changed (41) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +3 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE +1 -0
  5. data/README.rdoc +18 -0
  6. data/Rakefile +2 -0
  7. data/lib/teknobingo_recipes.rb +1 -0
  8. data/lib/teknobingo_recipes/helpers.rb +67 -0
  9. data/lib/teknobingo_recipes/recipes/apache.rb +62 -0
  10. data/lib/teknobingo_recipes/recipes/base.rb +16 -0
  11. data/lib/teknobingo_recipes/recipes/check.rb +13 -0
  12. data/lib/teknobingo_recipes/recipes/logrotate.rb +9 -0
  13. data/lib/teknobingo_recipes/recipes/memcached.rb +24 -0
  14. data/lib/teknobingo_recipes/recipes/mogilefs.rb +146 -0
  15. data/lib/teknobingo_recipes/recipes/nfs.rb +99 -0
  16. data/lib/teknobingo_recipes/recipes/nginx.rb +75 -0
  17. data/lib/teknobingo_recipes/recipes/nodejs.rb +15 -0
  18. data/lib/teknobingo_recipes/recipes/passenger.rb +68 -0
  19. data/lib/teknobingo_recipes/recipes/postgresql.rb +44 -0
  20. data/lib/teknobingo_recipes/recipes/profile.rb +43 -0
  21. data/lib/teknobingo_recipes/recipes/rainbows.rb +83 -0
  22. data/lib/teknobingo_recipes/recipes/rbenv.rb +40 -0
  23. data/lib/teknobingo_recipes/recipes/redis.rb +31 -0
  24. data/lib/teknobingo_recipes/version.rb +3 -0
  25. data/teknobingo-recipes.gemspec +27 -0
  26. data/templates/bash/lesslog.sh +1 -0
  27. data/templates/bash/profile +1 -0
  28. data/templates/bash/prompt.sh +13 -0
  29. data/templates/bash/railsc.sh +1 -0
  30. data/templates/bash/taillog.sh +1 -0
  31. data/templates/init.d/nginx +362 -0
  32. data/templates/logrotate.erb +14 -0
  33. data/templates/memcached.erb +16 -0
  34. data/templates/mogilefsd_conf.erb +7 -0
  35. data/templates/mogstored_conf.erb +3 -0
  36. data/templates/nginx.conf.erb +23 -0
  37. data/templates/passenger_mod.erb +3 -0
  38. data/templates/postgresql.yml.erb +8 -0
  39. data/templates/redis_conf.erb +419 -0
  40. data/templates/vhosts/http_site.erb +7 -0
  41. metadata +98 -0
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZTUwOGEwMTIxMDkxYTA4NmIwM2IwZWI1MWFjMmMxNzk0NmJlNWYxNA==
5
+ data.tar.gz: !binary |-
6
+ Yjc4ZTk5NTIxZTYwOGMxNDViNDMwODU3N2FmM2QzNmI2Mjg4NWNmMg==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ OGUxZjkxMzk5N2JlYjAwNzQyM2MxMTZhNTg2NTI2MDJkNWMxNDMxMWI2NDYy
10
+ NmRkMzZhNGIxMDc1NDY2MzljZmEzMWJhNDkwMDMyODlkZTkxNTc3Y2NiMWRk
11
+ MDYxNTljMGMzYzRkMjU2Yzk1ZjNjNzZmZmNmOTNmYTE5ZTkwYWI=
12
+ data.tar.gz: !binary |-
13
+ ZmE5YjUwZWRmNDEwYThjM2YxOThlODA0NmI0MTU4ZDkzYzlhNmQ1OGI0N2Yx
14
+ OTFkNTI2NTQ1Mzk0MGFjM2FjODk0OWY2MWYyM2Y5ZDdjMjk5NjNmYWI2Y2Zi
15
+ YmNkZTk4YjcyZTI1MzczMjc4ZWI5ZGQ3OTg3OTIyYjA0NjliNzg=
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+ gemspec
3
+
4
+ gem 'rake'
data/LICENSE ADDED
@@ -0,0 +1 @@
1
+ Copyright (c) 20013 Teknobingo AS
data/README.rdoc ADDED
@@ -0,0 +1,18 @@
1
+ =Teknobingo Recipes
2
+
3
+ Useful Capistrano recipes
4
+
5
+ ==Installation
6
+
7
+ Gemfile:
8
+ gem 'teknobingo-recipes', :git => 'git@github.com:teknobingo/teknobingo-recipes.git', :branch => 'master'
9
+
10
+ To setup the initial Capistrano deploy file, go to your Rails app folder via command line and enter:
11
+
12
+ capify .
13
+
14
+ ==Configuration
15
+
16
+ In deploy.rb
17
+ require 'teknobingo_recipes'
18
+ include_recipes :nginx, :rbenv, :passenger
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler/setup'
2
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1 @@
1
+ require 'teknobingo_recipes/helpers'
@@ -0,0 +1,67 @@
1
+ def set_default(name, *args, &block)
2
+ set(name, *args, &block) unless exists?(name)
3
+ end
4
+
5
+ def copy_file(from,to,options={})
6
+ tmpname = '/tmp/knutervrang'
7
+ fname = ["../config/recipes/#{stage}/#{from}", "../config/recipes/#{from}", "#{Gem.loaded_specs['teknobingo-recipes'].full_gem_path}/lib/recipes/#{from}"].keep_if do |path|
8
+ fname = File.expand_path(path, ENV['BUNDLE_GEMFILE'])
9
+ fname if File.exists? fname
10
+ end.first
11
+ put File.read(File.expand_path(fname, ENV['BUNDLE_GEMFILE'])), tmpname, options
12
+ run "#{sudo} mv #{tmpname} #{to}"
13
+ end
14
+
15
+ def remote_file_exists?(full_path)
16
+ 'true' == capture("if [ -e #{full_path} ]; then echo 'true'; fi").strip
17
+ end
18
+
19
+ def template(from, to)
20
+ fname = ["../config/recipes/templates/#{stage}/#{from}", "../config/recipes/templates/#{from}", "#{Gem.loaded_specs['teknobingo-recipes'].full_gem_path}/templates/#{from}"].keep_if do |path|
21
+ fname = File.expand_path(path, ENV['BUNDLE_GEMFILE'])
22
+ fname if File.exists? fname
23
+ end.first
24
+ fname = File.expand_path(fname, ENV['BUNDLE_GEMFILE'])
25
+ erb = File.read(fname)
26
+ put ERB.new(erb).result(binding), to
27
+ end
28
+
29
+ def has_servers?(options)
30
+ find_servers(options).size > 0
31
+ end
32
+
33
+ alias has_server? has_servers?
34
+
35
+ # Add text to fil unless it is already there
36
+ def sudo_enrich_file(filename, content, search_expr = nil)
37
+ content = content.gsub("'", "'\\\\''").gsub("\n", '\n')
38
+ search_expr ||= content
39
+ run "#{sudo} sh -c \"[ -e '#{filename}' ] || touch '#{filename}'\""
40
+ run "#{sudo} sh -c \"if grep -q '#{search_expr}' #{filename}; then echo ok; else echo '#{content}' >> #{filename}; fi\""
41
+ end
42
+ def enrich_file(filename, content, search_expr = nil)
43
+ content = content.gsub("'", "'\\\\''").gsub("\n", '\n')
44
+ search_expr ||= content
45
+ run "[ -e '#{filename}' ] || touch '#{filename}'"
46
+ run "if grep -q '#{search_expr}' #{filename}; then echo ok; else echo '#{content}' >> #{filename}; fi"
47
+ end
48
+
49
+ def replace_line_in_file(filename, search_expr, new_line)
50
+ search_expr = search_expr.gsub("'", "'\\\\''").gsub("\n", '\n')
51
+ new_line = new_line.gsub("'", "'\\\\''").gsub("\n", '\n')
52
+ run "#{sudo} cp '#{filename}' '#{filename}.bak'" # keep permissions
53
+ run "#{sudo} sh -c \"sed 's/^#{search_expr}$/#{new_line}/' < '#{filename}.bak' > '#{filename}'\""
54
+ run "#{sudo} rm '#{filename}.bak'"
55
+ end
56
+
57
+ module Capistrano
58
+ class Configuration
59
+ module Loading
60
+ def include_recipes *recipes
61
+ recipes.each do |recipe|
62
+ load "#{Gem.loaded_specs['teknobingo-recipes'].full_gem_path}/lib/teknobingo_recipes/recipes/#{recipe}.rb"
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,62 @@
1
+ set_default :web_server, :apache
2
+
3
+ namespace :apache do
4
+
5
+ def passenger_root
6
+ @passenger_root ||= begin
7
+ state = nil
8
+ passenger_version = nil
9
+ passenger_root = nil
10
+ run "gem list",:pty => true do |ch, stream, data|
11
+ if /passenger \((?<version>.*)\)$/ =~ data
12
+ passenger_version = version
13
+ end
14
+ end
15
+ run "gem environment",:pty => true do |ch, stream, data|
16
+ state = nil if data[-1] == ':'
17
+ if data =~ /GEM PATHS:/
18
+ state = :gems
19
+ elsif !passenger_root && state == :gems
20
+ path = data.split(' - ').last.strip
21
+ if path && path != ""
22
+ puts path.inspect
23
+ if remote_file_exists?("#{path}/gems/passenger-#{passenger_version}/buildout/apache2/mod_passenger.so")
24
+ passenger_root = "#{path}/gems/passenger-#{passenger_version}"
25
+ end
26
+ end
27
+ end
28
+ end
29
+ passenger_root
30
+ end
31
+ end
32
+
33
+ desc "Install apache"
34
+ task :install, roles: :web do
35
+ run "#{sudo} apt-get install -y apache2 apache2.2-common apache2-mpm-prefork apache2-utils libexpat1 apache2-prefork-dev ssl-cert libapache2-mod-xsendfile"
36
+ run "#{sudo} a2enmod rewrite"
37
+ run "#{sudo} a2enmod ssl"
38
+ end
39
+ after "deploy:install", "apache:install"
40
+
41
+ desc "Setup apache"
42
+ task :setup, roles: :web do
43
+
44
+ set_default :passenger_root, passenger_root
45
+
46
+ template "passenger_mod.erb", "/tmp/passenger_mod"
47
+ run "#{sudo} mv /tmp/passenger_mod /etc/apache2/mods-available/passenger.load"
48
+ run "#{sudo} a2enmod passenger"
49
+
50
+ template "http_site.erb", "/tmp/http_site"
51
+ run "#{sudo} mv /tmp/http_site /etc/apache2/sites-available/#{application}"
52
+ run "#{sudo} a2ensite #{application}"
53
+ end
54
+ after "deploy:setup", "apache:setup"
55
+
56
+ %w[start stop reload restart].each do |command|
57
+ desc "#{command} Apache"
58
+ task command, roles: :web do
59
+ run "#{sudo} /etc/init.d/apache2 #{command}"
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,16 @@
1
+ namespace :deploy do
2
+ desc "Install everything onto the server"
3
+ task :install, roles: [:app, :web] do
4
+ run "#{sudo} dpkg-reconfigure grub-pc -f noninteractive"
5
+ run "#{sudo} apt-get -y update"
6
+ run "#{sudo} apt-get -y upgrade"
7
+ run "#{sudo} apt-get -y install python-software-properties"
8
+ run "#{sudo} locale-gen en_US.UTF-8"
9
+ run "#{sudo} /usr/sbin/update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8"
10
+ run "#{sudo} apt-get -y install locate"
11
+ run "#{sudo} dpkg-reconfigure locales"
12
+ run "mkdir -p ~/.ssh"
13
+ run "chmod 0700 ~/.ssh"
14
+ run "ssh-keyscan -H github.com >>~/.ssh/known_hosts"
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ namespace :check do
2
+ desc "Make sure local git is in sync with remote."
3
+ task :revision, roles: :web do
4
+ unless `git rev-parse HEAD` == `git rev-parse origin/#{branch}`
5
+ puts "WARNING: HEAD is not the same as origin/#{branch}"
6
+ puts "Run `git push` to sync changes."
7
+ exit
8
+ end
9
+ end
10
+ before "deploy", "check:revision"
11
+ before "deploy:migrations", "check:revision"
12
+ before "deploy:cold", "check:revision"
13
+ end
@@ -0,0 +1,9 @@
1
+ namespace :logrotate do
2
+ desc "Rotate logs in application."
3
+ task :setup, roles: [:app, :web] do
4
+ template "logrotate.erb", '/tmp/logrotate_tmp'
5
+ run "#{sudo} mv /tmp/logrotate_tmp /etc/logrotate.d/#{application}"
6
+ run "#{sudo} chown root:root /etc/logrotate.d/#{application}"
7
+ end
8
+ after "deploy:setup", "logrotate:setup"
9
+ end
@@ -0,0 +1,24 @@
1
+ set_default :memcached_memory_limit, 64
2
+
3
+ namespace :memcached do
4
+ desc "Install Memcached"
5
+ task :install, roles: [:app, :web] do
6
+ run "#{sudo} apt-get install memcached"
7
+ end
8
+ after "deploy:install", "memcached:install"
9
+
10
+ desc "Setup Memcached"
11
+ task :setup, roles: [:app, :web] do
12
+ template "memcached.erb", "/tmp/memcached.conf"
13
+ run "#{sudo} mv /tmp/memcached.conf /etc/memcached.conf"
14
+ restart
15
+ end
16
+ after "deploy:setup", "memcached:setup"
17
+
18
+ %w[start stop restart].each do |command|
19
+ desc "#{command} Memcached"
20
+ task command, roles: [:app, :web] do
21
+ run "#{sudo} service memcached #{command}"
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,146 @@
1
+ require 'yaml'
2
+
3
+ set_default(:mogilefs_database) { "#{postgresql_database}_mogilefs" }
4
+ set_default :mogilefs_classes, []
5
+ set_default :mogilefs_tracker_port, 6001
6
+
7
+ namespace :mogilefs do
8
+
9
+ def postgresql_password
10
+ fname = ["#{shared_path}/config/database.yml","#{current_path}/config/database.yml"].detect do |filename|
11
+ remote_file_exists?(filename)
12
+ end
13
+ if fname
14
+ capture("ruby -e \"require 'yaml'; config = YAML.load_file('#{fname}'); puts config['#{rails_env}']['password']\"").strip
15
+ else
16
+ config = YAML.load_file('config/database.yml')
17
+ config[rails_env]['password']
18
+ end
19
+ end
20
+
21
+ def postgresql_host
22
+ fname = ["#{shared_path}/config/database.yml","#{current_path}/config/database.yml"].detect do |filename|
23
+ remote_file_exists?(filename)
24
+ end
25
+ if fname
26
+ capture("ruby -e \"require 'yaml'; config = YAML.load_file('#{fname}'); puts config['#{rails_env}']['host']\"").strip
27
+ else
28
+ config = YAML.load_file('config/database.yml')
29
+ config[rails_env]['host']
30
+ end
31
+ end
32
+
33
+ desc "Install mogilefs."
34
+ task :install, roles: :app do
35
+ # MOGSTORED_RUN_WITHOUT_AIO=1
36
+ run "#{sudo} apt-get -y install liblocal-lib-perl"
37
+ run "#{sudo} apt-get -y install libcommon-sense-perl"
38
+ %w(CPAN DBD:SQLite IO:AIO MogileFS:Server MogileFS:Utils MogileFS:Store::Postgres DBD::Pg).each do |pkg|
39
+ run "#{sudo} MOGTEST_DBTYPE=SQLite perl -MCPAN -e 'force install \"#{pkg}\"'",:pty => true do |ch, stream, data|
40
+ if data =~ /Would you like to configure as much as possible automatically\? \[yes\]/
41
+ ch.send_data("\n")
42
+ elsif ["[local::lib]","sites for you? (This means connecting to the Internet) [yes]", "Would you like me to append that to /home/capistrano/.bashrc now? [yes]"].include?(data.strip)
43
+ ch.send_data("\n")
44
+ else
45
+ Capistrano::Configuration.default_io_proc.call(ch,stream,data)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ task :setup_master, roles: :app, only: {primary: true} do
51
+
52
+ run "psql -h #{postgresql_host} -d template1 -U #{postgresql_user} -c \"create database #{mogilefs_database} with owner=#{postgresql_user} encoding='UNICODE';\"",:pty => true do |ch, stream, data|
53
+ if data.strip == 'Password for user clubhouse:'
54
+ ch.send_data(postgresql_password + "\n")
55
+ elsif data.strip == "ERROR: database \"clubhouse_#{rails_env}_mogilefs\" already exists"
56
+ break
57
+ else
58
+ Capistrano::Configuration.default_io_proc.call(ch,stream,data)
59
+ end
60
+ end
61
+
62
+ run "mogdbsetup --yes --type=Postgres --dbhost=#{postgresql_host} --dbname=#{mogilefs_database} --dbuser=#{postgresql_user} --dbpass='#{postgresql_password}'"
63
+ start
64
+ sleep 10
65
+
66
+ roles[:app].servers.each do |server|
67
+ run "mogadm --trackers=localhost:#{mogilefs_tracker_port} host add #{server} --port 7500 --status=alive", :pty => true do |ch, stream, data|
68
+ if data.strip == "Host already exists."
69
+ break
70
+ else
71
+ Capistrano::Configuration.default_io_proc.call(ch,stream,data)
72
+ end
73
+ end
74
+ end
75
+ roles[:app].servers.each_with_index do |server,i|
76
+ run "mogadm --trackers=localhost:#{mogilefs_tracker_port} device add #{server} #{i+1}", :pty => true do |ch, stream, data|
77
+ if data.strip == "Error adding device: existing_devid existing_devid"
78
+ break
79
+ else
80
+ Capistrano::Configuration.default_io_proc.call(ch,stream,data)
81
+ end
82
+ end
83
+ end
84
+ run "mogadm --trackers=localhost:#{mogilefs_tracker_port} check"
85
+ run "mogadm --trackers=localhost:#{mogilefs_tracker_port} domain add #{application}", :pty => true do |ch, stream, data|
86
+ if data.strip == "Error creating domain: domain_exists That domain already exists"
87
+ break
88
+ else
89
+ Capistrano::Configuration.default_io_proc.call(ch,stream,data)
90
+ end
91
+ end
92
+ mogilefs_classes.each do |klass|
93
+ run "mogadm --trackers=localhost:#{mogilefs_tracker_port} class add #{application} #{klass}", :pty => true do |ch, stream, data|
94
+ if data.strip == "Error creating class: class_exists That class already exists in that domain"
95
+ break
96
+ else
97
+ Capistrano::Configuration.default_io_proc.call(ch,stream,data)
98
+ end
99
+ end
100
+ end
101
+ end
102
+ task :setup, roles: :app do
103
+ run "#{sudo} sh -c \"adduser --disabled-login --disabled-password mogile; exit 0\"",:pty => true do |ch, stream, data|
104
+ if data =~ /\[\]: $/
105
+ ch.send_data("\n")
106
+ elsif data.strip == "Is the information correct? [Y/n]"
107
+ ch.send_data("\n")
108
+ else
109
+ Capistrano::Configuration.default_io_proc.call(ch,stream,data)
110
+ end
111
+ end
112
+ run "#{sudo} mkdir -p /etc/mogilefs"
113
+
114
+ set :mogile_db_host, postgresql_host
115
+ set :mogilefs_master, roles[:app].servers.detect{ |server| server.options[:primary] == true }
116
+
117
+ template "mogilefsd_conf.erb", "/tmp/mogilefsd_conf"
118
+ run "#{sudo} mv /tmp/mogilefsd_conf /etc/mogilefs/mogilefsd.conf"
119
+ template "mogstored_conf.erb", "/tmp/mogstored_conf"
120
+ run "#{sudo} mv /tmp/mogstored_conf /etc/mogilefs/mogstored.conf"
121
+
122
+ copy_file '../rc-scripts/mogilefsd','/etc/init.d/mogilefsd', :mode => '755'
123
+ copy_file '../rc-scripts/mogstored','/etc/init.d/mogstored', :mode => '755'
124
+ run '#{sudo} chown root:root /etc/init.d/mogilefsd'
125
+ run '#{sudo} chown root:root /etc/init.d/mogstored'
126
+
127
+ run "#{sudo} mkdir -p /var/mogdata/dev1"
128
+ run "#{sudo} mkdir -p /var/mogdata/dev2"
129
+ run "#{sudo} chown mogile:mogile /var/mogdata"
130
+ run "#{sudo} chown mogile:mogile /var/mogdata/dev1"
131
+ run "#{sudo} chown mogile:mogile /var/mogdata/dev2"
132
+ run "#{sudo} update-rc.d mogilefsd defaults"
133
+ run "#{sudo} update-rc.d mogstored defaults"
134
+ run "#{sudo} apt-get -y install sysstat"
135
+
136
+ setup_master
137
+ end
138
+ after "deploy:install", "mogilefs:install"
139
+ after "deploy:setup", "mogilefs:setup"
140
+
141
+ task :start, roles: :app do
142
+ # nohup ensures start-stop-deamon completes its backround startup process before ssh exits
143
+ run "#{sudo} nohup service mogstored start"
144
+ run "#{sudo} nohup service mogilefsd start"
145
+ end
146
+ end
@@ -0,0 +1,99 @@
1
+ namespace :nfs do
2
+ # See https://help.ubuntu.com/community/SettingUpNFSHowTo
3
+
4
+ desc 'Install nfs, and if a primary is defined nfs server will be installed'
5
+ task :install do
6
+ if has_servers? roles: :nfs, only: {primary: true}
7
+ nfs.server.install
8
+ end
9
+ nfs.client.install
10
+ end
11
+ after "deploy:install", "nfs:install"
12
+
13
+ desc 'Setup nfs, primary will setup share, others will mount share'
14
+ task :setup do
15
+ if has_servers? roles: :nfs, only: {primary: true}
16
+ nfs.server.setup
17
+ end
18
+ nfs.client.setup
19
+ end
20
+
21
+ desc 'Restart nfs (applies to server only)'
22
+ task :restart do
23
+ if has_servers? roles: :nfs, only: {primary: true}
24
+ nfs.server.restart
25
+ end
26
+ end
27
+
28
+ namespace :client do
29
+ desc 'Install nfs client'
30
+ task :install, roles: :nfs, except: {primary: true} do
31
+ packages = %w(rpcbind nfs-common)
32
+ packages.each do |package|
33
+ run "#{sudo} apt-get install #{package}", pty: true do |ch, stream, data|
34
+ case data.strip
35
+ when 'Do you want to continue [Y/n]?'
36
+ ch.send_data("\n")
37
+ end
38
+ end
39
+ end
40
+ end
41
+ desc <<-DESC
42
+ Setup nfs mount points. Define nfs_shares that are to be setup. \
43
+ You define source and mount points as a hash. Example:
44
+ set :nfs_shares, { '/var/export' => '/var/shared'}
45
+ If not specifying server path, primary will be used.
46
+ If specifying server path, that server will be used. E.g.
47
+ set :nfs_shares, { 'myserver:/var/export' => '/var/shared'}
48
+ DESC
49
+ task :setup, roles: :nfs, except: {primary: true} do
50
+ # replace_line_in_file '/etc/default/nfs-common', 'NEED_IDMAPD=.*', 'NEED_IDMAPD=yes'
51
+ nfs_shares.each do |export,share|
52
+ run "#{sudo} mkdir -p --mode=777 #{share}"
53
+ source_path = export.include?(':') ? export : "#{find_servers(roles: :nfs, only: {primary: true}).first}:#{export}"
54
+ run "#{sudo} mount #{source_path} #{share}"
55
+ sudo_enrich_file '/etc/fstab', "#{source_path} #{share} nfs auto 0 0"
56
+ end
57
+ end
58
+ end
59
+
60
+ namespace :server do
61
+ desc 'Install nfs server'
62
+ task :install, roles: :nfs, only: {primary: true} do
63
+ packages = %w(rpcbind nfs-kernel-server)
64
+ packages.each do |package|
65
+ run "#{sudo} apt-get install #{package}", pty: true do |ch, stream, data|
66
+ case data.strip
67
+ when 'Do you want to continue [Y/n]?'
68
+ ch.send_data("\n")
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ desc <<-DESC
75
+ Setup servershares. Define nfs_shares that are to be setup. \
76
+ Directories will be created unless they exists. \
77
+ You define source and mount points as a hash. Example:
78
+ set :nfs_shares, { '/var/export' => '/var/shared'}
79
+ DESC
80
+ task :setup, roles: :nfs, only: {primary: true} do
81
+ nfs_shares.each do |export,share|
82
+ run "#{sudo} mkdir -p --mode=777 #{export}"
83
+ run "#{sudo} mkdir -p --mode=777 #{share}"
84
+ run "#{sudo} mount --bind #{share} #{export}"
85
+ sudo_enrich_file '/etc/fstab', "#{share} #{export} none bind 0 0"
86
+ #replace_line_in_file '/etc/default/nfs-common', 'NEED_IDMAPD=.*', 'NEED_IDMAPD=yes'
87
+ # may need export in /etc/exports
88
+ sudo_enrich_file '/etc/exports', "#{export} *(rw,nohide,insecure,no_subtree_check,async)"
89
+ end
90
+ end
91
+
92
+ desc 'Restart nfs server'
93
+ task :restart, roles: :nfs, only: {primary: true} do
94
+ run "#{sudo} service nfs-kernel-server restart"
95
+ end
96
+ end
97
+
98
+
99
+ end