yyuu-capistrano-chef-solo 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +5 -3
- data/lib/capistrano-chef-solo.rb +87 -38
- data/lib/capistrano-chef-solo/version.rb +1 -1
- metadata +2 -2
data/README.md
CHANGED
@@ -29,7 +29,7 @@ To setup your servers with `chef-solo`, add following in you `config/deploy.rb`.
|
|
29
29
|
|
30
30
|
# in "config/deploy.rb"
|
31
31
|
require 'capistrano-chef-solo'
|
32
|
-
set(:
|
32
|
+
set(:chef_solo_cookbooks_repository, "git@example.com:foo/bar.git")
|
33
33
|
|
34
34
|
And then, now you can start `chef-solo` via capistrano.
|
35
35
|
|
@@ -41,8 +41,10 @@ Following options are available to manage your `chef-solo`.
|
|
41
41
|
* `:chef_solo_user` - special user to invoke `chef-solo`. use `user` by default.
|
42
42
|
* `:chef_solo_ssh_options` - special ssh options for `chef_solo_user`. use `ssh_options` by default.
|
43
43
|
* `:chef_solo_ruby_version` - ruby version to launch `chef-solo`.
|
44
|
-
* `:
|
45
|
-
* `:
|
44
|
+
* `:chef_solo_cookbooks_repository` - the URL of your cookbook repository. use `repository` by default.
|
45
|
+
* `:chef_solo_cookbooks_revision` - the `branch` in the repository.
|
46
|
+
* `:chef_solo_cookbooks_subdir` - the path to the `cookbooks` directory in the repository. use `config/cookbooks` by default.
|
47
|
+
* `:chef_solo_cookbooks` - an alternative way to specify cookbooks repository. you can set multiple repositories from here.
|
46
48
|
* `:chef_solo_attributes` - the `attributes` to apply to `chef-solo`.
|
47
49
|
* `:chef_solo_run_list` - the `run_list` to apply to `chef-solo`.
|
48
50
|
|
data/lib/capistrano-chef-solo.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
|
-
require
|
1
|
+
require 'capistrano-chef-solo/version'
|
2
2
|
require 'capistrano-rbenv'
|
3
|
+
require 'capistrano/configuration'
|
4
|
+
require 'capistrano/recipes/deploy/scm'
|
3
5
|
require 'json'
|
4
6
|
require 'tmpdir'
|
7
|
+
require 'uri'
|
5
8
|
|
6
9
|
module Capistrano
|
7
10
|
module ChefSolo
|
@@ -55,55 +58,101 @@ module Capistrano
|
|
55
58
|
}
|
56
59
|
|
57
60
|
task(:update) {
|
58
|
-
|
61
|
+
update_cookbooks
|
59
62
|
update_config
|
60
63
|
update_attributes
|
61
64
|
invoke
|
62
65
|
}
|
63
66
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
_cset(:chef_solo_cookbooks_exclude, [])
|
69
|
-
task(:update_cookbook) { # TODO: refactor
|
70
|
-
git = fetch(:chef_solo_git, 'git')
|
71
|
-
tar = fetch(:chef_solo_tar, 'tar')
|
72
|
-
copy_dir = Dir.mktmpdir()
|
73
|
-
destination = File.join(copy_dir, 'cookbooks')
|
74
|
-
filename = "#{destination}.tar.gz"
|
67
|
+
task(:update_cookbooks) {
|
68
|
+
tmpdir = Dir.mktmpdir()
|
69
|
+
remote_tmpdir = Dir.mktmpdir()
|
70
|
+
destination = File.join(tmpdir, 'cookbooks')
|
75
71
|
remote_destination = File.join(chef_solo_path, 'cookbooks')
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
72
|
+
filename = File.join(tmpdir, 'cookbooks.tar.gz')
|
73
|
+
remote_filename = File.join(remote_tmpdir, 'cookbooks.tar.gz')
|
74
|
+
begin
|
75
|
+
bundle_cookbooks(filename, destination)
|
76
|
+
run("mkdir -p #{remote_tmpdir}")
|
77
|
+
distribute_cookbooks(filename, remote_filename, remote_destination)
|
78
|
+
ensure
|
79
|
+
run("rm -rf #{remote_tmpdir}")
|
80
|
+
run_locally("rm -rf #{tmpdir}")
|
83
81
|
end
|
82
|
+
}
|
84
83
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
84
|
+
_cset(:chef_solo_cookbook_repository) { abort("chef_solo_cookbook_repository not set") }
|
85
|
+
_cset(:chef_solo_cookbooks_repository) {
|
86
|
+
logger.info("WARNING: `chef_solo_cookbook_repository' has been deprecated. use `chef_solo_cookbooks_repository' instead.")
|
87
|
+
chef_solo_cookbook_repository
|
88
|
+
}
|
89
|
+
_cset(:chef_solo_cookbook_revision, 'HEAD')
|
90
|
+
_cset(:chef_solo_cookbooks_revision) {
|
91
|
+
logger.info("WARNING: `chef_solo_cookbook_revision' has been deprecated. use `chef_solo_cookbooks_revision' instead.")
|
92
|
+
chef_solo_cookbook_revision
|
93
|
+
}
|
94
|
+
_cset(:chef_solo_cookbook_subdir, '/')
|
95
|
+
_cset(:chef_solo_cookbooks_subdir) {
|
96
|
+
logger.info("WARNING: `chef_solo_cookbook_subdir' has been deprecated. use `chef_solo_cookbooks_subdir' instead.")
|
97
|
+
chef_solo_cookbook_subdir
|
98
|
+
}
|
99
|
+
_cset(:chef_solo_cookbooks_exclude, %w(.hg .git .svn))
|
100
|
+
|
101
|
+
# special variable to set multiple cookbooks repositories.
|
102
|
+
# by default, it will build from :chef_solo_cookbooks_* variables.
|
103
|
+
_cset(:chef_solo_cookbooks) {
|
104
|
+
name = File.basename(chef_solo_cookbooks_repository, File.extname(chef_solo_cookbooks_repository))
|
105
|
+
{
|
106
|
+
name => {
|
107
|
+
:repository => chef_solo_cookbooks_repository,
|
108
|
+
:revision => chef_solo_cookbooks_revision,
|
109
|
+
:cookbooks => chef_solo_cookbooks_subdir,
|
110
|
+
:cookbooks_exclude => chef_solo_cookbooks_exclude,
|
111
|
+
}
|
112
|
+
}
|
113
|
+
}
|
114
|
+
|
115
|
+
_cset(:chef_solo_configuration, configuration)
|
116
|
+
_cset(:chef_solo_repository_cache) { File.expand_path('./tmp/cookbooks-cache') }
|
117
|
+
def bundle_cookbooks(filename, destination)
|
118
|
+
dirs = [ File.dirname(filename), destination ].uniq
|
119
|
+
run_locally("mkdir -p #{dirs.join(' ')}")
|
120
|
+
chef_solo_cookbooks.each do |name, options|
|
121
|
+
configuration = Capistrano::Configuration.new()
|
122
|
+
chef_solo_configuration.variables.merge(options).each { |key, val|
|
123
|
+
configuration.set(key, val)
|
124
|
+
}
|
125
|
+
# refreshing just :source, :revision and :real_revision is enough?
|
126
|
+
configuration.set(:source) { Capistrano::Deploy::SCM.new(configuration[:scm], configuration) }
|
127
|
+
configuration.set(:revision) { configuration[:source].head }
|
128
|
+
configuration.set(:real_revision) {
|
129
|
+
configuration[:source].local.query_revision(configuration[:revision]) { |cmd|
|
130
|
+
with_env("LC_ALL", "C") { run_locally(cmd) }
|
131
|
+
}
|
132
|
+
}
|
133
|
+
repository_cache = File.join(chef_solo_repository_cache, name)
|
134
|
+
if File.exist?(repository_cache)
|
135
|
+
run_locally(configuration[:source].sync(configuration[:real_revision], repository_cache))
|
91
136
|
else
|
92
|
-
|
93
|
-
checkout << "rsync -lrpt #{exclusions} #{repository_cache_subdir} #{destination}"
|
137
|
+
run_locally(configuration[:source].checkout(configuration[:real_revision], repository_cache))
|
94
138
|
end
|
95
|
-
run_locally(checkout.join(' && '))
|
96
|
-
|
97
|
-
copy = []
|
98
|
-
copy << "cd #{File.dirname(destination)} && #{tar} chzf #{filename} #{File.basename(destination)}"
|
99
|
-
run_locally(copy.join(' && '))
|
100
139
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
140
|
+
cookbooks = [ options.fetch(:cookbooks, '/') ].flatten.compact
|
141
|
+
execute = cookbooks.map { |c|
|
142
|
+
repository_cache_subdir = File.join(repository_cache, c)
|
143
|
+
exclusions = options.fetch(:cookbooks_exclude, []).map { |e| "--exclude=\"#{e}\"" }.join(' ')
|
144
|
+
"rsync -lrpt #{exclusions} #{repository_cache_subdir}/ #{destination}"
|
145
|
+
}
|
146
|
+
run_locally(execute.join(' && '))
|
105
147
|
end
|
106
|
-
|
148
|
+
run_locally("cd #{File.dirname(destination)} && tar chzf #{filename} #{File.basename(destination)}")
|
149
|
+
end
|
150
|
+
|
151
|
+
def distribute_cookbooks(filename, remote_filename, remote_destination)
|
152
|
+
upload(filename, remote_filename)
|
153
|
+
run("rm -rf #{remote_destination}")
|
154
|
+
run("cd #{File.dirname(remote_destination)} && tar xzf #{remote_filename}")
|
155
|
+
end
|
107
156
|
|
108
157
|
_cset(:chef_solo_config) {
|
109
158
|
(<<-EOS).gsub(/^\s*/, '')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yyuu-capistrano-chef-solo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-10-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: capistrano
|