capstrap 0.1.0 → 0.2.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/LICENSE +1 -1
- data/README.markdown +73 -0
- data/lib/capistrano/ext/capstrap/chef.rb +43 -3
- data/lib/capistrano/ext/capstrap/core.rb +24 -2
- data/lib/capstrap/cli.rb +84 -3
- data/lib/capstrap/version.rb +1 -1
- metadata +5 -5
- data/README.rdoc +0 -17
data/LICENSE
CHANGED
data/README.markdown
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
# capstrap
|
2
|
+
|
3
|
+
A command to remotely install git, rvm, ruby, and chef-solo using capistrano.
|
4
|
+
|
5
|
+
To get started, install capstrap:
|
6
|
+
|
7
|
+
gem install capstrap
|
8
|
+
|
9
|
+
capstrap assumes you are operating as *root* so you might want to drop in
|
10
|
+
your ssh key to root's *authorized_keys*:
|
11
|
+
|
12
|
+
ssh root@zland '(if [ ! -d "${HOME}/.ssh" ]; then \
|
13
|
+
mkdir -m 0700 -p ${HOME}/.ssh; fi; \
|
14
|
+
cat - >> .ssh/authorized_keys)' < ${HOME}/.ssh/id_dsa.pub
|
15
|
+
|
16
|
+
To install a baseline RVM/ruby environment (*ree-1.8.7* is default):
|
17
|
+
|
18
|
+
capstrap ruby root@zland
|
19
|
+
|
20
|
+
To use a custom RVM ruby:
|
21
|
+
|
22
|
+
capstrap ruby root@zland --ruby=ruby-1.8.7
|
23
|
+
|
24
|
+
To install the *chef* gem:
|
25
|
+
|
26
|
+
capstrap chef root@zland
|
27
|
+
|
28
|
+
To install a chef cookbooks repository and chef configuration:
|
29
|
+
|
30
|
+
capstrap solo root@zland \
|
31
|
+
--cookbooks-repo=git://github.com/fnichol/chef-repo.git \
|
32
|
+
--config-repo=git://github.com/fnichol/chef-dna-spike.git
|
33
|
+
|
34
|
+
To override the default cookbooks and configuration paths:
|
35
|
+
|
36
|
+
capstrap solo root@zland \
|
37
|
+
--cookbooks-repo=git://github.com/fnichol/chef-repo.git \
|
38
|
+
--cookbooks-path=/opt/chef \
|
39
|
+
--config-repo=git://github.com/fnichol/chef-dna-spike.git \
|
40
|
+
--config-path=/opt/chef/config
|
41
|
+
|
42
|
+
To execute a chef configuration (the full monty):
|
43
|
+
|
44
|
+
capstrap execute root@zland \
|
45
|
+
--cookbooks-repo=git://github.com/fnichol/chef-repo.git \
|
46
|
+
--config-repo=git://github.com/fnichol/chef-dna-spike.git
|
47
|
+
|
48
|
+
To set some other crazy configuration (the full monty with cheese):
|
49
|
+
|
50
|
+
capstrap execute root@zland \
|
51
|
+
--ruby=ruby-1.8.7 \
|
52
|
+
--cookbooks-repo=git://github.com/fnichol/chef-repo.git \
|
53
|
+
--cookbooks-path=/opt/chef \
|
54
|
+
--config-repo=git://github.com/fnichol/chef-dna-spike.git \
|
55
|
+
--config-path=/opt/chef/config
|
56
|
+
|
57
|
+
To get more help:
|
58
|
+
|
59
|
+
capstrap help
|
60
|
+
|
61
|
+
## Note on Patches/Pull Requests
|
62
|
+
|
63
|
+
* Fork the project.
|
64
|
+
* Make your feature addition or bug fix.
|
65
|
+
* Add tests for it. This is important so I don't break it in a
|
66
|
+
future version unintentionally.
|
67
|
+
* Commit, do not mess with rakefile, version, or history.
|
68
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
69
|
+
* Send me a pull request. Bonus points for topic branches.
|
70
|
+
|
71
|
+
## Copyright
|
72
|
+
|
73
|
+
Copyright (c) 2010 Fletcher Nichol. See LICENSE for details.
|
@@ -7,11 +7,51 @@ module Capstrap
|
|
7
7
|
namespace :chef do
|
8
8
|
namespace :install do
|
9
9
|
|
10
|
-
desc "Installs chef
|
10
|
+
desc "Installs chef gem"
|
11
|
+
task :lib do
|
12
|
+
unless chef_installed?
|
13
|
+
cmd = [
|
14
|
+
%{use #{ruby}@global},
|
15
|
+
%{gem install chef}
|
16
|
+
]
|
17
|
+
rvm_run cmd.join(" && ")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
desc "Installs chef cookbook git repository"
|
22
|
+
task :cookbooks do
|
23
|
+
unless cookbooks_repo_installed?
|
24
|
+
cmd = [
|
25
|
+
%{git clone #{cookbooks_repo} #{cookbooks_path}},
|
26
|
+
%{cd #{cookbooks_path}},
|
27
|
+
%{git submodule init},
|
28
|
+
%{git submodule update}
|
29
|
+
]
|
30
|
+
run cmd.join(" && ")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
desc "Installs chef configuration git repository"
|
35
|
+
task :config do
|
36
|
+
unless config_repo_installed?
|
37
|
+
cmd = [
|
38
|
+
%{git clone #{config_repo} #{config_path}},
|
39
|
+
%{cd #{config_path}},
|
40
|
+
%{git submodule init},
|
41
|
+
%{git submodule update}
|
42
|
+
]
|
43
|
+
run cmd.join(" && ")
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
namespace :execute do
|
49
|
+
|
50
|
+
desc "Executes chef solo configuration"
|
11
51
|
task :solo do
|
12
52
|
cmd = [
|
13
|
-
%{use
|
14
|
-
%{
|
53
|
+
%{use #{ruby}},
|
54
|
+
%{chef-solo}
|
15
55
|
]
|
16
56
|
rvm_run cmd.join(" && ")
|
17
57
|
end
|
@@ -5,8 +5,8 @@
|
|
5
5
|
# @return [true, false] whether or not the conditional passes
|
6
6
|
def cmd_if(test, rvm=false)
|
7
7
|
load_rvm = ""
|
8
|
-
load_rvm = rvm_env
|
9
|
-
r = capture %{#{
|
8
|
+
load_rvm = "#{rvm_env} " if rvm
|
9
|
+
r = capture %{#{load_rvm}if #{test} ; then echo true; else echo false; fi},
|
10
10
|
:shell => "bash"
|
11
11
|
puts " * Result is: #{r.to_s}"
|
12
12
|
if r.to_s =~ /true/
|
@@ -73,6 +73,28 @@ def ruby_installed?(ruby)
|
|
73
73
|
cmd_if %{rvm list strings | grep -q "#{ruby}" >/dev/null}, true
|
74
74
|
end
|
75
75
|
|
76
|
+
##
|
77
|
+
# Checks if the chef gem is installed on the remote host.
|
78
|
+
#
|
79
|
+
def chef_installed?
|
80
|
+
cmd_if %{rvm use #{ruby}@global >/dev/null && gem list --no-versions | grep -q "^chef$" >/dev/null}, true
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
##
|
85
|
+
# Checks if chef cookbook repo is installed on the remote host.
|
86
|
+
#
|
87
|
+
def cookbooks_repo_installed?
|
88
|
+
cmd_test %{-d "#{cookbooks_path}"}
|
89
|
+
end
|
90
|
+
|
91
|
+
##
|
92
|
+
# Checks if chef config repo is installed on the remote host.
|
93
|
+
#
|
94
|
+
def config_repo_installed?
|
95
|
+
cmd_test %{-d "#{config_path}"}
|
96
|
+
end
|
97
|
+
|
76
98
|
##
|
77
99
|
# Prints an information message.
|
78
100
|
#
|
data/lib/capstrap/cli.rb
CHANGED
@@ -16,21 +16,90 @@ module Capstrap
|
|
16
16
|
@ssh_host = ssh_host
|
17
17
|
abort ">> HOST must be set" unless @ssh_host
|
18
18
|
|
19
|
+
setup_config options
|
20
|
+
|
19
21
|
config.find_and_execute_task "rvm:install:#{options[:ruby]}"
|
20
22
|
if options[:default]
|
21
23
|
config.find_and_execute_task "rvm:default:#{options[:ruby]}"
|
22
24
|
end
|
23
25
|
end
|
24
26
|
|
25
|
-
desc "
|
27
|
+
desc "chef HOST", "Install chef gem on remote SSH host HOST"
|
26
28
|
method_option "ruby", :type => :string, :banner =>
|
27
29
|
"Version of ruby to install.", :default => "ree-1.8.7"
|
28
|
-
def
|
30
|
+
def chef(ssh_host)
|
29
31
|
@ssh_host = ssh_host
|
30
32
|
abort ">> HOST must be set" unless @ssh_host
|
31
33
|
|
34
|
+
setup_config options
|
35
|
+
|
32
36
|
invoke :ruby, [ssh_host], :ruby => options[:ruby], :default => true
|
33
|
-
config.find_and_execute_task "chef:install:
|
37
|
+
config.find_and_execute_task "chef:install:lib"
|
38
|
+
end
|
39
|
+
|
40
|
+
desc "solo HOST", "Install chef cookbooks & config on remote SSH host HOST"
|
41
|
+
method_option "ruby", :type => :string, :banner =>
|
42
|
+
"Version of ruby to install.", :default => "ree-1.8.7"
|
43
|
+
method_option "cookbooks-repo", :type => :string, :banner =>
|
44
|
+
"Chef cookbooks git repository URL."
|
45
|
+
method_option "cookbooks-path", :type => :string,
|
46
|
+
:banner => "Install path to chef cookbooks git repository.",
|
47
|
+
:default => "/var/chef-solo"
|
48
|
+
method_option "config-repo", :type => :string, :banner =>
|
49
|
+
"Chef configuration git repository URL."
|
50
|
+
method_option "config-path", :type => :string,
|
51
|
+
:banner => "Install path to chef configuration git repository.",
|
52
|
+
:default => "/etc/chef"
|
53
|
+
def solo(ssh_host)
|
54
|
+
@ssh_host = ssh_host
|
55
|
+
abort ">> HOST must be set" unless @ssh_host
|
56
|
+
|
57
|
+
setup_config options
|
58
|
+
|
59
|
+
unless options["cookbooks-repo"]
|
60
|
+
abort ">> --cookbooks-repo=<git_url> must be set"
|
61
|
+
end
|
62
|
+
unless options["config-repo"]
|
63
|
+
abort ">> --config-repo=<git_url> must be set"
|
64
|
+
end
|
65
|
+
|
66
|
+
invoke :chef, [ssh_host], :ruby => options[:ruby], :default => true
|
67
|
+
config.find_and_execute_task "chef:install:cookbooks"
|
68
|
+
config.find_and_execute_task "chef:install:config"
|
69
|
+
end
|
70
|
+
|
71
|
+
desc "execute HOST", "Executes chef solo config on remote SSH host HOST"
|
72
|
+
method_option "ruby", :type => :string, :banner =>
|
73
|
+
"Version of ruby to install.", :default => "ree-1.8.7"
|
74
|
+
method_option "cookbooks-repo", :type => :string, :banner =>
|
75
|
+
"Chef cookbooks git repository URL."
|
76
|
+
method_option "cookbooks-path", :type => :string,
|
77
|
+
:banner => "Install path to chef cookbooks git repository.",
|
78
|
+
:default => "/var/chef-solo"
|
79
|
+
method_option "config-repo", :type => :string, :banner =>
|
80
|
+
"Chef configuration git repository URL."
|
81
|
+
method_option "config-path", :type => :string,
|
82
|
+
:banner => "Install path to chef configuration git repository.",
|
83
|
+
:default => "/etc/chef"
|
84
|
+
def execute(ssh_host)
|
85
|
+
@ssh_host = ssh_host
|
86
|
+
abort ">> HOST must be set" unless @ssh_host
|
87
|
+
|
88
|
+
setup_config options
|
89
|
+
|
90
|
+
unless options["cookbooks-repo"]
|
91
|
+
abort ">> --cookbooks-repo=<git_url> must be set"
|
92
|
+
end
|
93
|
+
unless options["config-repo"]
|
94
|
+
abort ">> --config-repo=<git_url> must be set"
|
95
|
+
end
|
96
|
+
|
97
|
+
invoke :solo, [ssh_host], :ruby => options[:ruby], :default => true,
|
98
|
+
:"cookbooks-repo" => options["cookbooks-repo"],
|
99
|
+
:"cookbooks-path" => options["cookbooks-path"],
|
100
|
+
:"config-repo" => options["config-repo"],
|
101
|
+
:"config-path" => options["config-path"]
|
102
|
+
config.find_and_execute_task "chef:execute:solo"
|
34
103
|
end
|
35
104
|
|
36
105
|
private
|
@@ -51,5 +120,17 @@ module Capstrap
|
|
51
120
|
|
52
121
|
config
|
53
122
|
end
|
123
|
+
|
124
|
+
def setup_config(options)
|
125
|
+
[
|
126
|
+
{:sym => :ruby, :opt => "ruby"},
|
127
|
+
{:sym => :cookbooks_repo, :opt => "cookbooks-repo"},
|
128
|
+
{:sym => :cookbooks_path, :opt => "cookbooks-path"},
|
129
|
+
{:sym => :config_repo, :opt => "config-repo"},
|
130
|
+
{:sym => :config_path, :opt => "config-path"}
|
131
|
+
].each do |var|
|
132
|
+
config.set(var[:sym], options[var[:opt]]) if options[var[:opt]]
|
133
|
+
end
|
134
|
+
end
|
54
135
|
end
|
55
136
|
end
|
data/lib/capstrap/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capstrap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 2
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Fletcher Nichol
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-10-
|
18
|
+
date: 2010-10-30 00:00:00 -06:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -82,7 +82,7 @@ files:
|
|
82
82
|
- Gemfile
|
83
83
|
- Gemfile.lock
|
84
84
|
- LICENSE
|
85
|
-
- README.
|
85
|
+
- README.markdown
|
86
86
|
- Rakefile
|
87
87
|
- bin/capstrap
|
88
88
|
- capstrap.gemspec
|
data/README.rdoc
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
= capstrap
|
2
|
-
|
3
|
-
Description goes here.
|
4
|
-
|
5
|
-
== Note on Patches/Pull Requests
|
6
|
-
|
7
|
-
* Fork the project.
|
8
|
-
* Make your feature addition or bug fix.
|
9
|
-
* Add tests for it. This is important so I don't break it in a
|
10
|
-
future version unintentionally.
|
11
|
-
* Commit, do not mess with rakefile, version, or history.
|
12
|
-
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
13
|
-
* Send me a pull request. Bonus points for topic branches.
|
14
|
-
|
15
|
-
== Copyright
|
16
|
-
|
17
|
-
Copyright (c) 2010 Fletcher Nichol. See LICENSE for details.
|