-
Notifications
You must be signed in to change notification settings - Fork 9
/
__init__.py
112 lines (87 loc) · 2.85 KB
/
__init__.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
from fabric.api import *
from fabric.contrib import files
from fabric.operations import *
from fabric.state import _AttributeDict
import json
import os
import sys
import tempfile
__version__ = '0.0.1'
DEFAULTS = dict(
path='/var/chef',
cookbooks='cookbooks',
log_level='info',
gems='1.8.10',
recipes=[],
json={},
)
SOLO_RB = """
log_level :%(log_level)s
log_location STDOUT
file_cache_path "%(path)s"
cookbook_path [ "%(path)s/cookbooks" ]
Chef::Log::Formatter.show_time = true
"""
CHEF_DEPENDENCIES = """
libopenid-ruby
liberubis-ruby
libjson-ruby
libextlib-ruby
libstomp-ruby
libohai-ruby
libopenssl-ruby
"""
class ChefDict(_AttributeDict):
def add_recipe(self, recipe):
self.recipes.append(recipe)
def _get_json(self):
json = self['json'].copy()
json['recipes'] = self['recipes']
return json
json = property(fget=_get_json)
chef = ChefDict(DEFAULTS)
def apt():
sudo('apt-get update')
sudo('apt-get -y upgrade')
sudo('apt-get install -y ruby ruby-dev wget %s' % ' '.join(CHEF_DEPENDENCIES.split('\n')))
def gems():
ctx = {
'filename':'%(path)s/rubygems-%(gems)s.tgz' % chef,
'url':'http://production.cf.rubygems.org/rubygems/rubygems-%(gems)s.tgz' % chef,
}
if not files.exists(ctx['filename']):
sudo('wget -O %(filename)s %(url)s' % ctx)
with cd(chef.path):
sudo('tar -xf %(filename)s' % ctx)
with cd(os.path.split(os.path.splitext(ctx['filename'])[0])[1]):
sudo('ruby setup.rb install --no-format-executable --no-rdoc --no-ri')
if not files.exists('/usr/local/bin/chef-solo'):
sudo('gem install chef --no-rdoc --no-ri -n /usr/local/bin')
def upload():
ctx = {
'cookbooks': '%(path)s/cookbooks' % chef,
'node.json': '%(path)s/node.json' % chef,
'solo.rb': '%(path)s/solor.rb' % chef,
}
tmpfolder = tempfile.mkdtemp()
local('mkdir %s/cookbooks && cp -r %s/* %s/cookbooks/' % (tmpfolder, os.path.normpath(chef.cookbooks), tmpfolder))
local('cd %s && tar -f cookbooks.tgz -cz ./cookbooks' % tmpfolder)
put('%s/cookbooks.tgz' % tmpfolder, chef.path, use_sudo=True)
if files.exists(ctx['cookbooks']):
sudo('rm -rf %(cookbooks)s' % ctx)
if files.exists(ctx['node.json']):
sudo('rm -rf %(node.json)s' % ctx)
if files.exists(ctx['solo.rb']):
sudo('rm -rf %(solo.rb)s' % ctx)
with cd(chef.path):
sudo('tar -xf cookbooks.tgz')
files.append(ctx['node.json'], json.dumps(chef.json), use_sudo=True)
files.append(ctx['solo.rb'], SOLO_RB % chef, use_sudo=True)
@task(default=True)
def provision():
sudo('mkdir -p %(path)s' % chef)
apt()
gems()
upload()
with cd(chef.path):
sudo('chef-solo -c solo.rb -j node.json')